All checks were successful
Build and Publish Docker Image / build-and-push (push) Successful in 50s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 lines
941 B
TypeScript
28 lines
941 B
TypeScript
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));
|
|
});
|