diff --git a/internal/merch/handler_test.go b/internal/merch/handler_test.go index a592848..9e3666e 100644 --- a/internal/merch/handler_test.go +++ b/internal/merch/handler_test.go @@ -13,6 +13,7 @@ import ( ) const userId int64 = 789 +const validUuid string = "d28f5a94-ccf9-4eb6-bac3-53b065ba0d0c" func setupTestRouter(mockRepo Repository) *gin.Engine { ut := utils.New() @@ -38,6 +39,8 @@ func setupTestRouter(mockRepo Repository) *gin.Engine { return router } +// Labels + func TestCreateLabelSuccess(t *testing.T) { mockRepo := new(MockRepository) mockRepo. @@ -258,3 +261,189 @@ func TestGetMerchLabelsSuccess(t *testing.T) { mockRepo.AssertExpectations(t) } + +// Merch +func TestCreateMerchSuccess(t *testing.T) { + mockRepo := new(MockRepository) + + merchExpected := mock.MatchedBy(func(arg any) bool { + model, ok := arg.(*Merch) + if !ok { + return false + } + + if model.CreatedAt.IsZero() { + return false + } + + if model.UpdatedAt.Valid == false { + return false + } + + if model.UpdatedAt.Time.IsZero() { + return false + } + + if model.UpdatedAt.Time.Before(model.CreatedAt) { + return false + } + + if model.DeletedAt.Valid != false { + return false + } + + if model.MerchUuid == "" || len(model.MerchUuid) != 36 { + return false + } + + if model.UserId != userId { + return false + } + + return true + }) + + extraExpected := mock.MatchedBy(func(arg any) bool { + _, ok := arg.([]ExtraData) + if !ok { + return false + } + return true + }) + + mockRepo. + On("getOrigins", mock.Anything). + Return([]Origin{ + {Id: 1, Name: "origin 1"}, + {Id: 2, Name: "origin 2"}, + {Id: 3, Name: "origin 3"}, + {Id: 4, Name: "origin 4"}, + {Id: 5, Name: "origin 5"}, + {Id: 6, Name: "origin 6"}, + {Id: 7, Name: "origin 7"}, + }, nil) + + mockRepo. + On("createMerch", mock.Anything, merchExpected, extraExpected). + Return(nil) + + router := setupTestRouter(mockRepo) + + data1 := newMerchDTO{ + Name: "Test name1", + Links: []originLink{ + {Origin: "origin 1", Link: "link1"}, + {Origin: "origin 2", Link: "link2"}, + {Origin: "origin 3", Link: "link3"}, + {Origin: "origin 4", Link: "link4"}, + {Origin: "origin 5", Link: "link5"}, + {Origin: "origin 6", Link: "link6"}, + {Origin: "origin 7", Link: "link7"}, + }, + } + + data2 := newMerchDTO{ + Name: "Test name2", + } + + for _, tt := range []newMerchDTO{data1, data2} { + payload, err := json.Marshal(&tt) + if err != nil { + t.Fatal(err) + } + + body := bytes.NewBuffer(payload) + + req, _ := http.NewRequest("POST", "/merch/create", body) + w := httptest.NewRecorder() + + router.ServeHTTP(w, req) + + assert.Equal(t, 201, w.Code) + } + + mockRepo.AssertExpectations(t) +} + +func TestGetManySuccess(t *testing.T) { + type testCase struct { + caseName string + getManyReturn []getMerchInternal + expectLabels bool + labelsReceive []int64 + labelsReturn map[int64][]string + expectedCode int + expectedResult []ListResponse + } + + cases := []testCase{ + { + caseName: "Success with merch", + getManyReturn: []getMerchInternal{ + {Id: 1, MerchUuid: validUuid, Name: "merch1"}, + {Id: 2, MerchUuid: validUuid, Name: "merch2"}, + {Id: 3, MerchUuid: validUuid, Name: "merch3"}, + }, + expectLabels: true, + labelsReceive: []int64{1, 2, 3}, + labelsReturn: map[int64][]string{1: {"l1", "l2", "l3"}, 2: {"l4", "l5", "l6"}, 3: {"l7", "l8", "l9"}}, + expectedCode: 200, + expectedResult: []ListResponse{ + {MerchUuid: validUuid, Name: "merch1", Labels: []string{"l1", "l2", "l3"}}, + {MerchUuid: validUuid, Name: "merch2", Labels: []string{"l4", "l5", "l6"}}, + {MerchUuid: validUuid, Name: "merch3", Labels: []string{"l7", "l8", "l9"}}, + }, + }, + + { + caseName: "Success no merch - empty merch", + getManyReturn: []getMerchInternal{}, + expectLabels: false, + expectedCode: 204, + }, + + { + caseName: "Success no merch - nil merch", + getManyReturn: nil, + expectLabels: false, + expectedCode: 204, + }, + } + + for _, tt := range cases { + t.Log(tt.caseName) + + mockRepo := new(MockRepository) + + mockRepo. + On("getMany", mock.Anything, userId). + Return(tt.getManyReturn, nil) + + if tt.expectLabels { + mockRepo. + On("getManyAttachedLabelsByList", mock.Anything, userId, tt.labelsReceive). + Return(tt.labelsReturn, nil) + } + + router := setupTestRouter(mockRepo) + + req, _ := http.NewRequest("GET", "/merch/list", nil) + w := httptest.NewRecorder() + + router.ServeHTTP(w, req) + + assert.Equal(t, tt.expectedCode, w.Code) + + if tt.expectedCode == 200 { + var response []ListResponse + err := json.Unmarshal(w.Body.Bytes(), &response) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, tt.expectedResult, response) + } + + mockRepo.AssertExpectations(t) + } +}