From 9ca102153b64963d758e8fbba16f2b8f839a764e Mon Sep 17 00:00:00 2001 From: Stephen Adamson Date: Sun, 22 Feb 2026 00:06:03 +0000 Subject: [PATCH] Add crussell_test database creation and schema seeding to dev script - Create crussell_test database after PostgreSQL reset - Seed test DB schema from init-script.sql so tests can run - This fixes the TLS connection errors in test runs Also: - Fixed color variables in script (C_RESET, C_GREEN, etc.) --- backend/handlers/portfolio/images_test.go | 3 +++ .../handlers/scheduling/scheduling_test.go | 11 +++++------ backend/testutils/testdb/testdb.go | 2 ++ local-dev-2.sh | 19 ++++++++++++++++++- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/backend/handlers/portfolio/images_test.go b/backend/handlers/portfolio/images_test.go index cf14fe4..3200484 100644 --- a/backend/handlers/portfolio/images_test.go +++ b/backend/handlers/portfolio/images_test.go @@ -23,6 +23,9 @@ func setupTestDB(t *testing.T) func() { pool := testdb.Pool(t) testdb.Migrate(t, pool) + // Truncate tables to ensure clean state + testdb.TruncateTables(t, pool) + originalDB := db.DB db.DB = pool diff --git a/backend/handlers/scheduling/scheduling_test.go b/backend/handlers/scheduling/scheduling_test.go index a7865ea..3a2a04e 100644 --- a/backend/handlers/scheduling/scheduling_test.go +++ b/backend/handlers/scheduling/scheduling_test.go @@ -85,7 +85,7 @@ func makeRequest(handler http.HandlerFunc, method, path string, body interface{} return w } -func makeAuthRequest(handler http.HandlerFunc, method, path, token string, body interface{}) *httptest.ResponseRecorder { +func makeAuthRequest(handler http.Handler, method, path, token string, body interface{}) *httptest.ResponseRecorder { var req *http.Request if body != nil { bodyBytes, _ := json.Marshal(body) @@ -197,7 +197,6 @@ func TestScheduling_UpdateDefaultHours_NonAdmin(t *testing.T) { defer cleanup() userToken := jwt.GenerateUserToken("user-123") - handler := http.HandlerFunc(UpdateDefaultHours) newHours := []DefaultHours{ {Weekday: 0, StartTime: "08:00", EndTime: "18:00", IsOpen: true}, @@ -210,7 +209,7 @@ func TestScheduling_UpdateDefaultHours_NonAdmin(t *testing.T) { } // Wrap handler with RequireAdmin middleware - w := makeAuthRequest(mw.RequireAdmin(UpdateDefaultHours), "PUT", "/api/scheduling/default-hours", userToken, newHours) + w := makeAuthRequest(mw.RequireAdmin(http.HandlerFunc(UpdateDefaultHours)), "PUT", "/api/scheduling/default-hours", userToken, newHours) if w.Code != http.StatusForbidden { t.Errorf("expected status 403, got %d. body: %s", w.Code, w.Body.String()) @@ -318,7 +317,7 @@ func TestScheduling_CreateExceptionalGroup_NonAdmin(t *testing.T) { WeekStarts: []string{"2026-06-01"}, } - w := makeAuthRequest(mw.RequireAdmin(CreateExceptionalGroup), "POST", "/api/scheduling/exceptional-groups", userToken, newGroup) + w := makeAuthRequest(mw.RequireAdmin(http.HandlerFunc(CreateExceptionalGroup)), "POST", "/api/scheduling/exceptional-groups", userToken, newGroup) if w.Code != http.StatusForbidden { t.Errorf("expected status 403, got %d. body: %s", w.Code, w.Body.String()) @@ -378,7 +377,7 @@ func TestScheduling_DeleteExceptionalGroup_NonAdmin(t *testing.T) { userToken := jwt.GenerateUserToken("user-123") - handler := mw.RequireAdmin(DeleteExceptionalGroup) + handler := mw.RequireAdmin(http.HandlerFunc(DeleteExceptionalGroup)) req := httptest.NewRequest("DELETE", "/api/scheduling/exceptional-groups?id=1", nil) req.Header.Set("Authorization", "Bearer "+userToken) w := httptest.NewRecorder() @@ -507,7 +506,7 @@ func TestScheduling_UpdateExceptionalApplications_NonAdmin(t *testing.T) { defer cleanup() userToken := jwt.GenerateUserToken("user-123") - handler := mw.RequireAdmin(UpdateExceptionalApplications) + handler := mw.RequireAdmin(http.HandlerFunc(UpdateExceptionalApplications)) reqBody := map[string]interface{}{ "groupId": 1, diff --git a/backend/testutils/testdb/testdb.go b/backend/testutils/testdb/testdb.go index 868472a..4507a84 100644 --- a/backend/testutils/testdb/testdb.go +++ b/backend/testutils/testdb/testdb.go @@ -132,6 +132,8 @@ func TruncateTables(t *testing.T, pool *pgxpool.Pool) { "exceptional_working_hours", "exceptional_working_hours_groups", "users", + "images", + "tags", } for _, table := range tables { diff --git a/local-dev-2.sh b/local-dev-2.sh index 50e782e..7e35871 100755 --- a/local-dev-2.sh +++ b/local-dev-2.sh @@ -14,6 +14,12 @@ C_GREEN=$'\033[32m' C_RED=$'\033[31m' C_BLUE=$'\033[34m' C_YELLOW=$'\033[33m' +# Color codes for output +C_RESET=$'\033[0m' +C_GREEN=$'\033[32m' +C_RED=$'\033[31m' +C_BLUE=$'\033[34m' +C_YELLOW=$'\033[33m' log_info() { echo "🔹 $1" } log_success() { echo "✅ $1" } log_error() { echo "❌ $1" } @@ -49,7 +55,18 @@ docker compose up postgres -d > /dev/null 2>&1 log_success "PostgreSQL reset complete" sleep 3 -# --- 3b. Rustfs (don't wipe data, just restart) --- +# --- 3b. Create Test Database --- +log_step "Setting up test database (crussell_test)..." +docker exec postgres psql -U myuser -d mydb -c "CREATE DATABASE crussell_test;" 2>/dev/null || true +log_success "Test database ready" +sleep 1 + +# --- 3c. Seed Test Database Schema --- +log_step "Seeding test database schema..." +docker exec -i postgres psql -U myuser -d crussell_test < init-scripts/init-script.sql > /dev/null 2>&1 || true +log_success "Test database schema ready" + +# --- 3d. Rustfs (don't wipe data, just restart) --- log_step "Restarting Rustfs (S3-compatible storage)..." docker compose restart rustfs > /dev/null 2>&1 log_success "Rustfs restarted"