Skip to content

Commit

Permalink
create mockgen test for api and store interface
Browse files Browse the repository at this point in the history
  • Loading branch information
morka17 committed Jun 25, 2023
1 parent db36cd2 commit 3f7af0b
Show file tree
Hide file tree
Showing 22 changed files with 1,467 additions and 74 deletions.
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,13 @@ sqlc:
docker run --rm -v $(pwd):/src -w /src kjconroy/sqlc generate
# sqlc generate

mockgenstore:
mockgen -package mockdb -destination src/db/mock/store.go github.com/morka17/shiny_bank/v1/src/db/sqlc Store

server:
go run main.go

test:
go test -v -cover ./...

.PHONY: postgres createdb dropdb
.PHONY: postgres createdb dropdb migrateup migratedown sqlc test server
3 changes: 3 additions & 0 deletions app.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
DB_Driver = "postgres"
DB_Source = "postgresql://root:secret@localhost:5432/shiny_bank?sslmode=disable"
Server_Address =:8080
41 changes: 41 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,53 @@ module github.com/morka17/shiny_bank/v1
go 1.17

require (
github.com/gin-gonic/gin v1.9.1
github.com/lib/pq v1.10.9
github.com/stretchr/testify v1.8.4
)

require (
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
golang.org/x/mod v0.8.0 // indirect
golang.org/x/tools v0.6.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
)

require (
github.com/bytedance/sonic v1.9.1 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/viper v1.16.0
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
554 changes: 554 additions & 0 deletions go.sum

Large diffs are not rendered by default.

37 changes: 37 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package main

import (
"database/sql"
"log"

_ "github.com/lib/pq"
"github.com/morka17/shiny_bank/v1/src/api"
db "github.com/morka17/shiny_bank/v1/src/db/sqlc"
"github.com/morka17/shiny_bank/v1/src/utils"
)




func main() {

config, err := utils.LoadConfig(".")
if err != nil {
log.Fatal("cannot load config:", err)
}

conn, err := sql.Open(config.DBDriver, config.DBSource)
if err != nil {
log.Fatal("cannot connect to db:", err)
}

store := db.NewStore(conn)
server := api.NewServer(store)

err = server.Start(config.ServerAddress)
if err != nil {
log.Fatal("cannot start server:", err)
}

}

2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,4 @@ migrate create -ext sql -dir db/migration -seq init_schema




### Mock Database
26 changes: 13 additions & 13 deletions sqlc.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# version: "1"
# packages:
# - name: "db"
# path: "./src/db/sqlc"
# queries: "./src/db/query/"
# schema: "./src/db/migration/"
# engine: "postgresql"
# emit_prepared_queries: false
# emit_interface: false
# emit_exact_table_names: false
# emit_exported_queries: false
# emit_json_tags: true

version: "1"
packages:
- name: "db"
path: "./src/db/sqlc"
queries: "./src/db/query/"
schema: "./src/db/migration/"
engine: "postgresql"
emit_prepared_queries: false
emit_interface: true
emit_exact_table_names: false
emit_exported_queries: false
emit_json_tags: true
emit_empty_slices: true
141 changes: 141 additions & 0 deletions src/api/account.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
package api

import (
"database/sql"
"net/http"

"github.com/gin-gonic/gin"
db "github.com/morka17/shiny_bank/v1/src/db/sqlc"
)

type createAccountRequest struct {
Owner string `json:"owner" binding:"required"`
Currency string `json:"currency" binding:"required,oneof=USD EUR CAD"`
}

type getAccountRequest struct {
ID int64 `uri:"id" binding:"required,min=1"`
}

type listAccountRequest struct {
PageID int32 `form:"page_id" binding:"required,min=1"`
PageSize int32 `form:"page_size" binding:"required,min=5,max=10"`
}

type updateBalanceRequest struct {
ID int64 `json:"id" binding:required,min=1`
Amount int64 `json:"amount" binding:required`
}

func (server *Server) createAccount(ctx *gin.Context){
var req createAccountRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
ctx.JSON(http.StatusBadRequest, errorResponse(err))
return
}

arg := db.CreateAccountParams{
Owner: req.Owner,
Currency: req.Currency,
Balance: 0,
}

account, err := server.store.CreateAccount(ctx.Request.Context(), arg)
if err != nil {
ctx.JSON(http.StatusInternalServerError, errorResponse(err))
return
}

ctx.JSON(http.StatusCreated, account)
}

func (server *Server) GetAccount(ctx *gin.Context){
var req getAccountRequest
if err := ctx.ShouldBindUri(&req); err != nil {
ctx.JSON(http.StatusBadRequest, errorResponse(err))
return
}

account, err := server.store.GetAccount(ctx.Request.Context(), req.ID)
if err != nil {
if err == sql.ErrNoRows{
ctx.JSON(http.StatusNotFound, errorResponse(err))
return
}
ctx.JSON(http.StatusInternalServerError, errorResponse(err))
return
}


ctx.JSON(http.StatusOK, account)
}

func (server *Server) ListAccount(ctx *gin.Context){
var req listAccountRequest
if err := ctx.ShouldBindQuery(&req); err != nil {
ctx.JSON(http.StatusBadRequest, errorResponse(err))
return
}

arg := db.ListAccountsParams{
Limit: req.PageSize,
Offset: (req.PageID - 1) * req.PageSize,
}

accounts, err := server.store.ListAccounts(ctx.Request.Context(), arg)
if err != nil {
if err == sql.ErrNoRows{
ctx.JSON(http.StatusNotFound, errorResponse(err))
return
}
ctx.JSON(http.StatusInternalServerError, errorResponse(err))
return
}

ctx.JSON(http.StatusOK, accounts)
}

func (server *Server) updateAccount(ctx *gin.Context){
var req updateBalanceRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
ctx.JSON(http.StatusBadRequest, errorResponse(err))
return
}

arg := db.AddAccountBalanceParams{
ID: req.ID,
Amount: req.Amount,
}

accounts, err := server.store.AddAccountBalance(ctx.Request.Context(), arg)
if err != nil {
if err == sql.ErrNoRows{
ctx.JSON(http.StatusNotFound, errorResponse(err))
return
}
ctx.JSON(http.StatusInternalServerError, errorResponse(err))
return
}

ctx.JSON(http.StatusOK, accounts)
}

func (server *Server) DeleteAccount(ctx *gin.Context){
var req getAccountRequest
if err := ctx.ShouldBindUri(&req); err != nil {
ctx.JSON(http.StatusBadRequest, errorResponse(err))
return
}

err := server.store.DeleteAccount(ctx.Request.Context(), req.ID)
if err != nil {
if err == sql.ErrNoRows{
ctx.JSON(http.StatusNotFound, errorResponse(err))
return
}
ctx.JSON(http.StatusInternalServerError, errorResponse(err))
return
}

ctx.JSON(http.StatusOK, "Deleted")
}
Loading

0 comments on commit 3f7af0b

Please sign in to comment.