import { describe, expect, it } from 'vitest'; import { createRateLimiter } from '../src/rate-limit.js'; describe('rate limiter', () => { it('enforces request and spend windows', () => { let time = 0; const limiter = createRateLimiter({ now: () => time }); expect(limiter.check('ip').allowed).toBe(true); expect(limiter.check('ip').allowed).toBe(true); expect(limiter.check('ip').allowed).toBe(false); time = 1_001; expect(limiter.check('ip').allowed).toBe(true); limiter.recordCost('ip', 10); expect(limiter.check('ip').allowed).toBe(false); time = 5 * 60 * 60 * 1_000 + 1_002; expect(limiter.check('ip').allowed).toBe(true); }); it('keeps clients independent', () => { const limiter = createRateLimiter(); expect(limiter.check('a').allowed).toBe(true); expect(limiter.check('a').allowed).toBe(true); expect(limiter.check('a').allowed).toBe(false); expect(limiter.check('b').allowed).toBe(true); }); });