package middleware import ( "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestSecurityHeaders(t *testing.T) { handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) }) wrapped := SecurityHeaders(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) rec := httptest.NewRecorder() wrapped.ServeHTTP(rec, req) assert.Equal(t, http.StatusOK, rec.Code) // Verify all security headers are set assert.Equal(t, "nosniff", rec.Header().Get("X-Content-Type-Options")) assert.Equal(t, "DENY", rec.Header().Get("X-Frame-Options")) assert.Equal(t, "1; mode=block", rec.Header().Get("X-XSS-Protection")) assert.Equal(t, "strict-origin-when-cross-origin", rec.Header().Get("Referrer-Policy")) assert.Equal(t, "geolocation=(), microphone=(), camera=()", rec.Header().Get("Permissions-Policy")) } func TestSecurityHeaders_PreservesExistingHeaders(t *testing.T) { handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("X-Custom-Header", "custom-value") w.WriteHeader(http.StatusOK) }) wrapped := SecurityHeaders(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) rec := httptest.NewRecorder() wrapped.ServeHTTP(rec, req) // Security headers should be set assert.Equal(t, "nosniff", rec.Header().Get("X-Content-Type-Options")) // Handler's headers should also be present assert.Equal(t, "application/json", rec.Header().Get("Content-Type")) assert.Equal(t, "custom-value", rec.Header().Get("X-Custom-Header")) } func TestSecurityHeaders_CallsNextHandler(t *testing.T) { called := false handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { called = true w.WriteHeader(http.StatusOK) }) wrapped := SecurityHeaders(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) rec := httptest.NewRecorder() wrapped.ServeHTTP(rec, req) assert.True(t, called, "next handler should have been called") }