package server import ( "testing" "time" ) func TestLoginRateLimiter_BlocksAfterMaxAttempts(t *testing.T) { l := newLoginRateLimiter(3, time.Minute) key := "1.2.3.4|alice" for i := 0; i < 3; i++ { if !l.allow(key) { t.Fatalf("attempt %d should be allowed", i+1) } } if l.allow(key) { t.Fatalf("4th attempt within window should be blocked") } } func TestLoginRateLimiter_ResetClearsWindow(t *testing.T) { l := newLoginRateLimiter(2, time.Minute) key := "1.2.3.4|bob" l.allow(key) l.allow(key) if l.allow(key) { t.Fatalf("should be blocked before reset") } l.reset(key) if !l.allow(key) { t.Fatalf("should be allowed after reset") } } func TestLoginRateLimiter_WindowExpiry(t *testing.T) { l := newLoginRateLimiter(1, 10*time.Millisecond) key := "1.2.3.4|carol" l.allow(key) if l.allow(key) { t.Fatalf("should be blocked within window") } time.Sleep(20 * time.Millisecond) if !l.allow(key) { t.Fatalf("should be allowed after window expiry") } }