Skip to content

Commit

Permalink
Add Unit Tests for DeleteAuthor Handler
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel-Giurgiu committed Oct 3, 2024
1 parent 323c9b3 commit 87508f8
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 25 deletions.
46 changes: 23 additions & 23 deletions api/coverage.out
Original file line number Diff line number Diff line change
Expand Up @@ -317,26 +317,26 @@ mymodule/main.go:1191.65,1194.3 2 1
mymodule/main.go:1196.2,1196.48 1 1
mymodule/main.go:1200.68,1201.35 1 0
mymodule/main.go:1201.35,1204.3 2 0
mymodule/main.go:1207.2,1209.16 3 0
mymodule/main.go:1209.16,1212.3 2 0
mymodule/main.go:1215.2,1224.16 4 0
mymodule/main.go:1224.16,1228.3 3 0
mymodule/main.go:1231.2,1240.16 4 0
mymodule/main.go:1240.16,1244.3 3 0
mymodule/main.go:1247.2,1254.16 3 0
mymodule/main.go:1254.16,1258.3 3 0
mymodule/main.go:1261.2,1262.23 2 0
mymodule/main.go:1262.23,1265.3 2 0
mymodule/main.go:1268.2,1268.24 1 0
mymodule/main.go:1268.24,1276.17 3 0
mymodule/main.go:1276.17,1280.4 3 0
mymodule/main.go:1283.2,1283.45 1 0
mymodule/main.go:1287.74,1288.35 1 0
mymodule/main.go:1288.35,1291.3 2 0
mymodule/main.go:1294.2,1296.16 3 0
mymodule/main.go:1296.16,1299.3 2 0
mymodule/main.go:1302.2,1309.16 3 0
mymodule/main.go:1309.16,1313.3 3 0
mymodule/main.go:1316.2,1317.23 2 0
mymodule/main.go:1317.23,1320.3 2 0
mymodule/main.go:1322.2,1322.51 1 0
mymodule/main.go:1206.2,1207.16 2 0
mymodule/main.go:1207.16,1210.3 2 0
mymodule/main.go:1212.2,1214.16 3 0
mymodule/main.go:1214.16,1218.3 3 0
mymodule/main.go:1220.2,1222.16 3 0
mymodule/main.go:1222.16,1226.3 3 0
mymodule/main.go:1228.2,1229.16 2 0
mymodule/main.go:1229.16,1233.3 3 0
mymodule/main.go:1235.2,1236.23 2 0
mymodule/main.go:1236.23,1239.3 2 0
mymodule/main.go:1241.2,1241.24 1 0
mymodule/main.go:1241.24,1243.17 2 0
mymodule/main.go:1243.17,1247.4 3 0
mymodule/main.go:1250.2,1250.46 1 0
mymodule/main.go:1254.74,1255.35 1 0
mymodule/main.go:1255.35,1258.3 2 0
mymodule/main.go:1260.2,1261.16 2 0
mymodule/main.go:1261.16,1264.3 2 0
mymodule/main.go:1266.2,1267.16 2 0
mymodule/main.go:1267.16,1270.3 2 0
mymodule/main.go:1272.2,1273.23 2 0
mymodule/main.go:1273.23,1276.3 2 0
mymodule/main.go:1278.2,1278.52 1 0
162 changes: 160 additions & 2 deletions api/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ func TestRespondWithJSON_Error(t *testing.T) {
// TestHandleError tests the HandleError function
func TestHandleError(t *testing.T) {
rr := httptest.NewRecorder()
logger := log.New(io.Discard, "", log.LstdFlags) // Logger care nu afiseaza nimic
logger := log.New(io.Discard, "", log.LstdFlags)
message := "test error"
err := fmt.Errorf("an example error")

Expand Down Expand Up @@ -554,7 +554,7 @@ func TestSearchBooks_ErrorScanningRows(t *testing.T) {
WithArgs("%Sample%", "%Sample%", "%Sample%").
WillReturnRows(sqlmock.NewRows([]string{
"book_id", "book_title", "author_id", "book_photo", "is_borrowed", "book_details", "author_lastname", "author_firstname",
}).AddRow("invalid_id", "Sample Book", 1, "book.jpg", false, "A sample book", "Doe", "John")) // Valoare invalidă pentru a provoca o eroare
}).AddRow("invalid_id", "Sample Book", 1, "book.jpg", false, "A sample book", "Doe", "John"))

