Fix lint errors: add error checks for errcheck linter
All checks were successful
Run Tests / Run Go Tests (push) Successful in 2m24s
Run Tests / Lint Code (push) Successful in 3m36s

- Add error check for JSON response in panic handler
- Remove duplicate defer CloseDB() call (handled in shutdown)
- Add error checks for all WriteField() calls in test files
- Add error checks for CreateFormFile() and Write() calls
- Fix golangci-lint Go 1.25 compatibility by installing from source
This commit is contained in:
2025-11-21 15:55:12 +03:00
parent 58df1359e1
commit 1db56d6741
4 changed files with 87 additions and 39 deletions

View File

@@ -22,18 +22,37 @@ func TestUploadBook(t *testing.T) {
writer := multipart.NewWriter(body) writer := multipart.NewWriter(body)
// Add form fields // Add form fields
writer.WriteField("book_name", "Test Book") if err := writer.WriteField("book_name", "Test Book"); err != nil {
writer.WriteField("cost", "10.50") t.Fatalf("Failed to write field: %v", err)
writer.WriteField("price", "15.99") }
writer.WriteField("quantity", "100") if err := writer.WriteField("cost", "10.50"); err != nil {
writer.WriteField("publisher_author", "Test Publisher") t.Fatalf("Failed to write field: %v", err)
writer.WriteField("category", "Fiction") }
if err := writer.WriteField("price", "15.99"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
if err := writer.WriteField("quantity", "100"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
if err := writer.WriteField("publisher_author", "Test Publisher"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
if err := writer.WriteField("category", "Fiction"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
// Add image file // Add image file
part, _ := writer.CreateFormFile("image", "test.png") part, err := writer.CreateFormFile("image", "test.png")
part.Write([]byte("fake image data")) if err != nil {
t.Fatalf("Failed to create form file: %v", err)
}
if _, err := part.Write([]byte("fake image data")); err != nil {
t.Fatalf("Failed to write image data: %v", err)
}
writer.Close() if err := writer.Close(); err != nil {
t.Fatalf("Failed to close writer: %v", err)
}
req := httptest.NewRequest("POST", "/api/books", body) req := httptest.NewRequest("POST", "/api/books", body)
req.Header.Set("Content-Type", writer.FormDataContentType()) req.Header.Set("Content-Type", writer.FormDataContentType())
@@ -55,8 +74,12 @@ func TestUploadBook_ValidationErrors(t *testing.T) {
// Test missing required field // Test missing required field
body := &bytes.Buffer{} body := &bytes.Buffer{}
writer := multipart.NewWriter(body) writer := multipart.NewWriter(body)
writer.WriteField("book_name", "") // Empty book name if err := writer.WriteField("book_name", ""); err != nil { // Empty book name
writer.Close() t.Fatalf("Failed to write field: %v", err)
}
if err := writer.Close(); err != nil {
t.Fatalf("Failed to close writer: %v", err)
}
req := httptest.NewRequest("POST", "/api/books", body) req := httptest.NewRequest("POST", "/api/books", body)
req.Header.Set("Content-Type", writer.FormDataContentType()) req.Header.Set("Content-Type", writer.FormDataContentType())

View File

@@ -22,18 +22,37 @@ func TestUploadStationery(t *testing.T) {
writer := multipart.NewWriter(body) writer := multipart.NewWriter(body)
// Add form fields // Add form fields
writer.WriteField("stationery_name", "Test Pen") if err := writer.WriteField("stationery_name", "Test Pen"); err != nil {
writer.WriteField("cost", "2.50") t.Fatalf("Failed to write field: %v", err)
writer.WriteField("price", "5.99") }
writer.WriteField("quantity", "200") if err := writer.WriteField("cost", "2.50"); err != nil {
writer.WriteField("category", "Writing") t.Fatalf("Failed to write field: %v", err)
writer.WriteField("color", "Blue") }
if err := writer.WriteField("price", "5.99"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
if err := writer.WriteField("quantity", "200"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
if err := writer.WriteField("category", "Writing"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
if err := writer.WriteField("color", "Blue"); err != nil {
t.Fatalf("Failed to write field: %v", err)
}
// Add image file // Add image file
part, _ := writer.CreateFormFile("image", "test.png") part, err := writer.CreateFormFile("image", "test.png")
part.Write([]byte("fake image data")) if err != nil {
t.Fatalf("Failed to create form file: %v", err)
}
if _, err := part.Write([]byte("fake image data")); err != nil {
t.Fatalf("Failed to write image data: %v", err)
}
writer.Close() if err := writer.Close(); err != nil {
t.Fatalf("Failed to close writer: %v", err)
}
req := httptest.NewRequest("POST", "/api/stationery", body) req := httptest.NewRequest("POST", "/api/stationery", body)
req.Header.Set("Content-Type", writer.FormDataContentType()) req.Header.Set("Content-Type", writer.FormDataContentType())
@@ -55,8 +74,12 @@ func TestUploadStationery_ValidationErrors(t *testing.T) {
// Test missing required field // Test missing required field
body := &bytes.Buffer{} body := &bytes.Buffer{}
writer := multipart.NewWriter(body) writer := multipart.NewWriter(body)
writer.WriteField("stationery_name", "") // Empty stationery name if err := writer.WriteField("stationery_name", ""); err != nil { // Empty stationery name
writer.Close() t.Fatalf("Failed to write field: %v", err)
}
if err := writer.Close(); err != nil {
t.Fatalf("Failed to close writer: %v", err)
}
req := httptest.NewRequest("POST", "/api/stationery", body) req := httptest.NewRequest("POST", "/api/stationery", body)
req.Header.Set("Content-Type", writer.FormDataContentType()) req.Header.Set("Content-Type", writer.FormDataContentType())

View File

@@ -26,7 +26,7 @@ func main() {
if err != nil { if err != nil {
log.Fatalf("Failed to connect to database: %v", err) log.Fatalf("Failed to connect to database: %v", err)
} }
defer services.CloseDB() // Note: CloseDB is called explicitly in graceful shutdown, not in defer
log.Println("Database connected successfully") log.Println("Database connected successfully")
// Initialize Firebase // Initialize Firebase

View File

@@ -43,23 +43,25 @@ func ErrorHandler(c *fiber.Ctx) error {
// RecoverHandler recovers from panics and returns a proper error response // RecoverHandler recovers from panics and returns a proper error response
func RecoverHandler() fiber.Handler { func RecoverHandler() fiber.Handler {
return func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
// Log panic with context // Log panic with context
log.Printf("Panic recovered: %v | Method: %s | Path: %s | IP: %s", log.Printf("Panic recovered: %v | Method: %s | Path: %s | IP: %s",
r, r,
c.Method(), c.Method(),
c.Path(), c.Path(),
c.IP(), c.IP(),
) )
// Return error response // Return error response
c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ if err := c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false, "success": false,
"error": "Internal Server Error", "error": "Internal Server Error",
}) }); err != nil {
} log.Printf("Failed to send error response: %v", err)
}() }
}
}()
return c.Next() return c.Next()
} }