server/internal/handlers/health_test.go
Rama main · réplica de lectura del repositorio original.
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)
}