From b499f9d18f3338331520b6f4a3e259c40d9bdcf9 Mon Sep 17 00:00:00 2001 From: tobg <71645695+tobg8@users.noreply.github.com> Date: Sat, 2 Nov 2024 00:56:48 +0100 Subject: [PATCH] feat: add tests for controller layer on search repos (#6) --- src/controllers/repository_test.go | 76 ++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/controllers/repository_test.go diff --git a/src/controllers/repository_test.go b/src/controllers/repository_test.go new file mode 100644 index 0000000..d52cab0 --- /dev/null +++ b/src/controllers/repository_test.go @@ -0,0 +1,76 @@ +package controllers + +import ( + "errors" + "net/http" + "net/http/httptest" + "testing" + + "github.com/Scalingo/sclng-backend-test-v1/src/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +type mockRepositoryUseCase struct { + mock.Mock +} + +func (m *mockRepositoryUseCase) SearchRepositories(query string) (*models.RepositorySearchResponse, error) { + args := m.Called(query) + return args.Get(0).(*models.RepositorySearchResponse), args.Error(1) +} + +func TestSearchRepositoriesEndpoint(t *testing.T) { + tests := map[string]struct { + endpoint string + mockCall func(*mockRepositoryUseCase) + expectedStatus int + }{ + "nominal": { + endpoint: "/repositories/search?q=golang", + mockCall: func(m *mockRepositoryUseCase) { + response := &models.RepositorySearchResponse{ + TotalCount: 1, + Items: []models.Repository{ + {FullName: "scalingo/scalingo-test"}, + }, + } + m.On("SearchRepositories", "golang").Return(response, nil) + }, + expectedStatus: http.StatusOK, + }, + "usecase error, return error": { + endpoint: "/repositories/search?q=golang", + mockCall: func(m *mockRepositoryUseCase) { + m.On("SearchRepositories", "golang").Return(&models.RepositorySearchResponse{}, errors.New("usecase error")) + }, + expectedStatus: http.StatusInternalServerError, + }, + "missing query, return error": { + endpoint: "/repositories/search", + expectedStatus: http.StatusBadRequest, + }, + "empty queryu, return error": { + endpoint: "/repositories/search?q=", + expectedStatus: http.StatusBadRequest, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + req := httptest.NewRequest(http.MethodGet, tt.endpoint, nil) + w := httptest.NewRecorder() + + mockUseCase := new(mockRepositoryUseCase) + controller := NewRepositoryController(mockUseCase) + + if tt.mockCall != nil { + tt.mockCall(mockUseCase) + } + + controller.SearchRepositories(w, req) + + assert.Equal(t, tt.expectedStatus, w.Code) + }) + } +}