import "../setup.ts"; import { assert, assertFalse } from "@std/assert"; import { FakeTime } from "@std/testing/time"; import { takeToken } from "../../lib/rate-limit.ts"; Deno.test("takeToken: bursts to capacity, then refills over time", () => { using time = new FakeTime(); const key = `test:${crypto.randomUUID()}`; const limit = { capacity: 3, refill: 1 }; // one token a second assert(takeToken(key, limit)); assert(takeToken(key, limit)); assert(takeToken(key, limit)); assertFalse(takeToken(key, limit)); time.tick(500); assertFalse(takeToken(key, limit)); time.tick(500); assert(takeToken(key, limit)); assertFalse(takeToken(key, limit)); // Refill never exceeds capacity. time.tick(60_000); assert(takeToken(key, limit)); assert(takeToken(key, limit)); assert(takeToken(key, limit)); assertFalse(takeToken(key, limit)); // Keys are independent. assert(takeToken(`${key}:other`, limit)); });