Files
Charon/backend/internal/api/handlers/forward_auth_handler_test.go
Wikid82 7a1f577771 feat: add forward authentication configuration and UI
- Introduced ForwardAuthConfig model to store global forward authentication settings.
- Updated Manager to fetch and apply forward authentication configuration.
- Added ForwardAuthHandler to create a reverse proxy handler for authentication.
- Enhanced ProxyHost model to include forward authentication options.
- Created Security page and ForwardAuthSettings component for managing authentication settings.
- Implemented API endpoints for fetching and updating forward authentication configuration.
- Added tests for new functionality including validation and error handling.
- Updated frontend components to support forward authentication settings.
2025-11-25 13:25:05 +00:00

119 lines
3.0 KiB
Go

package handlers
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/models"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func setupForwardAuthTestDB() *gorm.DB {
db, _ := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
db.AutoMigrate(&models.ForwardAuthConfig{})
return db
}
func TestForwardAuthHandler_GetConfig(t *testing.T) {
db := setupForwardAuthTestDB()
h := NewForwardAuthHandler(db)
gin.SetMode(gin.TestMode)
r := gin.New()
r.GET("/config", h.GetConfig)
// Test empty config (default)
req, _ := http.NewRequest("GET", "/config", nil)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
var resp models.ForwardAuthConfig
json.Unmarshal(w.Body.Bytes(), &resp)
assert.Equal(t, "custom", resp.Provider)
// Test existing config
db.Create(&models.ForwardAuthConfig{
Provider: "authelia",
Address: "http://test",
})
req, _ = http.NewRequest("GET", "/config", nil)
w = httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
json.Unmarshal(w.Body.Bytes(), &resp)
assert.Equal(t, "authelia", resp.Provider)
}
func TestForwardAuthHandler_UpdateConfig(t *testing.T) {
db := setupForwardAuthTestDB()
h := NewForwardAuthHandler(db)
gin.SetMode(gin.TestMode)
r := gin.New()
r.POST("/config", h.UpdateConfig)
// Test Create
payload := map[string]interface{}{
"provider": "authelia",
"address": "http://authelia:9091",
"trust_forward_header": true,
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "/config", bytes.NewBuffer(body))
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
var resp models.ForwardAuthConfig
json.Unmarshal(w.Body.Bytes(), &resp)
assert.Equal(t, "authelia", resp.Provider)
// Test Update
payload["provider"] = "authentik"
body, _ = json.Marshal(payload)
req, _ = http.NewRequest("POST", "/config", bytes.NewBuffer(body))
w = httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
json.Unmarshal(w.Body.Bytes(), &resp)
assert.Equal(t, "authentik", resp.Provider)
// Test Validation Error
payload["address"] = "not-a-url"
body, _ = json.Marshal(payload)
req, _ = http.NewRequest("POST", "/config", bytes.NewBuffer(body))
w = httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusBadRequest, w.Code)
}
func TestForwardAuthHandler_GetTemplates(t *testing.T) {
db := setupForwardAuthTestDB()
h := NewForwardAuthHandler(db)
gin.SetMode(gin.TestMode)
r := gin.New()
r.GET("/templates", h.GetTemplates)
req, _ := http.NewRequest("GET", "/templates", nil)
w := httptest.NewRecorder()
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
var resp map[string]interface{}
json.Unmarshal(w.Body.Bytes(), &resp)
assert.Contains(t, resp, "authelia")
assert.Contains(t, resp, "authentik")
}