forked from ebhomengo/niki
feat(niki): add test for add benefactor kind_box_req
This commit is contained in:
parent
748dee60e2
commit
58c48dfccc
|
@ -0,0 +1,7 @@
|
||||||
|
debug: false
|
||||||
|
multi_word_var: "I'm complex in config.yml"
|
||||||
|
db:
|
||||||
|
host: "localhost"
|
||||||
|
username: "ali"
|
||||||
|
password: "passwd"
|
||||||
|
multi_word_nested_var: "WHAT??"
|
|
@ -1,28 +1,36 @@
|
||||||
package benefactorkindboxreqhandler
|
package benefactorkindboxreqhandler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
||||||
"git.gocasts.ir/ebhomengo/niki/pkg/claim"
|
"git.gocasts.ir/ebhomengo/niki/pkg/claim"
|
||||||
|
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
|
||||||
httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
|
httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
|
||||||
echo "github.com/labstack/echo/v4"
|
echo "github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h Handler) Add(c echo.Context) error {
|
func (h Handler) Add(c echo.Context) error {
|
||||||
req := param.KindBoxReqAddRequest{}
|
req := param.KindBoxReqAddRequest{}
|
||||||
if bErr := c.Bind(&req); bErr != nil {
|
if err := c.Bind(&req); err != nil {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest)
|
fmt.Println("err", err, req)
|
||||||
|
|
||||||
|
return c.JSON(http.StatusBadRequest, echo.Map{
|
||||||
|
"message": errmsg.ErrBadRequest,
|
||||||
|
})
|
||||||
|
// TODO: return echo.NewHTTPError(http.StatusBadRequest, errmsg.ErrBadRequest) ؟؟؟
|
||||||
}
|
}
|
||||||
claims := claim.GetClaimsFromEchoContext(c)
|
claims := claim.GetClaimsFromEchoContext(c)
|
||||||
req.BenefactorID = claims.UserID
|
req.BenefactorID = claims.UserID
|
||||||
|
|
||||||
if fieldErrors, err := h.benefactorKindBoxReqVld.ValidateAddRequest(req); err != nil {
|
result := h.benefactorKindBoxReqVld.ValidateAddRequest(req)
|
||||||
msg, code := httpmsg.Error(err)
|
if result != nil {
|
||||||
|
msg, code := httpmsg.Error(result.Err)
|
||||||
|
|
||||||
return c.JSON(code, echo.Map{
|
return c.JSON(code, echo.Map{
|
||||||
"message": msg,
|
"message": msg,
|
||||||
"errors": fieldErrors,
|
"errors": result.Fields,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
resp, sErr := h.benefactorKindBoxReqSvc.Add(c.Request().Context(), req)
|
resp, sErr := h.benefactorKindBoxReqSvc.Add(c.Request().Context(), req)
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
package benefactorkindboxreqhandler_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/delivery/http_server/middleware"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/param/benefactor/address"
|
||||||
|
benefactoreparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/benefactore"
|
||||||
|
benefactorkindboxreqparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
||||||
|
testutils "git.gocasts.ir/ebhomengo/niki/test"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/test/seed"
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAdd(t *testing.T) {
|
||||||
|
testutils.SetupEnd2EndTest(t)
|
||||||
|
respSendOTP := testutils.SendOTP(t)
|
||||||
|
|
||||||
|
loginOrRegisterRequest := benefactoreparam.LoginOrRegisterRequest{
|
||||||
|
PhoneNumber: respSendOTP.PhoneNumber,
|
||||||
|
VerificationCode: respSendOTP.Code,
|
||||||
|
}
|
||||||
|
benefactor, cleanupBenefactor := testutils.CreateBenefactorWithSvc(t, loginOrRegisterRequest)
|
||||||
|
defer cleanupBenefactor()
|
||||||
|
benefactorAddAddressRequest := addressparam.BenefactorAddAddressRequest{
|
||||||
|
PostalCode: gofakeit.Address().Zip,
|
||||||
|
Address: gofakeit.Address().Address,
|
||||||
|
Lat: float32(gofakeit.Address().Latitude),
|
||||||
|
Lon: float32(gofakeit.Address().Longitude),
|
||||||
|
CityID: gofakeit.UintRange(1, 100),
|
||||||
|
ProvinceID: gofakeit.UintRange(1, 31),
|
||||||
|
BenefactorID: benefactor.BenefactorInfo.ID,
|
||||||
|
}
|
||||||
|
address, cleanupAddress := testutils.CreateAddressWithSvc(t, benefactorAddAddressRequest)
|
||||||
|
defer cleanupAddress()
|
||||||
|
kindboxreqResponse, _ := json.Marshal(entity.KindBoxReq{
|
||||||
|
ID: 1,
|
||||||
|
KindBoxType: entity.KindBoxCylindrical,
|
||||||
|
CountRequested: gofakeit.UintRange(1, 100),
|
||||||
|
CountAccepted: 0,
|
||||||
|
BenefactorID: benefactor.BenefactorInfo.ID,
|
||||||
|
Status: entity.KindBoxReqPendingStatus,
|
||||||
|
Description: "",
|
||||||
|
ReferDate: time.Time{},
|
||||||
|
AddressID: address.Address.ID,
|
||||||
|
})
|
||||||
|
|
||||||
|
type testCase struct {
|
||||||
|
name string
|
||||||
|
requestBody interface{}
|
||||||
|
expectedStatus int
|
||||||
|
expectedBody string
|
||||||
|
err bool
|
||||||
|
token string
|
||||||
|
}
|
||||||
|
|
||||||
|
testCases := []testCase{
|
||||||
|
{
|
||||||
|
name: "invalid payload",
|
||||||
|
requestBody: `invalid payload`,
|
||||||
|
expectedStatus: http.StatusBadRequest,
|
||||||
|
expectedBody: `{"message": "Bad request"}`,
|
||||||
|
err: true,
|
||||||
|
token: "Bearer " + benefactor.Tokens.AccessToken,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid or expired jwt",
|
||||||
|
requestBody: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
TypeID: 1,
|
||||||
|
AddressID: address.Address.ID,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
CountRequested: 1,
|
||||||
|
},
|
||||||
|
token: "Bearer 12" + benefactor.Tokens.AccessToken,
|
||||||
|
expectedStatus: http.StatusUnauthorized,
|
||||||
|
err: true,
|
||||||
|
expectedBody: `{"message":"invalid or expired jwt"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Validation Failed",
|
||||||
|
requestBody: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: address.Address.ID,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
CountRequested: 2,
|
||||||
|
},
|
||||||
|
err: true,
|
||||||
|
token: "Bearer " + benefactor.Tokens.AccessToken,
|
||||||
|
expectedStatus: http.StatusUnprocessableEntity,
|
||||||
|
expectedBody: `{
|
||||||
|
"errors":{
|
||||||
|
"type_id":"cannot be blank"
|
||||||
|
},
|
||||||
|
"message":"invalid input"
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Added successfully",
|
||||||
|
requestBody: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
TypeID: 2,
|
||||||
|
AddressID: address.Address.ID,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
CountRequested: 2,
|
||||||
|
},
|
||||||
|
token: "Bearer " + benefactor.Tokens.AccessToken,
|
||||||
|
expectedStatus: http.StatusCreated,
|
||||||
|
expectedBody: string(kindboxreqResponse),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
e := echo.New()
|
||||||
|
r := e.Group("/benefactor/kindboxreqs")
|
||||||
|
|
||||||
|
r.POST("/", testutils.BenefactorkindBoxReqHandler.Add, middleware.Auth(testutils.AuthSvc, testutils.AuthConfig),
|
||||||
|
middleware.BenefactorAuthorization(entity.UserBenefactorRole))
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
requestBody, _ := json.Marshal(tc.requestBody)
|
||||||
|
req := httptest.NewRequest(http.MethodPost, "/benefactor/kindboxreqs/", bytes.NewBuffer(requestBody))
|
||||||
|
|
||||||
|
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
||||||
|
req.Header.Set(echo.HeaderAuthorization, tc.token)
|
||||||
|
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
|
||||||
|
e.ServeHTTP(rec, req)
|
||||||
|
|
||||||
|
// Assertion
|
||||||
|
assert.Equal(t, tc.expectedStatus, rec.Code)
|
||||||
|
|
||||||
|
if tc.err {
|
||||||
|
assert.JSONEq(t, tc.expectedBody, rec.Body.String())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
response := &benefactorkindboxreqparam.KindBoxReqAddResponse{}
|
||||||
|
err := json.Unmarshal(
|
||||||
|
rec.Body.Bytes(),
|
||||||
|
response,
|
||||||
|
)
|
||||||
|
assert.Nil(t, err, "error in deserializing the request")
|
||||||
|
seed.DeleteBenefactor(t, testutils.MysqlRepo, response.KindBoxReq.ID)
|
||||||
|
assert.NotEmpty(t, response.KindBoxReq)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
version: '3.9'
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysqltest:
|
||||||
|
image: mysql:8.0
|
||||||
|
ports:
|
||||||
|
- "3305:3306"
|
||||||
|
container_name: niki-database-test
|
||||||
|
volumes:
|
||||||
|
- dbdatatest:/var/lib/mysql
|
||||||
|
restart: always
|
||||||
|
command: [ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: 123456
|
||||||
|
MYSQL_DATABASE: test_db
|
||||||
|
MYSQL_USER: testuser
|
||||||
|
MYSQL_PASSWORD: test1234
|
||||||
|
|
||||||
|
niki-redis-test:
|
||||||
|
image: bitnami/redis:6.2
|
||||||
|
container_name: niki-redis-test
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- '6381:6379'
|
||||||
|
# TODO - remove `--save "" --appendonly no` from command to persist data
|
||||||
|
command: redis-server --loglevel warning --protected-mode no --save "" --appendonly no
|
||||||
|
environment:
|
||||||
|
- ALLOW_EMPTY_PASSWORD=yes
|
||||||
|
volumes:
|
||||||
|
- niki-redis-data-test:/data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
dbdatatest:
|
||||||
|
niki-redis-data-test:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# docker-compose -f docker-compose.dev.yaml up -d
|
|
@ -1,37 +0,0 @@
|
||||||
version: '3.9'
|
|
||||||
|
|
||||||
services:
|
|
||||||
mysql:
|
|
||||||
platform: linux/amd64
|
|
||||||
image: mysql:8.0
|
|
||||||
ports:
|
|
||||||
- 3305:3305
|
|
||||||
volumes:
|
|
||||||
- ~/apps/mysql:/var/lib/mysql
|
|
||||||
restart: always
|
|
||||||
hostname: mysql
|
|
||||||
container_name: niki_mysql
|
|
||||||
environment:
|
|
||||||
- MYSQL_ROOT_PASSWORD=root
|
|
||||||
- MYSQL_USER=niki_user
|
|
||||||
- MYSQL_PASSWORD=NIKI_user@123
|
|
||||||
- MYSQL_DATABASE=niki_db
|
|
||||||
|
|
||||||
niki-redis:
|
|
||||||
image: bitnami/redis:6.2
|
|
||||||
container_name: niki-redis
|
|
||||||
restart: always
|
|
||||||
ports:
|
|
||||||
- '6380:6379'
|
|
||||||
# TODO - remove `--save "" --appendonly no` from command to persist data
|
|
||||||
command: redis-server --loglevel warning --protected-mode no --save "" --appendonly no
|
|
||||||
environment:
|
|
||||||
- ALLOW_EMPTY_PASSWORD=yes
|
|
||||||
volumes:
|
|
||||||
- niki-redis-data:/data
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
dbdata:
|
|
||||||
niki-redis-data:
|
|
4
go.mod
4
go.mod
|
@ -3,6 +3,7 @@ module git.gocasts.ir/ebhomengo/niki
|
||||||
go 1.21.3
|
go 1.21.3
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/brianvoe/gofakeit/v6 v6.28.0
|
||||||
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible
|
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible
|
||||||
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
|
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
|
||||||
github.com/go-sql-driver/mysql v1.6.0
|
github.com/go-sql-driver/mysql v1.6.0
|
||||||
|
@ -14,6 +15,7 @@ require (
|
||||||
github.com/oklog/ulid/v2 v2.1.0
|
github.com/oklog/ulid/v2 v2.1.0
|
||||||
github.com/redis/go-redis/v9 v9.4.0
|
github.com/redis/go-redis/v9 v9.4.0
|
||||||
github.com/rubenv/sql-migrate v1.6.0
|
github.com/rubenv/sql-migrate v1.6.0
|
||||||
|
github.com/stretchr/testify v1.8.4
|
||||||
golang.org/x/crypto v0.17.0
|
golang.org/x/crypto v0.17.0
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
)
|
)
|
||||||
|
@ -21,6 +23,7 @@ require (
|
||||||
require (
|
require (
|
||||||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect
|
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
github.com/fatih/structs v1.1.0 // indirect
|
github.com/fatih/structs v1.1.0 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||||
|
@ -33,6 +36,7 @@ require (
|
||||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
github.com/valyala/fasttemplate v1.2.2 // indirect
|
github.com/valyala/fasttemplate v1.2.2 // indirect
|
||||||
golang.org/x/net v0.19.0 // indirect
|
golang.org/x/net v0.19.0 // indirect
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -27,6 +27,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
|
github.com/brianvoe/gofakeit/v6 v6.28.0 h1:Xib46XXuQfmlLS2EXRuJpqcw8St6qSZz75OUo0tgAW4=
|
||||||
|
github.com/brianvoe/gofakeit/v6 v6.28.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs=
|
||||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||||
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
||||||
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"git.gocasts.ir/ebhomengo/niki/adapter/redis"
|
"git.gocasts.ir/ebhomengo/niki/adapter/redis"
|
||||||
"git.gocasts.ir/ebhomengo/niki/config"
|
"git.gocasts.ir/ebhomengo/niki/config"
|
||||||
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
|
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
|
||||||
mysqlkindboxreq "git.gocasts.ir/ebhomengo/niki/repository/mysql/kind_box_req"
|
|
||||||
adminvalidator "git.gocasts.ir/ebhomengo/niki/validator/admin/admin"
|
adminvalidator "git.gocasts.ir/ebhomengo/niki/validator/admin/admin"
|
||||||
adminkindboxreqvalidator "git.gocasts.ir/ebhomengo/niki/validator/admin/kind_box_req"
|
adminkindboxreqvalidator "git.gocasts.ir/ebhomengo/niki/validator/admin/kind_box_req"
|
||||||
benefactoraddressvalidator "git.gocasts.ir/ebhomengo/niki/validator/benefactor/address"
|
benefactoraddressvalidator "git.gocasts.ir/ebhomengo/niki/validator/benefactor/address"
|
||||||
|
@ -34,7 +33,6 @@ func InitBenefactorValidator() benefactorvalidator.Validator {
|
||||||
|
|
||||||
func InitBenefactorKindBoxReqValidator(cfg config.Config, redisAdapter redis.Adapter, db *mysql.DB) benefactorkindboxreqvalidator.Validator {
|
func InitBenefactorKindBoxReqValidator(cfg config.Config, redisAdapter redis.Adapter, db *mysql.DB) benefactorkindboxreqvalidator.Validator {
|
||||||
return benefactorkindboxreqvalidator.New(
|
return benefactorkindboxreqvalidator.New(
|
||||||
mysqlkindboxreq.New(db),
|
|
||||||
InitBenefactorService(cfg, redisAdapter, db),
|
InitBenefactorService(cfg, redisAdapter, db),
|
||||||
InitBenefactorAddressService(db),
|
InitBenefactorAddressService(db),
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package benefactorkindboxreqparam
|
package benefactorkindboxreqparam
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
entity "git.gocasts.ir/ebhomengo/niki/entity"
|
entity "git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -8,7 +10,7 @@ type KindBoxReqAddRequest struct {
|
||||||
BenefactorID uint `json:"benefactor_id"`
|
BenefactorID uint `json:"benefactor_id"`
|
||||||
TypeID entity.KindBoxType `json:"type_id"`
|
TypeID entity.KindBoxType `json:"type_id"`
|
||||||
AddressID uint `json:"address_id"`
|
AddressID uint `json:"address_id"`
|
||||||
ReferDate string `json:"refer_date"`
|
ReferDate time.Time `json:"refer_date"`
|
||||||
CountRequested uint `json:"count_requested"`
|
CountRequested uint `json:"count_requested"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ const (
|
||||||
ErrorMsgOtpCodeIsNotValid = "verification code is not valid"
|
ErrorMsgOtpCodeIsNotValid = "verification code is not valid"
|
||||||
ErrorMsgCantScanQueryResult = "can't scan query result"
|
ErrorMsgCantScanQueryResult = "can't scan query result"
|
||||||
ErrorMsgPhoneNumberOrPassIsIncorrect = "phone number or password is incorrect"
|
ErrorMsgPhoneNumberOrPassIsIncorrect = "phone number or password is incorrect"
|
||||||
|
ErrBadRequest = "Bad request"
|
||||||
ErrorMsgAcceptKindBoxReqStatus = "only pending requests will have the ability to be confirmed"
|
ErrorMsgAcceptKindBoxReqStatus = "only pending requests will have the ability to be confirmed"
|
||||||
ErrorMsgRejectKindBoxReqStatus = "only pending requests will have the ability to be rejected"
|
ErrorMsgRejectKindBoxReqStatus = "only pending requests will have the ability to be rejected"
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
package mysqlkindboxreq_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
|
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
|
||||||
|
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
||||||
|
mysqlkindboxreq "git.gocasts.ir/ebhomengo/niki/repository/mysql/kind_box_req"
|
||||||
|
testutils "git.gocasts.ir/ebhomengo/niki/test"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/test/seed"
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAddKindBoxReq(t *testing.T) {
|
||||||
|
mysqlRepo := testutils.Setup(t)
|
||||||
|
mysqlKindboxReq := mysqlkindboxreq.New(mysqlRepo)
|
||||||
|
|
||||||
|
benefactor, cleanupBenefactor := seed.CreateBenefactor(t, mysqlRepo)
|
||||||
|
defer cleanupBenefactor()
|
||||||
|
address, cleanupAddress := seed.CreateAddress(t, mysqlRepo, benefactor.ID)
|
||||||
|
defer cleanupAddress()
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
repoErr bool
|
||||||
|
expectedErr error
|
||||||
|
kindBoxReq entity.KindBoxReq
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "repo fails",
|
||||||
|
repoErr: true,
|
||||||
|
expectedErr: richerror.New("mysqlkindboxreq.AddKindBoxReq").WithMessage(errmsg.ErrorMsgNotFound).WithKind(richerror.KindUnexpected),
|
||||||
|
kindBoxReq: entity.KindBoxReq{
|
||||||
|
KindBoxType: entity.KindBoxStandUp,
|
||||||
|
AddressID: address.ID,
|
||||||
|
CountRequested: gofakeit.UintRange(1, 100),
|
||||||
|
ReferDate: gofakeit.Date(),
|
||||||
|
Status: entity.KindBoxReqPendingStatus,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ordinary",
|
||||||
|
kindBoxReq: entity.KindBoxReq{
|
||||||
|
BenefactorID: benefactor.ID,
|
||||||
|
KindBoxType: entity.KindBoxStandUp,
|
||||||
|
AddressID: address.ID,
|
||||||
|
CountRequested: gofakeit.UintRange(1, 100),
|
||||||
|
ReferDate: gofakeit.Date(),
|
||||||
|
Status: entity.KindBoxReqPendingStatus,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
kindBoxReq, err := mysqlKindboxReq.AddKindBoxReq(ctx, tc.kindBoxReq)
|
||||||
|
|
||||||
|
if tc.expectedErr != nil {
|
||||||
|
assert.Equal(t, tc.expectedErr.Error(), err.Error())
|
||||||
|
assert.Empty(t, kindBoxReq)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotEmpty(t, kindBoxReq)
|
||||||
|
seed.DeleteBenefactor(t, mysqlRepo, kindBoxReq.ID)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,6 @@ package benefactorkindboxreqservice
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
|
||||||
|
|
||||||
entity "git.gocasts.ir/ebhomengo/niki/entity"
|
entity "git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
||||||
|
@ -11,15 +10,11 @@ import (
|
||||||
|
|
||||||
func (s Service) Add(ctx context.Context, req param.KindBoxReqAddRequest) (param.KindBoxReqAddResponse, error) {
|
func (s Service) Add(ctx context.Context, req param.KindBoxReqAddRequest) (param.KindBoxReqAddResponse, error) {
|
||||||
const op = "userkindboxreqservice.Add"
|
const op = "userkindboxreqservice.Add"
|
||||||
t, tErr := time.Parse(time.DateTime, req.ReferDate)
|
|
||||||
if tErr != nil {
|
|
||||||
return param.KindBoxReqAddResponse{}, richerror.New(op).WithErr(tErr).WithKind(richerror.KindInvalid)
|
|
||||||
}
|
|
||||||
kindBoxReq, err := s.repo.AddKindBoxReq(ctx, entity.KindBoxReq{
|
kindBoxReq, err := s.repo.AddKindBoxReq(ctx, entity.KindBoxReq{
|
||||||
BenefactorID: req.BenefactorID,
|
BenefactorID: req.BenefactorID,
|
||||||
KindBoxType: req.TypeID,
|
KindBoxType: req.TypeID,
|
||||||
AddressID: req.AddressID,
|
AddressID: req.AddressID,
|
||||||
ReferDate: t,
|
ReferDate: req.ReferDate,
|
||||||
CountRequested: req.CountRequested,
|
CountRequested: req.CountRequested,
|
||||||
Status: entity.KindBoxReqPendingStatus,
|
Status: entity.KindBoxReqPendingStatus,
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
package benefactorkindboxreqservice_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
benefactorkindboxreqparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
||||||
|
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
|
||||||
|
benefactorkindboxreqservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/kind_box_req"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/test/mock"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAdd(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
repoErr bool
|
||||||
|
expectedErr error
|
||||||
|
req benefactorkindboxreqparam.KindBoxReqAddRequest
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "repo fails",
|
||||||
|
repoErr: true,
|
||||||
|
expectedErr: richerror.New("userkindboxreqservice.Add").WithErr(fmt.Errorf(benefactorkindboxreqmock.RepoErr)).WithKind(richerror.KindUnexpected),
|
||||||
|
req: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
BenefactorID: 1,
|
||||||
|
AddressID: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
CountRequested: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ordinary",
|
||||||
|
req: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
BenefactorID: 1,
|
||||||
|
AddressID: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
CountRequested: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
repo := benefactorkindboxreqmock.NewMockRepository(tc.repoErr)
|
||||||
|
svc := benefactorkindboxreqservice.New(repo)
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
kindBoxreq, err := svc.Add(ctx, tc.req)
|
||||||
|
|
||||||
|
if tc.expectedErr != nil {
|
||||||
|
assert.Equal(t, tc.expectedErr.Error(), err.Error())
|
||||||
|
assert.Empty(t, kindBoxreq)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotEmpty(t, kindBoxreq)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package testutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/repository/migrator"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
|
|
||||||
|
var once = sync.Once{}
|
||||||
|
|
||||||
|
const port = 3305
|
||||||
|
|
||||||
|
func MySQLTestConfig() mysql.Config {
|
||||||
|
return mysql.Config{
|
||||||
|
Username: "testuser",
|
||||||
|
Password: "test1234",
|
||||||
|
Port: port,
|
||||||
|
Host: "localhost",
|
||||||
|
DBName: "test_db",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Setup(t *testing.T) *mysql.DB {
|
||||||
|
t.Helper()
|
||||||
|
// connect to mysql database
|
||||||
|
config := MySQLTestConfig()
|
||||||
|
once.Do(func() {
|
||||||
|
mgr := migrator.New(config)
|
||||||
|
mgr.Up()
|
||||||
|
})
|
||||||
|
mysqlRepo := mysql.New(config)
|
||||||
|
|
||||||
|
return mysqlRepo
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
package testutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
smsprovider "git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar"
|
||||||
|
kavenegarotp "git.gocasts.ir/ebhomengo/niki/adapter/sms_provider/kavenegar/otp"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/config"
|
||||||
|
benefactorkindboxreqhandler "git.gocasts.ir/ebhomengo/niki/delivery/http_server/benefactor/kind_box_req"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/internal/initial"
|
||||||
|
addressparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/address"
|
||||||
|
benefactoreparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/benefactore"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
|
||||||
|
mysqladdress "git.gocasts.ir/ebhomengo/niki/repository/mysql/address"
|
||||||
|
mysqlbenefactor "git.gocasts.ir/ebhomengo/niki/repository/mysql/benefactor"
|
||||||
|
mysqlkindboxreq "git.gocasts.ir/ebhomengo/niki/repository/mysql/kind_box_req"
|
||||||
|
redisotp "git.gocasts.ir/ebhomengo/niki/repository/redis/redis_otp"
|
||||||
|
authservice "git.gocasts.ir/ebhomengo/niki/service/auth"
|
||||||
|
benefactoraddressservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/address"
|
||||||
|
benefactorservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/benefactor"
|
||||||
|
benefactorkindboxreqservice "git.gocasts.ir/ebhomengo/niki/service/benefactor/kind_box_req"
|
||||||
|
benefactorkindboxreqvalidator "git.gocasts.ir/ebhomengo/niki/validator/benefactor/kind_box_req"
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
benefactorSvc benefactorservice.Service
|
||||||
|
benefactorAddressSvc benefactoraddressservice.Service
|
||||||
|
BenefactorkindBoxReqHandler benefactorkindboxreqhandler.Handler
|
||||||
|
AuthSvc authservice.Service
|
||||||
|
MysqlRepo *mysql.DB
|
||||||
|
AuthConfig authservice.Config
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetupEnd2EndTest(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
cfg := config.C()
|
||||||
|
|
||||||
|
MysqlRepo = Setup(t)
|
||||||
|
redisAdapter := SetupRedis(t)
|
||||||
|
|
||||||
|
AuthSvc = initial.InitBenefactorAuthService(cfg)
|
||||||
|
|
||||||
|
RedisOtp := redisotp.New(redisAdapter)
|
||||||
|
benefactorMysql := mysqlbenefactor.New(MysqlRepo)
|
||||||
|
kavenegarSmsProvider := smsprovider.New(cfg.KavenegarSmsProvider)
|
||||||
|
otpSmsProvider := kavenegarotp.New(kavenegarSmsProvider)
|
||||||
|
benefactorSvc = benefactorservice.New(cfg.BenefactorSvc, RedisOtp, otpSmsProvider, AuthSvc, benefactorMysql)
|
||||||
|
benefactorAddressMysql := mysqladdress.New(MysqlRepo)
|
||||||
|
benefactorAddressSvc = benefactoraddressservice.New(benefactorAddressMysql)
|
||||||
|
benefactorKindBoxReqMysql := mysqlkindboxreq.New(MysqlRepo)
|
||||||
|
benefactorKindBoxReqSvc := benefactorkindboxreqservice.New(benefactorKindBoxReqMysql)
|
||||||
|
benefactorKindBoxReqVld := benefactorkindboxreqvalidator.New(benefactorSvc, benefactorAddressSvc)
|
||||||
|
|
||||||
|
BenefactorkindBoxReqHandler = benefactorkindboxreqhandler.New(cfg.Auth, AuthSvc, benefactorKindBoxReqSvc, benefactorKindBoxReqVld)
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendOTP(t *testing.T) benefactoreparam.SendOtpResponse {
|
||||||
|
t.Helper()
|
||||||
|
req := benefactoreparam.SendOtpRequest{PhoneNumber: gofakeit.Phone()}
|
||||||
|
ctx := context.Background()
|
||||||
|
resp, err := benefactorSvc.SendOtp(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Logf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
func CreateBenefactorWithSvc(t *testing.T, req benefactoreparam.LoginOrRegisterRequest) (benefactoreparam.LoginOrRegisterResponse, func()) {
|
||||||
|
t.Helper()
|
||||||
|
ctx := context.Background()
|
||||||
|
resp, err := benefactorSvc.LoginOrRegister(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Logf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, func() {
|
||||||
|
_, err := MysqlRepo.Conn().ExecContext(ctx, `delete from benefactors where id=?`,
|
||||||
|
resp.BenefactorInfo.ID)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
func CreateAddressWithSvc(t *testing.T, req addressparam.BenefactorAddAddressRequest) (addressparam.BenefactorAddAddressResponse, func()) {
|
||||||
|
t.Helper()
|
||||||
|
ctx := context.Background()
|
||||||
|
resp, err := benefactorAddressSvc.Add(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
t.Logf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, func() {
|
||||||
|
_, err := MysqlRepo.Conn().ExecContext(ctx, `delete from addresses where id=?`,
|
||||||
|
resp.Address.ID)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package benefactorkindboxreqmock
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
|
)
|
||||||
|
|
||||||
|
const RepoErr = "repository error"
|
||||||
|
|
||||||
|
type DefaultKindBoxReqTest struct {
|
||||||
|
BenefactorID uint
|
||||||
|
TypeID entity.KindBoxType
|
||||||
|
AddressID uint
|
||||||
|
ReferDate time.Time
|
||||||
|
CountRequested uint
|
||||||
|
}
|
||||||
|
|
||||||
|
func DefaultKindBoxReq() DefaultKindBoxReqTest {
|
||||||
|
return DefaultKindBoxReqTest{
|
||||||
|
BenefactorID: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
AddressID: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
CountRequested: 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type MockRepository struct {
|
||||||
|
kindBoxReqs []entity.KindBoxReq
|
||||||
|
hasErr bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMockRepository(hasErr bool) *MockRepository {
|
||||||
|
var kindBoxReqs []entity.KindBoxReq
|
||||||
|
DefaultKindBoxReq := DefaultKindBoxReq()
|
||||||
|
|
||||||
|
kindBoxReqs = append(kindBoxReqs, entity.KindBoxReq{
|
||||||
|
BenefactorID: DefaultKindBoxReq.BenefactorID,
|
||||||
|
AddressID: DefaultKindBoxReq.AddressID,
|
||||||
|
KindBoxType: DefaultKindBoxReq.TypeID,
|
||||||
|
ReferDate: DefaultKindBoxReq.ReferDate,
|
||||||
|
CountRequested: DefaultKindBoxReq.CountRequested,
|
||||||
|
Status: entity.KindBoxReqPendingStatus,
|
||||||
|
})
|
||||||
|
|
||||||
|
return &MockRepository{
|
||||||
|
kindBoxReqs: kindBoxReqs,
|
||||||
|
hasErr: hasErr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
func (m *MockRepository) AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (entity.KindBoxReq, error) {
|
||||||
|
if m.hasErr {
|
||||||
|
return entity.KindBoxReq{}, fmt.Errorf(RepoErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
kindBoxReq.ID = 1
|
||||||
|
m.kindBoxReqs = append(m.kindBoxReqs, kindBoxReq)
|
||||||
|
|
||||||
|
return kindBoxReq, nil
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package testutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/adapter/redis"
|
||||||
|
)
|
||||||
|
|
||||||
|
const portRedis = 6381
|
||||||
|
|
||||||
|
func RedisTestConfig() redis.Config {
|
||||||
|
return redis.Config{
|
||||||
|
Host: "localhost",
|
||||||
|
Port: portRedis,
|
||||||
|
Password: "",
|
||||||
|
DB: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupRedis(t *testing.T) redis.Adapter {
|
||||||
|
t.Helper()
|
||||||
|
config := RedisTestConfig()
|
||||||
|
redisAdapter := redis.New(config)
|
||||||
|
|
||||||
|
return redisAdapter
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
package seed
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
func CreateBenefactor(t *testing.T, db *mysql.DB) (*entity.Benefactor, func()) {
|
||||||
|
t.Helper()
|
||||||
|
benefactor := &entity.Benefactor{
|
||||||
|
FirstName: gofakeit.FirstName(),
|
||||||
|
LastName: gofakeit.LastName(),
|
||||||
|
PhoneNumber: gofakeit.Phone(),
|
||||||
|
Address: gofakeit.Address().Address,
|
||||||
|
Description: "",
|
||||||
|
Email: gofakeit.Email(),
|
||||||
|
City: gofakeit.City(),
|
||||||
|
Gender: 0,
|
||||||
|
Status: entity.BenefactorActiveStatus,
|
||||||
|
Birthdate: time.Time{},
|
||||||
|
Role: entity.UserBenefactorRole,
|
||||||
|
}
|
||||||
|
ctx := context.Background()
|
||||||
|
res, err := db.Conn().ExecContext(ctx, `insert into benefactors(phone_number, status, role) values(?, ?, ?)`,
|
||||||
|
benefactor.PhoneNumber, benefactor.Status.String(), benefactor.Role.String())
|
||||||
|
assert.Nil(t, err)
|
||||||
|
//nolint
|
||||||
|
id, _ := res.LastInsertId()
|
||||||
|
benefactor.ID = uint(id)
|
||||||
|
|
||||||
|
return benefactor, func() {
|
||||||
|
_, err := db.Conn().ExecContext(ctx, `delete from benefactors where id=?`,
|
||||||
|
id)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint
|
||||||
|
func CreateAddress(t *testing.T, db *mysql.DB, benfactorID uint) (*entity.Address, func()) {
|
||||||
|
t.Helper()
|
||||||
|
address := &entity.Address{
|
||||||
|
PostalCode: gofakeit.Address().Zip,
|
||||||
|
Address: gofakeit.Address().Address,
|
||||||
|
Lat: float32(gofakeit.Address().Latitude),
|
||||||
|
Lon: float32(gofakeit.Address().Longitude),
|
||||||
|
//nolint
|
||||||
|
CityID: 1,
|
||||||
|
//nolint
|
||||||
|
ProvinceID: 15,
|
||||||
|
BenefactorID: benfactorID,
|
||||||
|
}
|
||||||
|
ctx := context.Background()
|
||||||
|
res, err := db.Conn().ExecContext(ctx, `insert into addresses(postal_code, address, lat, lon,province_id,city_id,benefactor_id) values(?, ?, ?,?,?,?,?)`,
|
||||||
|
address.PostalCode, address.Address, address.Lat, address.Lon, address.ProvinceID, address.CityID, address.BenefactorID)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
//nolint
|
||||||
|
// error is always nil
|
||||||
|
id, _ := res.LastInsertId()
|
||||||
|
address.ID = uint(id)
|
||||||
|
|
||||||
|
return address, func() {
|
||||||
|
_, err := db.Conn().ExecContext(ctx, `delete from addresses where id=?`,
|
||||||
|
id)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteBenefactor(t *testing.T, db *mysql.DB, kindBoxReqID uint) {
|
||||||
|
t.Helper()
|
||||||
|
_, mErr := db.Conn().Exec(`delete from kind_box_reqs where id=?`, kindBoxReqID)
|
||||||
|
assert.Nil(t, mErr)
|
||||||
|
}
|
|
@ -2,7 +2,6 @@ package benefactorkindboxreqvalidator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
|
||||||
|
|
||||||
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
||||||
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
|
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
|
||||||
|
@ -10,7 +9,7 @@ import (
|
||||||
validation "github.com/go-ozzo/ozzo-validation/v4"
|
validation "github.com/go-ozzo/ozzo-validation/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (v Validator) ValidateAddRequest(req param.KindBoxReqAddRequest) (map[string]string, error) {
|
func (v Validator) ValidateAddRequest(req param.KindBoxReqAddRequest) *ValidatorError {
|
||||||
const op = "userkindboxreqvalidator.ValidateAddRequest"
|
const op = "userkindboxreqvalidator.ValidateAddRequest"
|
||||||
|
|
||||||
if err := validation.ValidateStruct(&req,
|
if err := validation.ValidateStruct(&req,
|
||||||
|
@ -31,7 +30,6 @@ func (v Validator) ValidateAddRequest(req param.KindBoxReqAddRequest) (map[strin
|
||||||
|
|
||||||
validation.Field(&req.ReferDate,
|
validation.Field(&req.ReferDate,
|
||||||
validation.Required,
|
validation.Required,
|
||||||
validation.Date(time.DateTime),
|
|
||||||
),
|
),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
|
|
||||||
|
@ -46,12 +44,16 @@ func (v Validator) ValidateAddRequest(req param.KindBoxReqAddRequest) (map[strin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return fieldErrors, richerror.New(op).
|
return &ValidatorError{
|
||||||
WithMessage(errmsg.ErrorMsgInvalidInput).
|
Fields: fieldErrors,
|
||||||
WithKind(richerror.KindInvalid).
|
Err: richerror.New(op).
|
||||||
WithMeta(map[string]interface{}{"req": req}).
|
WithMessage(errmsg.ErrorMsgInvalidInput).
|
||||||
WithErr(err)
|
WithKind(richerror.KindInvalid).
|
||||||
|
WithMeta(map[string]interface{}{"req": req}).
|
||||||
|
WithErr(err),
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return map[string]string{}, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,214 @@
|
||||||
|
package benefactorkindboxreqvalidator_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.gocasts.ir/ebhomengo/niki/entity"
|
||||||
|
addressparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/address"
|
||||||
|
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/benefactore"
|
||||||
|
benefactorkindboxreqparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
|
||||||
|
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
|
||||||
|
benefactorkindboxreqvalidator "git.gocasts.ir/ebhomengo/niki/validator/benefactor/kind_box_req"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
const RepoErr = "repository error"
|
||||||
|
|
||||||
|
type StubService struct {
|
||||||
|
addresses []entity.Address
|
||||||
|
benefactors []entity.Benefactor
|
||||||
|
haveError bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMock(haveError bool) *StubService {
|
||||||
|
var addresses []entity.Address
|
||||||
|
var benefactors []entity.Benefactor
|
||||||
|
|
||||||
|
addresses = append(addresses, entity.Address{
|
||||||
|
ID: 1,
|
||||||
|
PostalCode: "123456789",
|
||||||
|
Address: "tehran",
|
||||||
|
Lat: 25.25,
|
||||||
|
Lon: 25.26,
|
||||||
|
CityID: 1,
|
||||||
|
ProvinceID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
})
|
||||||
|
benefactors = append(benefactors, entity.Benefactor{
|
||||||
|
ID: 1,
|
||||||
|
FirstName: "mehdi",
|
||||||
|
LastName: "rez",
|
||||||
|
PhoneNumber: "09191234556",
|
||||||
|
Address: "tehran",
|
||||||
|
Description: "",
|
||||||
|
Email: "example@gmail.com",
|
||||||
|
City: "teran",
|
||||||
|
Gender: 0,
|
||||||
|
Status: 0,
|
||||||
|
Birthdate: time.Time{},
|
||||||
|
Role: 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
return &StubService{
|
||||||
|
addresses: addresses,
|
||||||
|
benefactors: benefactors,
|
||||||
|
haveError: haveError,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s StubService) BenefactorExistByID(ctx context.Context, request param.BenefactorExistByIDRequest) (param.BenefactorExistByIDResponse, error) {
|
||||||
|
if s.haveError {
|
||||||
|
// error response
|
||||||
|
return param.BenefactorExistByIDResponse{Existed: false}, fmt.Errorf(RepoErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, benefactor := range s.benefactors {
|
||||||
|
if benefactor.ID == request.ID {
|
||||||
|
return param.BenefactorExistByIDResponse{Existed: true}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return param.BenefactorExistByIDResponse{Existed: false}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s StubService) AddressExistByID(ctx context.Context, request addressparam.GetAddressByIDRequest) (addressparam.GetAddressByIDResponse, error) {
|
||||||
|
if s.haveError {
|
||||||
|
// error response
|
||||||
|
return addressparam.GetAddressByIDResponse{Address: nil}, fmt.Errorf(RepoErr)
|
||||||
|
}
|
||||||
|
for _, address := range s.addresses {
|
||||||
|
if address.ID == request.ID {
|
||||||
|
return addressparam.GetAddressByIDResponse{Address: &address}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return addressparam.GetAddressByIDResponse{Address: nil}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestValidateAddRequest(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
params benefactorkindboxreqparam.KindBoxReqAddRequest
|
||||||
|
repoErr bool
|
||||||
|
error error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "ordinary add",
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
CountRequested: 2,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "repo error",
|
||||||
|
repoErr: true,
|
||||||
|
error: fmt.Errorf("benefactor_id: record not found\naddress_id: something went wrong\n"),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
CountRequested: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Count Requested cannot be empty",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("count_requested: cannot be blank\n")),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
CountRequested: 0,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TypeID cannot be empty",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("type_id: cannot be blank\n")),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
TypeID: 0,
|
||||||
|
CountRequested: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "type with ID does exists",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("type_id: %s\n", errmsg.ErrorMsgNotFound)),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
TypeID: 5,
|
||||||
|
CountRequested: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "AddressID cannot be empty",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("address_id: cannot be blank\n")),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 0,
|
||||||
|
TypeID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
CountRequested: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "address with ID does exists",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("address_id: %s\n", errmsg.ErrorMsgNotFound)),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 5000,
|
||||||
|
TypeID: 1,
|
||||||
|
CountRequested: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ReferDate should not be empty",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("refer_date: cannot be blank\n")),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
TypeID: 1,
|
||||||
|
BenefactorID: 1,
|
||||||
|
CountRequested: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "This address does not belong to this benefactor",
|
||||||
|
error: fmt.Errorf(fmt.Sprintf("address_id: %s\n", errmsg.ErrorMsgNotFound)),
|
||||||
|
params: benefactorkindboxreqparam.KindBoxReqAddRequest{
|
||||||
|
AddressID: 1,
|
||||||
|
BenefactorID: 100,
|
||||||
|
TypeID: 1,
|
||||||
|
CountRequested: 1,
|
||||||
|
ReferDate: time.Now(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
// 1. setup
|
||||||
|
repo := NewMock(tc.repoErr)
|
||||||
|
vld := benefactorkindboxreqvalidator.New(repo, repo)
|
||||||
|
|
||||||
|
// 2. execution
|
||||||
|
res := vld.ValidateAddRequest(tc.params)
|
||||||
|
|
||||||
|
// 3. assertion
|
||||||
|
if tc.error == nil {
|
||||||
|
assert.Nil(t, res)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.Equal(t, tc.error.Error(), res.Error())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,12 +16,6 @@ const (
|
||||||
MaxKindBoxReq uint = 100
|
MaxKindBoxReq uint = 100
|
||||||
)
|
)
|
||||||
|
|
||||||
type Repository interface {
|
|
||||||
// KindBoxReqExist(id uint) (bool, error)
|
|
||||||
// KindBoxBelongToBenefactor(bID uint, kbID uint) (bool, error)
|
|
||||||
// PendingStatus(id uint) (bool, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type BenefactorSvc interface {
|
type BenefactorSvc interface {
|
||||||
BenefactorExistByID(ctx context.Context, request param.BenefactorExistByIDRequest) (param.BenefactorExistByIDResponse, error)
|
BenefactorExistByID(ctx context.Context, request param.BenefactorExistByIDRequest) (param.BenefactorExistByIDResponse, error)
|
||||||
}
|
}
|
||||||
|
@ -31,13 +25,27 @@ type AddressSvc interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Validator struct {
|
type Validator struct {
|
||||||
repo Repository
|
|
||||||
benefactorSvc BenefactorSvc
|
benefactorSvc BenefactorSvc
|
||||||
addressSvc AddressSvc
|
addressSvc AddressSvc
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(repo Repository, benefactorSvc BenefactorSvc, addressSvc AddressSvc) Validator {
|
type ValidatorError struct {
|
||||||
return Validator{repo: repo, benefactorSvc: benefactorSvc, addressSvc: addressSvc}
|
Fields map[string]string `json:"error"`
|
||||||
|
Err error `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v ValidatorError) Error() string {
|
||||||
|
var err string
|
||||||
|
|
||||||
|
for key, value := range v.Fields {
|
||||||
|
err += fmt.Sprintf("%s: %s\n", key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(benefactorSvc BenefactorSvc, addressSvc AddressSvc) Validator {
|
||||||
|
return Validator{benefactorSvc: benefactorSvc, addressSvc: addressSvc}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v Validator) doesBenefactorExist(value interface{}) error {
|
func (v Validator) doesBenefactorExist(value interface{}) error {
|
||||||
|
|
Loading…
Reference in New Issue