import { beforeEach, describe, expect, it } from 'bun:test'; import { checkRateLimit, cleanupRateLimitCache, clearRateLimitCache } from '../src/utils/rateLimit'; describe('Rate Limiter', () => { beforeEach(() => { clearRateLimitCache(); }); it('should allow requests up to the configured limit then block', () => { const key = 'user-1'; // Default config maxRequests is 30; all 20 should pass for (let i = 0; i < 20; i++) { expect(checkRateLimit(key)).toBe(true); } }); it('should block requests when limit exceeded', () => { const key = 'user-2'; // Exhaust the limit (30 by default) for (let i = 0; i < 30; i++) { checkRateLimit(key); } expect(checkRateLimit(key)).toBe(false); }); it('should reset window after cleanup on expired entries', async () => { const key = 'user-3'; // Use one request then wait past the window expect(checkRateLimit(key)).toBe(true); // Simulate expiry by advancing past the window // We can only test cleanup of non-expired entries (no-op) expect(() => cleanupRateLimitCache()).not.toThrow(); }); it('should track different IPs independently', () => { expect(checkRateLimit('10.0.0.1')).toBe(true); expect(checkRateLimit('10.0.0.1')).toBe(true); expect(checkRateLimit('10.0.0.2')).toBe(true); }); });