//go:build dev && !test package mw import ( "net/http" "net/http/httptest" "testing" "time" ) // The dev build (ratelimit_dev.go) swaps the real rate limiters for no-op // passthroughs so the dev seed (11+ logins, bursty seeding traffic) never // trips a limiter. These tests pin that contract for a pure dev build // (-tags dev, no test tag): every request passes through untouched. func TestDevBuild_RateLimit_PassesEverythingThrough(t *testing.T) { handler := RateLimit(2, time.Minute)(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) for i := 0; i < 25; i++ { req := httptest.NewRequest(http.MethodGet, "/", nil) req.RemoteAddr = "192.0.2.1:1234" w := httptest.NewRecorder() handler.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Fatalf("dev no-op RateLimit blocked request %d with %d", i+1, w.Code) } } } func TestDevBuild_ProgressiveRateLimit_PassesEverythingThrough(t *testing.T) { handler := ProgressiveRateLimit(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) for i := 0; i < 100; i++ { req := httptest.NewRequest(http.MethodGet, "/", nil) req.RemoteAddr = "192.0.2.1:1234" w := httptest.NewRecorder() handler.ServeHTTP(w, req) if w.Code != http.StatusOK { t.Fatalf("dev no-op ProgressiveRateLimit blocked request %d with %d", i+1, w.Code) } if got := w.Header().Get("X-RateLimit-Delay"); got != "" { t.Fatalf("dev no-op ProgressiveRateLimit set X-RateLimit-Delay on request %d: %q", i+1, got) } } }