Fix lint errors: add error checks for errcheck linter
- 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:
@@ -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())
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
2
main.go
2
main.go
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user