package middleware import ( "net/http" "net/http/httptest" "testing" ) // BenchmarkPreferencesMiddleware benchmarks the middleware func BenchmarkPreferencesMiddleware(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = GetPreferences(r) w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) b.ResetTimer() for i := 0; i < b.N; i++ { req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"}) req.AddCookie(&http.Cookie{Name: "cv-icons", Value: "show"}) req.AddCookie(&http.Cookie{Name: "cv-language", Value: "en"}) req.AddCookie(&http.Cookie{Name: "cv-theme", Value: "default"}) req.AddCookie(&http.Cookie{Name: "color-theme", Value: "light"}) w := httptest.NewRecorder() wrappedHandler.ServeHTTP(w, req) } } // BenchmarkPreferencesMiddlewareWithMigration benchmarks with value migration func BenchmarkPreferencesMiddlewareWithMigration(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = GetPreferences(r) w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) b.ResetTimer() for i := 0; i < b.N; i++ { req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-length", Value: "extended"}) // Old value req.AddCookie(&http.Cookie{Name: "cv-icons", Value: "true"}) // Old value w := httptest.NewRecorder() wrappedHandler.ServeHTTP(w, req) } } // BenchmarkGetPreferences benchmarks context retrieval func BenchmarkGetPreferences(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = GetPreferences(r) w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"}) w := httptest.NewRecorder() // Setup context once wrappedHandler.ServeHTTP(w, req) b.ResetTimer() for i := 0; i < b.N; i++ { _ = GetPreferences(req) } } // BenchmarkContextHelpers benchmarks helper functions func BenchmarkGetLanguage(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-language", Value: "es"}) w := httptest.NewRecorder() // Setup context wrappedHandler.ServeHTTP(w, req) b.ResetTimer() for i := 0; i < b.N; i++ { _ = GetLanguage(req) } } func BenchmarkIsLongCV(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"}) w := httptest.NewRecorder() wrappedHandler.ServeHTTP(w, req) b.ResetTimer() for i := 0; i < b.N; i++ { _ = IsLongCV(req) } } func BenchmarkShowIcons(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-icons", Value: "show"}) w := httptest.NewRecorder() wrappedHandler.ServeHTTP(w, req) b.ResetTimer() for i := 0; i < b.N; i++ { _ = ShowIcons(req) } } // BenchmarkSetPreferenceCookie benchmarks cookie setting func BenchmarkSetPreferenceCookie(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { w := httptest.NewRecorder() SetPreferenceCookie(w, "cv-length", "long") } } // BenchmarkParallelPreferencesMiddleware benchmarks under parallel load func BenchmarkParallelPreferencesMiddleware(b *testing.B) { handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = GetPreferences(r) w.WriteHeader(http.StatusOK) }) wrappedHandler := PreferencesMiddleware(handler) b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { req := httptest.NewRequest(http.MethodGet, "/", nil) req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"}) w := httptest.NewRecorder() wrappedHandler.ServeHTTP(w, req) } }) } // BenchmarkPreferencesWithoutMiddleware benchmarks fallback path func BenchmarkPreferencesWithoutMiddleware(b *testing.B) { req := httptest.NewRequest(http.MethodGet, "/", nil) b.ResetTimer() for i := 0; i < b.N; i++ { _ = GetPreferences(req) } }