handler := http.HandlerFunc(app.SearchBooks)
handler.ServeHTTP(rr, req)
Expand Down Expand Up @@ -3440,7 +3440,165 @@ func TestUpdateSubscriber_FailedToRetrieveAffectedRows(t *testing.T) {
assert.NoError(t, err)
}

// Tests for DeleteAuthor handler
func TestDeleteAuthor_Success(t *testing.T) {
app, mock := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("DELETE", "/authors/1", nil)
vars := map[string]string{"id": "1"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

mock.ExpectQuery(`SELECT COUNT\(\*\) FROM books WHERE author_id = ?`).
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))

mock.ExpectExec(`DELETE FROM authors WHERE id = ?`).
WithArgs(1).
WillReturnResult(sqlmock.NewResult(1, 1))

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusOK, rr.Code)
assert.Contains(t, rr.Body.String(), "Author deleted successfully")

err := mock.ExpectationsWereMet()
assert.NoError(t, err)
}

func TestDeleteAuthor_InvalidAuthorID(t *testing.T) {
app, _ := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("DELETE", "/authors/invalid", nil)
vars := map[string]string{"id": "invalid"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusBadRequest, rr.Code)
assert.Contains(t, rr.Body.String(), "Invalid author ID")
}

func TestDeleteAuthor_HasAssociatedBooks(t *testing.T) {
app, mock := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("DELETE", "/authors/1", nil)
vars := map[string]string{"id": "1"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

mock.ExpectQuery(`SELECT COUNT\(\*\) FROM books WHERE author_id = ?`).
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(5))

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusBadRequest, rr.Code)
assert.Contains(t, rr.Body.String(), "Author has associated books, delete books first")

err := mock.ExpectationsWereMet()
assert.NoError(t, err)
}

func TestDeleteAuthor_DBErrorCheckingBooks(t *testing.T) {
app, mock := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("DELETE", "/authors/1", nil)
vars := map[string]string{"id": "1"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

mock.ExpectQuery(`SELECT COUNT\(\*\) FROM books WHERE author_id = ?`).
WithArgs(1).
WillReturnError(fmt.Errorf("DB error"))

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusInternalServerError, rr.Code)
assert.Contains(t, rr.Body.String(), "Failed to check for books")

err := mock.ExpectationsWereMet()
assert.NoError(t, err)
}

func TestDeleteAuthor_NotFound(t *testing.T) {
app, mock := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("DELETE", "/authors/1", nil)
vars := map[string]string{"id": "1"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

mock.ExpectQuery(`SELECT COUNT\(\*\) FROM books WHERE author_id = ?`).
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))

mock.ExpectExec(`DELETE FROM authors WHERE id = ?`).
WithArgs(1).
WillReturnResult(sqlmock.NewResult(1, 0))

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusNotFound, rr.Code)
assert.Contains(t, rr.Body.String(), "Author not found")

err := mock.ExpectationsWereMet()
assert.NoError(t, err)
}

func TestDeleteAuthor_DBErrorDeletingAuthor(t *testing.T) {
app, mock := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("DELETE", "/authors/1", nil)
vars := map[string]string{"id": "1"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

mock.ExpectQuery(`SELECT COUNT\(\*\) FROM books WHERE author_id = ?`).
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))

mock.ExpectExec(`DELETE FROM authors WHERE id = ?`).
WithArgs(1).
WillReturnError(fmt.Errorf("DB error"))

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusInternalServerError, rr.Code)
assert.Contains(t, rr.Body.String(), "Failed to delete author")

err := mock.ExpectationsWereMet()
assert.NoError(t, err)
}

func TestDeleteAuthor_MethodNotAllowed(t *testing.T) {
app, _ := createTestApp(t)
defer app.DB.Close()

req := httptest.NewRequest("GET", "/authors/1", nil)
vars := map[string]string{"id": "1"}
req = mux.SetURLVars(req, vars)
rr := httptest.NewRecorder()

handler := http.HandlerFunc(app.DeleteAuthor)
handler.ServeHTTP(rr, req)

assert.Equal(t, http.StatusMethodNotAllowed, rr.Code)
assert.Contains(t, rr.Body.String(), "Only DELETE method is supported")
}



Expand Down
Binary file added bin/act
Binary file not shown.

0 comments on commit 87508f8

Please sign in to comment.