niki/validator/benefactor/kind_box_req/add_test.go

215 lines
5.6 KiB
Go

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())
})
}
}