package middleware import ( "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestDashboardAuthDisabledWhenEmpty(t *testing.T) { called := false handler := DashboardAuth("")(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true w.WriteHeader(http.StatusOK) })) req := httptest.NewRequest(http.MethodGet, "/dashboard", nil) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) if !called { t.Fatal("expected handler to be called when password is empty") } if rr.Code != http.StatusOK { t.Fatalf("expected 200, got %d", rr.Code) } } func TestDashboardAuthRejectsNoCredentials(t *testing.T) { handler := DashboardAuth("secret")(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) req := httptest.NewRequest(http.MethodGet, "/dashboard", nil) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) if rr.Code != http.StatusUnauthorized { t.Fatalf("expected 401, got %d", rr.Code) } // Verify JSON response body var body map[string]string if err := json.NewDecoder(rr.Body).Decode(&body); err != nil { t.Fatalf("expected JSON response, got error: %v", err) } if body["error"] != "unauthorized" { t.Fatalf("expected error=unauthorized, got %q", body["error"]) } } func TestDashboardAuthRejectsWrongPassword(t *testing.T) { handler := DashboardAuth("secret")(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) req := httptest.NewRequest(http.MethodGet, "/dashboard", nil) req.SetBasicAuth("admin", "wrong") rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) if rr.Code != http.StatusUnauthorized { t.Fatalf("expected 401, got %d", rr.Code) } } func TestDashboardAuthAcceptsValidCredentials(t *testing.T) { called := false handler := DashboardAuth("secret")(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true w.WriteHeader(http.StatusOK) })) req := httptest.NewRequest(http.MethodGet, "/dashboard", nil) req.SetBasicAuth("admin", "secret") rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) if !called { t.Fatal("expected handler to be called with valid credentials") } if rr.Code != http.StatusOK { t.Fatalf("expected 200, got %d", rr.Code) } } func TestWriteJSONSetsContentType(t *testing.T) { rr := httptest.NewRecorder() writeJSON(rr, http.StatusForbidden, map[string]string{"error": "forbidden"}) if ct := rr.Header().Get("Content-Type"); ct != "application/json" { t.Fatalf("expected Content-Type application/json, got %q", ct) } if rr.Code != http.StatusForbidden { t.Fatalf("expected status 403, got %d", rr.Code) } var body map[string]string if err := json.NewDecoder(rr.Body).Decode(&body); err != nil { t.Fatalf("expected valid JSON, got error: %v", err) } if body["error"] != "forbidden" { t.Fatalf("expected error=forbidden, got %q", body["error"]) } }