diff --git a/internal/merch/handler_test.go b/internal/merch/handler_test.go index 9e3666e..569aec0 100644 --- a/internal/merch/handler_test.go +++ b/internal/merch/handler_test.go @@ -264,110 +264,134 @@ func TestGetMerchLabelsSuccess(t *testing.T) { // Merch func TestCreateMerchSuccess(t *testing.T) { - mockRepo := new(MockRepository) + type testCases struct { + name string + inputDTO newMerchDTO + expectOrigins bool + expectedCode int + } - merchExpected := mock.MatchedBy(func(arg any) bool { - model, ok := arg.(*Merch) - if !ok { - return false - } + cases := []testCases{ + { + name: "Success - with origins", + inputDTO: 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"}, + }, + }, + expectOrigins: true, + expectedCode: 201, + }, - 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"}, + { + name: "Success - without origins", + inputDTO: newMerchDTO{ + Name: "Test name2", + }, + expectOrigins: false, + expectedCode: 201, }, } - data2 := newMerchDTO{ - Name: "Test name2", + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + mockRepo := new(MockRepository) + + if tt.expectOrigins { + 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) + } + + 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("createMerch", mock.Anything, merchExpected, extraExpected). + Return(nil) + + router := setupTestRouter(mockRepo) + + payload, err := json.Marshal(&tt.inputDTO) + 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, tt.expectedCode, w.Code) + mockRepo.AssertExpectations(t) + + }) } - - 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 + name string getManyReturn []getMerchInternal expectLabels bool labelsReceive []int64 @@ -378,7 +402,7 @@ func TestGetManySuccess(t *testing.T) { cases := []testCase{ { - caseName: "Success with merch", + name: "Success with merch", getManyReturn: []getMerchInternal{ {Id: 1, MerchUuid: validUuid, Name: "merch1"}, {Id: 2, MerchUuid: validUuid, Name: "merch2"}, @@ -396,14 +420,14 @@ func TestGetManySuccess(t *testing.T) { }, { - caseName: "Success no merch - empty merch", + name: "Success no merch - empty merch", getManyReturn: []getMerchInternal{}, expectLabels: false, expectedCode: 204, }, { - caseName: "Success no merch - nil merch", + name: "Success no merch - nil merch", getManyReturn: nil, expectLabels: false, expectedCode: 204, @@ -411,39 +435,39 @@ func TestGetManySuccess(t *testing.T) { } for _, tt := range cases { - t.Log(tt.caseName) + t.Run(tt.name, func(t *testing.T) { + mockRepo := new(MockRepository) - 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) - } + On("getMany", mock.Anything, userId). + Return(tt.getManyReturn, 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) + if tt.expectLabels { + mockRepo. + On("getManyAttachedLabelsByList", mock.Anything, userId, tt.labelsReceive). + Return(tt.labelsReturn, nil) } - assert.Equal(t, tt.expectedResult, response) - } + router := setupTestRouter(mockRepo) - mockRepo.AssertExpectations(t) + 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) + }) } }