Skip to content

Commit

Permalink
Add unit testing for UpdateSubscriber handler
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel-Giurgiu committed Aug 26, 2024
1 parent c9057d6 commit 04ed7b5
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 14 deletions.
28 changes: 14 additions & 14 deletions api/coverage.out
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
143 changes: 143 additions & 0 deletions api/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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: "[email protected]",
}
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: "[email protected]",
}
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: "[email protected]",
}
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())
})
}

0 comments on commit 04ed7b5

Please sign in to comment.