veza/veza-backend-api/internal/middleware/cors_test.go
senke 286be8ba1d
Some checks failed
Backend API CI / test-unit (push) Failing after 0s
Backend API CI / test-integration (push) Failing after 0s
Frontend CI / test (push) Failing after 0s
Storybook Audit / Build & audit Storybook (push) Failing after 0s
chore(v0.102): consolidate remaining changes — docs, frontend, backend
- docs: SCOPE_CONTROL, CONTRIBUTING, README, .github templates
- frontend: DeveloperDashboardView, Player components, MSW handlers, auth, reactQuerySync
- backend: playback_analytics, playlist_service, testutils, integration README

Excluded (artifacts): .auth, playwright-report, test-results, storybook_audit_detailed.json
2026-02-20 13:02:12 +01:00

202 lines
5.9 KiB
Go

package middleware
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
)
func TestCORS_AllowedOrigin(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(CORS([]string{"http://localhost:3000", "https://example.com"}))
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/test", nil)
req.Header.Set("Origin", "http://localhost:3000")
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
assert.Equal(t, "http://localhost:3000", w.Header().Get("Access-Control-Allow-Origin"))
assert.Equal(t, "GET, POST, PUT, PATCH, DELETE, OPTIONS", w.Header().Get("Access-Control-Allow-Methods"))
assert.Equal(t, "Authorization, Content-Type, X-Requested-With, X-CSRF-Token, X-API-Version, x-api-version", w.Header().Get("Access-Control-Allow-Headers"))
assert.Equal(t, "true", w.Header().Get("Access-Control-Allow-Credentials"))
}
func TestCORS_DisallowedOrigin(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(CORS([]string{"http://localhost:3000"}))
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/test", nil)
req.Header.Set("Origin", "http://evil.com")
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
// L'origine non autorisée ne doit pas être dans le header
assert.Empty(t, w.Header().Get("Access-Control-Allow-Origin"))
}
func TestCORS_Wildcard(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(CORS([]string{"*"}))
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/test", nil)
req.Header.Set("Origin", "http://any-origin.com")
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
assert.Equal(t, "http://any-origin.com", w.Header().Get("Access-Control-Allow-Origin"))
}
func TestCORS_NoOriginHeader(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(CORS([]string{"http://localhost:3000"}))
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/test", nil)
// Pas de header Origin
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
// Sans header Origin, le header Access-Control-Allow-Origin ne doit pas être défini
assert.Empty(t, w.Header().Get("Access-Control-Allow-Origin"))
}
func TestCORS_OPTIONSRequest(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(CORS([]string{"http://localhost:3000"}))
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("OPTIONS", "/test", nil)
req.Header.Set("Origin", "http://localhost:3000")
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusNoContent, w.Code)
assert.Equal(t, "http://localhost:3000", w.Header().Get("Access-Control-Allow-Origin"))
assert.Equal(t, "GET, POST, PUT, PATCH, DELETE, OPTIONS", w.Header().Get("Access-Control-Allow-Methods"))
}
func TestCORS_MultipleAllowedOrigins(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
allowedOrigins := []string{"http://localhost:3000", "https://example.com", "https://app.example.com"}
router.Use(CORS(allowedOrigins))
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
// Test avec la première origine
w1 := httptest.NewRecorder()
req1 := httptest.NewRequest("GET", "/test", nil)
req1.Header.Set("Origin", "http://localhost:3000")
router.ServeHTTP(w1, req1)
assert.Equal(t, "http://localhost:3000", w1.Header().Get("Access-Control-Allow-Origin"))
// Test avec la deuxième origine
w2 := httptest.NewRecorder()
req2 := httptest.NewRequest("GET", "/test", nil)
req2.Header.Set("Origin", "https://example.com")
router.ServeHTTP(w2, req2)
assert.Equal(t, "https://example.com", w2.Header().Get("Access-Control-Allow-Origin"))
// Test avec la troisième origine
w3 := httptest.NewRecorder()
req3 := httptest.NewRequest("GET", "/test", nil)
req3.Header.Set("Origin", "https://app.example.com")
router.ServeHTTP(w3, req3)
assert.Equal(t, "https://app.example.com", w3.Header().Get("Access-Control-Allow-Origin"))
}
func TestIsAllowedOrigin(t *testing.T) {
tests := []struct {
name string
origin string
allowed []string
expected bool
}{
{
name: "origin exact match",
origin: "http://localhost:3000",
allowed: []string{"http://localhost:3000"},
expected: true,
},
{
name: "origin not in list",
origin: "http://evil.com",
allowed: []string{"http://localhost:3000"},
expected: false,
},
{
name: "wildcard allows all",
origin: "http://any-origin.com",
allowed: []string{"*"},
expected: true,
},
{
name: "empty origin",
origin: "",
allowed: []string{"http://localhost:3000"},
expected: false,
},
{
name: "empty allowed list",
origin: "http://localhost:3000",
allowed: []string{},
expected: false,
},
{
name: "multiple allowed origins",
origin: "https://example.com",
allowed: []string{"http://localhost:3000", "https://example.com"},
expected: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := isAllowedOrigin(tt.origin, tt.allowed)
assert.Equal(t, tt.expected, result)
})
}
}
func TestCORSDefault(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(CORSDefault())
router.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{"ok": true})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/test", nil)
req.Header.Set("Origin", "http://any-origin.com")
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
assert.Equal(t, "http://any-origin.com", w.Header().Get("Access-Control-Allow-Origin"))
}