package dev.coph.nextusweb.server.ratelimit; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class FixedWindowLimiterTest { @Test void allowsUpToLimitThenDenies() { FixedWindowLimiter lim = new FixedWindowLimiter(3, 1000); assertTrue(lim.tryAcquire("k", 0).allowed()); assertTrue(lim.tryAcquire("k", 0).allowed()); assertTrue(lim.tryAcquire("k", 0).allowed()); RateLimiter.Result r = lim.tryAcquire("k", 0); assertFalse(r.allowed()); assertEquals(3, r.limit()); assertTrue(r.retryAfterMillis() > 0); } @Test void newWindowResetsCount() { FixedWindowLimiter lim = new FixedWindowLimiter(1, 100); assertTrue(lim.tryAcquire("k", 0).allowed()); assertFalse(lim.tryAcquire("k", 0).allowed()); long windowNs = 100L * 1_000_000L; assertTrue(lim.tryAcquire("k", windowNs).allowed()); } @Test void differentKeysAreIndependent() { FixedWindowLimiter lim = new FixedWindowLimiter(1, 1000); assertTrue(lim.tryAcquire("a", 0).allowed()); assertTrue(lim.tryAcquire("b", 0).allowed()); } @Test void cleanupDoesNotThrow() { FixedWindowLimiter lim = new FixedWindowLimiter(1, 1000); lim.tryAcquire("k", System.nanoTime()); assertDoesNotThrow(() -> lim.cleanup(0)); } }