From 73fc21b6a84effa487f4f1fc0c1c21832eb6660e Mon Sep 17 00:00:00 2001 From: sneak Date: Mon, 21 Sep 2026 18:16:20 +0000 Subject: [PATCH] test: assert HSTS, CSP, and Permissions-Policy headers Failing test for the three security headers required before 1.0 (issue #91). Implementation follows in the next commit. Model: opus-4-8 --- .../middleware/middleware_internal_test.go | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) 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()