naise_pos/api/user_test.go
2023-03-16 12:21:41 +07:00

198 lines
4.8 KiB
Go

package api
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"reflect"
"testing"
mockdb "git.nochill.in/nochill/naice_pos/db/mock"
db "git.nochill.in/nochill/naice_pos/db/sqlc"
"git.nochill.in/nochill/naice_pos/util"
"github.com/gin-gonic/gin"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/require"
)
type eqCreateUserMerchantParamsMatcher struct {
arg db.UserMerchantTxParams
password string
}
func (e eqCreateUserMerchantParamsMatcher) Matches(x interface{}) bool {
arg, ok := x.(db.UserMerchantTxParams)
if !ok {
return false
}
err := util.CheckPassword(e.password, arg.Password)
if err != nil {
return false
}
e.arg.Password = arg.Password
return reflect.DeepEqual(e.arg.Password, arg.Password)
}
func (e eqCreateUserMerchantParamsMatcher) String() string {
return fmt.Sprintf("matches arg %v and password %v", e.arg, e.password)
}
func EqCreateUserMerchant(arg db.UserMerchantTxParams, password string) gomock.Matcher {
return eqCreateUserMerchantParamsMatcher{arg, password}
}
func TestCreateUserMerchantAPI(t *testing.T) {
userMerchant, password := randomUser(t)
var userMerchantResult db.UserMerchantTxResult
// var userMerchantResponse createUserMerchantResponse
testCases := []struct {
name string
body gin.H
buildStubs func(store *mockdb.MockStore)
checkResponse func(recorder *httptest.ResponseRecorder)
}{
{
name: "OK",
body: gin.H{
"email": userMerchant.Email,
"fullname": userMerchant.Fullname,
"password": password,
"outlet_name": userMerchant.OutletName,
},
buildStubs: func(store *mockdb.MockStore) {
arg := db.UserMerchantTxParams{
Email: userMerchant.Email,
Fullname: userMerchant.Fullname,
OutletName: userMerchant.OutletName,
}
store.EXPECT().
CreateUserMerchantTx(gomock.Any(), EqCreateUserMerchant(arg, password)).
Times(1).
Return(userMerchantResult, nil)
},
checkResponse: func(recorder *httptest.ResponseRecorder) {
require.Equal(t, http.StatusOK, recorder.Code)
// requireBodyMatchUserMerchant(t, recorder.Body, userMerchantResponse)
},
},
}
for i := range testCases {
tc := testCases[i]
t.Run(tc.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
store := mockdb.NewMockStore(ctrl)
tc.buildStubs(store)
server := newTestServer(t, store)
recorder := httptest.NewRecorder()
data, err := json.Marshal(tc.body)
require.NoError(t, err)
url := "/user/merchants"
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(data))
require.NoError(t, err)
server.router.ServeHTTP(recorder, request)
tc.checkResponse(recorder)
})
}
}
func TestUserLoginAPI(t *testing.T) {
user, password := randomUser(t)
var userProfile db.User
var userOutletProfile db.Merchant
testCases := []struct {
name string
body gin.H
buildStubs func(store *mockdb.MockStore)
checkResponse func(recorder *httptest.ResponseRecorder)
}{
{
name: "OK",
body: gin.H{
"email": user.Email,
"password": password,
},
buildStubs: func(store *mockdb.MockStore) {
store.EXPECT().
GetUserByEmail(gomock.Any(), gomock.Eq(user.Email)).
Times(1).
Return(userProfile, nil)
store.EXPECT().
GetMerchantByUserId(gomock.Any(), gomock.Any()).
Times(1).
Return(userOutletProfile, nil)
store.EXPECT().
CreateSession(gomock.Any(), gomock.Any()).
Times(1)
},
checkResponse: func(recorder *httptest.ResponseRecorder) {
require.Equal(t, http.StatusOK, recorder.Code)
},
},
}
for i := range testCases {
tc := testCases[i]
t.Run(tc.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
store := mockdb.NewMockStore(ctrl)
tc.buildStubs(store)
server := newTestServer(t, store)
recorder := httptest.NewRecorder()
data, err := json.Marshal(tc.body)
require.NoError(t, err)
url := "/user/login"
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(data))
require.NoError(t, err)
server.router.ServeHTTP(recorder, request)
tc.checkResponse(recorder)
})
}
}
func randomUser(t *testing.T) (userMerchant db.UserMerchantTxParams, password string) {
password = util.RandomString(6)
hashedPassword, err := util.HashPassword(password)
require.NoError(t, err)
userMerchant = db.UserMerchantTxParams{
Email: util.RandomEmail(),
Fullname: util.RandomString(5),
Password: hashedPassword,
OutletName: util.RandomString(10),
}
return
}
func requireBodyMatchUserMerchant(t *testing.T, body *bytes.Buffer, userMerchant userMerchantResponse) {
data, err := ioutil.ReadAll(body)
require.NoError(t, err)
var gotUserMerchant db.UserMerchantTxParams
err = json.Unmarshal(data, &gotUserMerchant)
require.NoError(t, err)
}