diff --git a/api/coverage.out b/api/coverage.out index 1784b7a..4302565 100644 --- a/api/coverage.out +++ b/api/coverage.out @@ -272,20 +272,20 @@ mymodule/main.go:1032.17,1035.4 2 1 mymodule/main.go:1038.3,1039.24 2 1 mymodule/main.go:1039.24,1042.4 2 1 mymodule/main.go:1045.3,1045.46 1 1 -mymodule/main.go:1050.52,1051.54 1 0 -mymodule/main.go:1051.54,1053.64 1 0 -mymodule/main.go:1053.64,1056.4 2 0 -mymodule/main.go:1059.3,1061.17 3 0 -mymodule/main.go:1061.17,1064.4 2 0 -mymodule/main.go:1067.3,1069.17 3 0 -mymodule/main.go:1069.17,1072.4 2 0 -mymodule/main.go:1073.3,1080.88 4 0 -mymodule/main.go:1080.88,1083.4 2 0 -mymodule/main.go:1086.3,1094.17 3 0 -mymodule/main.go:1094.17,1097.4 2 0 -mymodule/main.go:1100.3,1101.24 2 0 -mymodule/main.go:1101.24,1104.4 2 0 -mymodule/main.go:1107.3,1107.52 1 0 +mymodule/main.go:1050.52,1051.54 1 1 +mymodule/main.go:1051.54,1053.64 1 1 +mymodule/main.go:1053.64,1056.4 2 1 +mymodule/main.go:1059.3,1061.17 3 1 +mymodule/main.go:1061.17,1064.4 2 1 +mymodule/main.go:1067.3,1069.17 3 1 +mymodule/main.go:1069.17,1072.4 2 1 +mymodule/main.go:1073.3,1080.88 4 1 +mymodule/main.go:1080.88,1083.4 2 1 +mymodule/main.go:1086.3,1094.17 3 1 +mymodule/main.go:1094.17,1097.4 2 1 +mymodule/main.go:1100.3,1101.24 2 1 +mymodule/main.go:1101.24,1104.4 2 1 +mymodule/main.go:1107.3,1107.52 1 1 mymodule/main.go:1112.48,1113.54 1 0 mymodule/main.go:1113.54,1115.36 1 0 mymodule/main.go:1115.36,1118.4 2 0 diff --git a/api/main_test.go b/api/main_test.go index 3ac3f04..2f8a960 100644 --- a/api/main_test.go +++ b/api/main_test.go @@ -1243,3 +1243,146 @@ func TestUpdateBook(t *testing.T) { assert.Equal(t, "Book updated successfully", w.Body.String()) }) } + +func TestUpdateSubscriber(t *testing.T) { + dbService, err := NewTestDBService() // Folosim un serviciu de DB mock + if err != nil { + t.Fatalf("Unexpected error when opening a stub database connection: %v", err) + } + defer dbService.DB.Close() + + // Setăm logger-ul pentru a nu polua output-ul testelor + logger := log.New(io.Discard, "", log.LstdFlags) + originalLogger := log.Default() + log.SetOutput(logger.Writer()) + defer log.SetOutput(originalLogger.Writer()) + + t.Run("Invalid HTTP Method", func(t *testing.T) { + req, _ := createRequestWithVars(http.MethodGet, "/subscribers/1", nil, map[string]string{"id": "1"}) + w := httptest.NewRecorder() + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusMethodNotAllowed, w.Code) + assert.Equal(t, "Only PUT or POST methods are supported\n", w.Body.String()) + }) + + t.Run("Invalid Subscriber ID", func(t *testing.T) { + req, _ := createRequestWithVars(http.MethodPut, "/subscribers/invalid_id", nil, map[string]string{"id": "invalid_id"}) + w := httptest.NewRecorder() + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, "Invalid subscriber ID\n", w.Body.String()) + }) + + t.Run("Invalid JSON Data", func(t *testing.T) { + req, _ := createRequestWithVars(http.MethodPut, "/subscribers/1", []byte("invalid json"), map[string]string{"id": "1"}) + w := httptest.NewRecorder() + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, "Invalid JSON data\n", w.Body.String()) + }) + + t.Run("Missing Required Fields", func(t *testing.T) { + invalidSubscriber := struct { + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` + Email string `json:"email"` + }{ + Firstname: "", + Lastname: "", + Email: "", + } + body, _ := json.Marshal(invalidSubscriber) + req, _ := createRequestWithVars(http.MethodPut, "/subscribers/1", body, map[string]string{"id": "1"}) + w := httptest.NewRecorder() + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, "Firstname, Lastname, and Email are required fields\n", w.Body.String()) + }) + + t.Run("Database Error", func(t *testing.T) { + validSubscriber := struct { + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` + Email string `json:"email"` + }{ + Firstname: "John", + Lastname: "Doe", + Email: "john.doe@example.com", + } + body, _ := json.Marshal(validSubscriber) + req, _ := createRequestWithVars(http.MethodPut, "/subscribers/1", body, map[string]string{"id": "1"}) + w := httptest.NewRecorder() + + dbService.Mock.ExpectExec("UPDATE subscribers"). + WithArgs(validSubscriber.Lastname, validSubscriber.Firstname, validSubscriber.Email, 1). + WillReturnError(fmt.Errorf("some database error")) + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusInternalServerError, w.Code) + assert.Contains(t, w.Body.String(), "Failed to update subscriber: some database error") + }) + + t.Run("Subscriber Not Found", func(t *testing.T) { + validSubscriber := struct { + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` + Email string `json:"email"` + }{ + Firstname: "John", + Lastname: "Doe", + Email: "john.doe@example.com", + } + body, _ := json.Marshal(validSubscriber) + req, _ := createRequestWithVars(http.MethodPut, "/subscribers/1", body, map[string]string{"id": "1"}) + w := httptest.NewRecorder() + + dbService.Mock.ExpectExec("UPDATE subscribers"). + WithArgs(validSubscriber.Lastname, validSubscriber.Firstname, validSubscriber.Email, 1). + WillReturnResult(sqlmock.NewResult(1, 0)) // 0 rows affected + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusNotFound, w.Code) + assert.Equal(t, "Subscriber not found\n", w.Body.String()) + }) + + t.Run("Successful Update", func(t *testing.T) { + validSubscriber := struct { + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` + Email string `json:"email"` + }{ + Firstname: "John", + Lastname: "Doe", + Email: "john.doe@example.com", + } + body, _ := json.Marshal(validSubscriber) + req, _ := createRequestWithVars(http.MethodPut, "/subscribers/1", body, map[string]string{"id": "1"}) + w := httptest.NewRecorder() + + dbService.Mock.ExpectExec("UPDATE subscribers"). + WithArgs(validSubscriber.Lastname, validSubscriber.Firstname, validSubscriber.Email, 1). + WillReturnResult(sqlmock.NewResult(1, 1)) // 1 row affected + + handler := UpdateSubscriber(dbService.DB) + handler.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "Subscriber updated successfully", w.Body.String()) + }) +}