diff --git a/internal/middleware/middleware_internal_test.go b/internal/middleware/middleware_internal_test.go index ac3f128..9992a60 100644 --- a/internal/middleware/middleware_internal_test.go +++ b/internal/middleware/middleware_internal_test.go @@ -56,6 +56,61 @@ func TestSecurityHeaders(t *testing.T) { } } +func TestSecurityHeaders_PolicyHeaders(t *testing.T) { + t.Parallel() + + cfg := &config.Config{} + mw := &Middleware{ + log: slog.Default(), + config: cfg, + } + + testHandler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + }) + + handler := mw.SecurityHeaders()(testHandler) + + req := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/test", nil) + rec := httptest.NewRecorder() + + handler.ServeHTTP(rec, req) + + tests := []struct { + header string + want string + }{ + {"Strict-Transport-Security", "max-age=31536000; includeSubDomains"}, + { + "Content-Security-Policy", + "default-src 'self'; " + + "script-src 'self' 'unsafe-inline'; " + + "style-src 'self' 'unsafe-inline'; " + + "object-src 'none'; " + + "base-uri 'self'; " + + "form-action 'self'; " + + "frame-ancestors 'none'", + }, + { + "Permissions-Policy", + "accelerometer=(), autoplay=(), camera=(), " + + "display-capture=(), geolocation=(), gyroscope=(), " + + "magnetometer=(), microphone=(), payment=(), usb=()", + }, + } + + for _, tt := range tests { + t.Run(tt.header, func(t *testing.T) { + t.Parallel() + + got := rec.Header().Get(tt.header) + if got != tt.want { + t.Errorf("%s = %q, want %q", tt.header, got, tt.want) + } + }) + } +} + func TestSecurityHeaders_PreservesExistingHeaders(t *testing.T) { t.Parallel()