- Add TestMain to all 10 test packages (schema DROP+CREATE runs once per package) - Convert per-test setupTestDB to resetTestData (TRUNCATE only, ~60% faster) - Add 3 missing tables to TruncateTables (booking_edit_requests, exceptional_group_applications, business_settings) - Remove dead truncateDiscountTables helper - Consolidate discount_test.go into package bookings (was external test package) - Update testutils.SetupTestDB to truncate-only - Fix unused imports across user, bookings, and handlers packages - Verify: 286 passing, 2 skipped, 0 failures with -count=2 (no state leakage)
121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
//go:build test
|
|
// +build test
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
|
|
"crussell/db"
|
|
"crussell/testutils/testdb"
|
|
)
|
|
|
|
func TestMain(m *testing.M) {
|
|
pool, err := testdb.NewPool("")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
testdb.Migrate(&testing.T{}, pool)
|
|
db.DB = pool
|
|
code := m.Run()
|
|
pool.Close()
|
|
os.Exit(code)
|
|
}
|
|
|
|
func TestHealthCheck_OK(t *testing.T) {
|
|
testdb.TruncateTables(t, db.DB)
|
|
|
|
// Create request and recorder
|
|
req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
// Call handler directly
|
|
healthCheckHandler(w, req)
|
|
|
|
// Assert 200 OK
|
|
if w.Code != http.StatusOK {
|
|
t.Errorf("expected status %d, got %d. body: %s", http.StatusOK, w.Code, w.Body.String())
|
|
}
|
|
|
|
// Parse JSON response
|
|
var response map[string]interface{}
|
|
if err := json.Unmarshal(w.Body.Bytes(), &response); err != nil {
|
|
t.Fatalf("failed to parse JSON response: %v", err)
|
|
}
|
|
|
|
// Assert status == "ok"
|
|
status, ok := response["status"].(string)
|
|
if !ok || status != "ok" {
|
|
t.Errorf("expected status 'ok', got '%v'", response["status"])
|
|
}
|
|
|
|
// Assert services
|
|
services, ok := response["services"].(map[string]interface{})
|
|
if !ok {
|
|
t.Fatalf("services not found in response")
|
|
}
|
|
|
|
// Assert services.backend == "ok"
|
|
backend, ok := services["backend"].(string)
|
|
if !ok || backend != "ok" {
|
|
t.Errorf("expected services.backend 'ok', got '%v'", services["backend"])
|
|
}
|
|
|
|
// Assert services.database == "ok"
|
|
database, ok := services["database"].(string)
|
|
if !ok || database != "ok" {
|
|
t.Errorf("expected services.database 'ok', got '%v'", services["database"])
|
|
}
|
|
}
|
|
|
|
func TestHealthCheck_Degraded(t *testing.T) {
|
|
testdb.TruncateTables(t, db.DB)
|
|
|
|
// Set db.DB to nil to simulate degraded state
|
|
originalDB := db.DB
|
|
db.DB = nil
|
|
|
|
// Create request and recorder
|
|
req := httptest.NewRequest(http.MethodGet, "/api/health", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
// Call handler directly
|
|
healthCheckHandler(w, req)
|
|
|
|
// Assert 503 Service Unavailable
|
|
if w.Code != http.StatusServiceUnavailable {
|
|
t.Errorf("expected status %d, got %d. body: %s", http.StatusServiceUnavailable, w.Code, w.Body.String())
|
|
}
|
|
|
|
// Parse JSON response
|
|
var response map[string]interface{}
|
|
if err := json.Unmarshal(w.Body.Bytes(), &response); err != nil {
|
|
t.Fatalf("failed to parse JSON response: %v", err)
|
|
}
|
|
|
|
// Assert status == "degraded"
|
|
status, ok := response["status"].(string)
|
|
if !ok || status != "degraded" {
|
|
t.Errorf("expected status 'degraded', got '%v'", response["status"])
|
|
}
|
|
|
|
// Assert services
|
|
services, ok := response["services"].(map[string]interface{})
|
|
if !ok {
|
|
t.Fatalf("services not found in response")
|
|
}
|
|
|
|
// Assert services.database == "error"
|
|
database, ok := services["database"].(string)
|
|
if !ok || database != "error" {
|
|
t.Errorf("expected services.database 'error', got '%v'", services["database"])
|
|
}
|
|
|
|
// Restore original db.DB
|
|
db.DB = originalDB
|
|
}
|