Ctrl K
ComunidadGuías…

server/internal/handlers/health_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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)
}