package handlers_test import ( "encoding/json" "net/http" "net/http/httptest" "testing" "blackbox/server/internal/auth" "blackbox/server/internal/db" "blackbox/server/internal/handlers" "blackbox/server/internal/models" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestHealthCheck_DatabaseOKOIDCDisabled(t *testing.T) { database := newTestDB(t) registry := auth.NewOIDCRegistry(database) req := httptest.NewRequest(http.MethodGet, "/api/setup/health", nil) w := httptest.NewRecorder() handlers.HealthCheck(database, registry)(w, req) assert.Equal(t, http.StatusOK, w.Code) var resp map[string]interface{} require.NoError(t, json.NewDecoder(w.Body).Decode(&resp)) assert.Equal(t, "ok", resp["database"]) assert.Equal(t, "disabled", resp["oidc"]) assert.Equal(t, false, resp["oidc_enabled"]) } func TestHealthCheck_OIDCReady(t *testing.T) { database := newTestDB(t) registry := auth.NewOIDCRegistry(database) require.NoError(t, database.Create(&models.OIDCProviderConfig{ ID: "provider-1", Name: "SSO", Issuer: "https://issuer.example.com", ClientID: "client-id", ClientSecret: "client-secret", RedirectURL: "https://app.example.com/callback", Enabled: models.BoolPtr(true), }).Error) setRegistryProvider(t, registry, "provider-1", &auth.OIDCProvider{}) req := httptest.NewRequest(http.MethodGet, "/api/setup/health", nil) w := httptest.NewRecorder() handlers.HealthCheck(database, registry)(w, req) var resp map[string]interface{} require.NoError(t, json.NewDecoder(w.Body).Decode(&resp)) assert.Equal(t, "ok", resp["oidc"]) assert.Equal(t, true, resp["oidc_enabled"]) } func TestHealthCheck_OIDCEnabledButNotReady(t *testing.T) { database := newTestDB(t) registry := auth.NewOIDCRegistry(database) require.NoError(t, database.Create(&models.OIDCProviderConfig{ ID: "provider-1", Name: "SSO", Issuer: "https://issuer.example.com", ClientID: "client-id", ClientSecret: "client-secret", RedirectURL: "https://app.example.com/callback", Enabled: models.BoolPtr(true), }).Error) req := httptest.NewRequest(http.MethodGet, "/api/setup/health", nil) w := httptest.NewRecorder() handlers.HealthCheck(database, registry)(w, req) var resp map[string]interface{} require.NoError(t, json.NewDecoder(w.Body).Decode(&resp)) assert.Equal(t, "unavailable", resp["oidc"]) } func TestHealthCheck_DBError_Returns503(t *testing.T) { database, err := db.Init(":memory:") require.NoError(t, err) sqlDB, err := database.DB() require.NoError(t, err) require.NoError(t, sqlDB.Close()) req := httptest.NewRequest(http.MethodGet, "/api/setup/health", nil) w := httptest.NewRecorder() handlers.HealthCheck(database, nil)(w, req) assert.Equal(t, http.StatusServiceUnavailable, w.Code) var resp map[string]interface{} require.NoError(t, json.NewDecoder(w.Body).Decode(&resp)) assert.Equal(t, "error", resp["database"]) } func setRegistryProvider(t *testing.T, registry *auth.OIDCRegistry, id string, provider *auth.OIDCProvider) { t.Helper() registry.SetProvider(id, provider) }