From 3015a19c6ad26bc0e9c59744530dc90cd01d461f Mon Sep 17 00:00:00 2001 From: Daniel Giurgiu Date: Thu, 3 Oct 2024 20:15:56 +0300 Subject: [PATCH] Add Unit Tests for DeleteSubscriber Handler --- api/coverage.out | 18 ++++----- api/main_test.go | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 9 deletions(-) diff --git a/api/coverage.out b/api/coverage.out index 20d00cf..e32e814 100644 --- a/api/coverage.out +++ b/api/coverage.out @@ -331,12 +331,12 @@ mymodule/main.go:1241.2,1241.24 1 1 mymodule/main.go:1241.24,1243.17 2 1 mymodule/main.go:1243.17,1247.4 3 1 mymodule/main.go:1250.2,1250.46 1 1 -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 +mymodule/main.go:1254.74,1255.35 1 1 +mymodule/main.go:1255.35,1258.3 2 1 +mymodule/main.go:1260.2,1261.16 2 1 +mymodule/main.go:1261.16,1264.3 2 1 +mymodule/main.go:1266.2,1267.16 2 1 +mymodule/main.go:1267.16,1270.3 2 1 +mymodule/main.go:1272.2,1273.23 2 1 +mymodule/main.go:1273.23,1276.3 2 1 +mymodule/main.go:1278.2,1278.52 1 1 diff --git a/api/main_test.go b/api/main_test.go index 6c6d103..758ceb4 100644 --- a/api/main_test.go +++ b/api/main_test.go @@ -3846,6 +3846,107 @@ func TestDeleteBook_FailedToDeleteAuthor(t *testing.T) { assert.NoError(t, err) } +// Tests for DeleteSubscriber handler +func TestDeleteSubscriber_Success(t *testing.T) { + app, mock := createTestApp(t) + defer app.DB.Close() + + req := httptest.NewRequest("DELETE", "/subscribers/1", nil) + vars := map[string]string{"id": "1"} + req = mux.SetURLVars(req, vars) + rr := httptest.NewRecorder() + + mock.ExpectExec(regexp.QuoteMeta(`DELETE FROM subscribers WHERE id = ?`)). + WithArgs(1). + WillReturnResult(sqlmock.NewResult(1, 1)) + + handler := http.HandlerFunc(app.DeleteSubscriber) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusOK, rr.Code) + assert.Contains(t, rr.Body.String(), "Subscriber deleted successfully") + + err := mock.ExpectationsWereMet() + assert.NoError(t, err) +} + +func TestDeleteSubscriber_InvalidSubscriberID(t *testing.T) { + app, _ := createTestApp(t) + defer app.DB.Close() + + req := httptest.NewRequest("DELETE", "/subscribers/invalid", nil) + vars := map[string]string{"id": "invalid"} + req = mux.SetURLVars(req, vars) + rr := httptest.NewRecorder() + + handler := http.HandlerFunc(app.DeleteSubscriber) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusBadRequest, rr.Code) + assert.Contains(t, rr.Body.String(), "Invalid subscriber ID") +} + +func TestDeleteSubscriber_NotFound(t *testing.T) { + app, mock := createTestApp(t) + defer app.DB.Close() + + req := httptest.NewRequest("DELETE", "/subscribers/1", nil) + vars := map[string]string{"id": "1"} + req = mux.SetURLVars(req, vars) + rr := httptest.NewRecorder() + + mock.ExpectExec(regexp.QuoteMeta(`DELETE FROM subscribers WHERE id = ?`)). + WithArgs(1). + WillReturnResult(sqlmock.NewResult(1, 0)) + + handler := http.HandlerFunc(app.DeleteSubscriber) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusNotFound, rr.Code) + assert.Contains(t, rr.Body.String(), "Subscriber not found") + + err := mock.ExpectationsWereMet() + assert.NoError(t, err) +} + +func TestDeleteSubscriber_DBError(t *testing.T) { + app, mock := createTestApp(t) + defer app.DB.Close() + + req := httptest.NewRequest("DELETE", "/subscribers/1", nil) + vars := map[string]string{"id": "1"} + req = mux.SetURLVars(req, vars) + rr := httptest.NewRecorder() + + mock.ExpectExec(regexp.QuoteMeta(`DELETE FROM subscribers WHERE id = ?`)). + WithArgs(1). + WillReturnError(fmt.Errorf("DB error")) + + handler := http.HandlerFunc(app.DeleteSubscriber) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusInternalServerError, rr.Code) + assert.Contains(t, rr.Body.String(), "Failed to delete subscriber") + + err := mock.ExpectationsWereMet() + assert.NoError(t, err) +} + +func TestDeleteSubscriber_MethodNotAllowed(t *testing.T) { + app, _ := createTestApp(t) + defer app.DB.Close() + + req := httptest.NewRequest("GET", "/subscribers/1", nil) + vars := map[string]string{"id": "1"} + req = mux.SetURLVars(req, vars) + rr := httptest.NewRecorder() + + handler := http.HandlerFunc(app.DeleteSubscriber) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusMethodNotAllowed, rr.Code) + assert.Contains(t, rr.Body.String(), "Only DELETE method is supported") +}