




















@@ -1,6 +1,15 @@
11import { describe, expect, it } from "vitest";
22import { createFixedWindowRateLimiter } from "./fixed-window-rate-limit.js";
334+function expectConsumeResult(
5+result: { allowed: boolean; remaining: number; retryAfterMs: number },
6+expected: { allowed: boolean; remaining: number; retryAfterMs: number },
7+): void {
8+expect(result.allowed).toBe(expected.allowed);
9+expect(result.remaining).toBe(expected.remaining);
10+expect(result.retryAfterMs).toBe(expected.retryAfterMs);
11+}
12+413describe("fixed-window rate limiter", () => {
514it("blocks after max requests until window reset", () => {
615let nowMs = 1_000;
@@ -10,12 +19,12 @@ describe("fixed-window rate limiter", () => {
1019now: () => nowMs,
1120});
122113-expect(limiter.consume()).toMatchObject({ allowed: true, remaining: 1 });
14-expect(limiter.consume()).toMatchObject({ allowed: true, remaining: 0 });
15-expect(limiter.consume()).toMatchObject({ allowed: false, retryAfterMs: 1_000 });
22+expectConsumeResult(limiter.consume(), { allowed: true, remaining: 1, retryAfterMs: 0 });
23+expectConsumeResult(limiter.consume(), { allowed: true, remaining: 0, retryAfterMs: 0 });
24+expectConsumeResult(limiter.consume(), { allowed: false, remaining: 0, retryAfterMs: 1_000 });
16251726nowMs += 1_000;
18-expect(limiter.consume()).toMatchObject({ allowed: true, remaining: 1 });
27+expectConsumeResult(limiter.consume(), { allowed: true, remaining: 1, retryAfterMs: 0 });
1928});
20292130it("clamps maxRequests and windowMs to at least one", () => {
@@ -26,11 +35,11 @@ describe("fixed-window rate limiter", () => {
2635now: () => nowMs,
2736});
283729-expect(limiter.consume()).toMatchObject({ allowed: true, remaining: 0, retryAfterMs: 0 });
30-expect(limiter.consume()).toMatchObject({ allowed: false, remaining: 0, retryAfterMs: 1 });
38+expectConsumeResult(limiter.consume(), { allowed: true, remaining: 0, retryAfterMs: 0 });
39+expectConsumeResult(limiter.consume(), { allowed: false, remaining: 0, retryAfterMs: 1 });
31403241nowMs += 1;
33-expect(limiter.consume()).toMatchObject({ allowed: true, remaining: 0 });
42+expectConsumeResult(limiter.consume(), { allowed: true, remaining: 0, retryAfterMs: 0 });
3443});
35443645it("reports the remaining retry window after later blocked attempts", () => {
@@ -41,10 +50,10 @@ describe("fixed-window rate limiter", () => {
4150now: () => nowMs,
4251});
435244-expect(limiter.consume()).toMatchObject({ allowed: true, remaining: 0 });
53+expectConsumeResult(limiter.consume(), { allowed: true, remaining: 0, retryAfterMs: 0 });
45544655nowMs += 250;
47-expect(limiter.consume()).toMatchObject({ allowed: false, retryAfterMs: 750 });
56+expectConsumeResult(limiter.consume(), { allowed: false, remaining: 0, retryAfterMs: 750 });
4857});
49585059it("supports explicit reset", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。