from limiter import RateLimiter from window import SlidingWindow def test_window_prunes_expired_events(): w = SlidingWindow(10) for t in range(5): w.add(t) w.count(100) assert len(w.events) == 0, "expired events must be dropped, not just skipped" def test_limiter_allows_again_after_the_window_passes(): r = RateLimiter(limit=2, span=10) assert r.allow(0) assert r.allow(1) assert not r.allow(2) assert r.allow(100) def test_limiter_reports_remaining(): r = RateLimiter(limit=3, span=10) r.allow(0) assert r.remaining(0) == 2