package handlers import ( "bytes" "mime/multipart" "net/http/httptest" "testing" "github.com/gofiber/fiber/v2" ) func TestUploadBook(t *testing.T) { // This test requires database and Firebase to be initialized // Skip if not available t.Skip("Skipping UploadBook test - requires database and Firebase") app := fiber.New() app.Post("/api/books", UploadBook) // Create multipart form with test data body := &bytes.Buffer{} writer := multipart.NewWriter(body) // Add form fields if err := writer.WriteField("book_name", "Test Book"); err != nil { t.Fatalf("Failed to write field: %v", err) } if err := writer.WriteField("cost", "10.50"); err != nil { t.Fatalf("Failed to write field: %v", err) } 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 part, err := writer.CreateFormFile("image", "test.png") 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) } if err := writer.Close(); err != nil { t.Fatalf("Failed to close writer: %v", err) } req := httptest.NewRequest("POST", "/api/books", body) req.Header.Set("Content-Type", writer.FormDataContentType()) resp, err := app.Test(req) if err != nil { t.Fatalf("Test request failed: %v", err) } if resp.StatusCode != fiber.StatusCreated { t.Errorf("Expected status %d, got %d", fiber.StatusCreated, resp.StatusCode) } } func TestUploadBook_ValidationErrors(t *testing.T) { app := fiber.New() app.Post("/api/books", UploadBook) // Test missing required field body := &bytes.Buffer{} writer := multipart.NewWriter(body) if err := writer.WriteField("book_name", ""); err != nil { // Empty book name 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.Header.Set("Content-Type", writer.FormDataContentType()) resp, err := app.Test(req) if err != nil { t.Fatalf("Test request failed: %v", err) } if resp.StatusCode != fiber.StatusBadRequest { t.Errorf("Expected status %d, got %d", fiber.StatusBadRequest, resp.StatusCode) } }