27 lines
979 B
JavaScript
27 lines
979 B
JavaScript
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);
|
|
});
|
|
});
|