Ctrl K
ComunidadGuías…

server/internal/handlers/oidc_test.go

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

Archivo original ↗Preguntar a KiBot
package handlers_test

import (
	"context"
	"crypto/sha256"
	"encoding/hex"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"blackbox/server/internal/auth"
	"blackbox/server/internal/handlers"
	"blackbox/server/internal/models"
	"github.com/go-chi/chi/v5"
	"github.com/stretchr/testify/assert"
)

func TestOIDCProviderLogin_ReturnsServiceUnavailableWhenProviderUnavailable(t *testing.T) {
	database := newTestDB(t)
	registry := auth.NewOIDCRegistry(database)
	req := httptest.NewRequest(http.MethodGet, "/api/auth/oidc/provider-1/login", nil)
	rctx := chi.NewRouteContext()
	rctx.URLParams.Add("provider_id", "provider-1")
	req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx))
	w := httptest.NewRecorder()

	handlers.OIDCProviderLogin(database, registry)(w, req)

	assert.Equal(t, http.StatusServiceUnavailable, w.Code)
}

func TestOIDCProviderCallback_ReturnsServiceUnavailableWhenProviderUnavailable(t *testing.T) {
	database := newTestDB(t)
	registry := auth.NewOIDCRegistry(database)
	database.Create(&models.OIDCState{
		ID:         "01STATEID00000000",
		State:      "test-state",
		Nonce:      "test-nonce",
		ProviderID: "provider-1",
		ExpiresAt:  futureTime(t, 10),
	})

	req := httptest.NewRequest(http.MethodGet, "/api/auth/oidc/provider-1/callback?state=test-state", nil)
	sum := sha256.Sum256([]byte("provider-1"))
	req.AddCookie(&http.Cookie{Name: "oidc_state_" + hex.EncodeToString(sum[:8]), Value: "test-state"})
	rctx := chi.NewRouteContext()
	rctx.URLParams.Add("provider_id", "provider-1")
	req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx))
	w := httptest.NewRecorder()

	handlers.OIDCProviderCallback(database, registry, "jwt-test-secret")(w, req)

	assert.Equal(t, http.StatusServiceUnavailable, w.Code)
}

func TestOIDCProviderCallback_ReturnsBadRequestWhenStateCookieMissing(t *testing.T) {
	database := newTestDB(t)
	registry := auth.NewOIDCRegistry(database)
	req := httptest.NewRequest(http.MethodGet, "/api/auth/oidc/provider-1/callback", nil)
	rctx := chi.NewRouteContext()
	rctx.URLParams.Add("provider_id", "provider-1")
	req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx))
	w := httptest.NewRecorder()

	handlers.OIDCProviderCallback(database, registry, "jwt-test-secret")(w, req)

	assert.Equal(t, http.StatusBadRequest, w.Code)
}

func futureTime(t *testing.T, minutes int) time.Time {
	t.Helper()
	return time.Now().Add(time.Duration(minutes) * time.Minute)
}

func TestOIDCProviderCallback_LiveProviderFlow(t *testing.T) {
	t.Skip("requires live OIDC provider")
}