

























@@ -2,9 +2,39 @@ import { createServer, type Server } from "node:http";
22import { fetch as undiciFetch } from "undici";
33import { afterEach, describe, expect, it, vi } from "vitest";
44import { serializeRequestBody } from "./rest-body.js";
5-import { RequestClient } from "./rest.js";
5+import { DiscordError, RateLimitError, RequestClient } from "./rest.js";
66import { createDeferred, createJsonResponse } from "./test-builders.test-support.js";
778+async function expectRateLimitError(
9+promise: Promise<unknown>,
10+expected: { discordCode?: number; retryAfter: number },
11+) {
12+let error: unknown;
13+try {
14+await promise;
15+} catch (caught) {
16+error = caught;
17+}
18+expect(error).toBeInstanceOf(RateLimitError);
19+const rateLimit = error as RateLimitError;
20+expect(rateLimit.name).toBe("RateLimitError");
21+expect(rateLimit.retryAfter).toBe(expected.retryAfter);
22+if (expected.discordCode !== undefined) {
23+expect(rateLimit.discordCode).toBe(expected.discordCode);
24+}
25+}
26+27+async function expectDiscordErrorStatus(promise: Promise<unknown>, status: number) {
28+let error: unknown;
29+try {
30+await promise;
31+} catch (caught) {
32+error = caught;
33+}
34+expect(error).toBeInstanceOf(DiscordError);
35+expect((error as DiscordError).status).toBe(status);
36+}
37+838describe("RequestClient", () => {
939afterEach(() => {
1040vi.useRealTimers();
@@ -377,10 +407,7 @@ describe("RequestClient", () => {
377407scheduler: { maxRateLimitRetries: 0 },
378408});
379409380-await expect(client.get("/channels/c1/messages")).rejects.toMatchObject({
381-name: "RateLimitError",
382-retryAfter: 0.1,
383-});
410+await expectRateLimitError(client.get("/channels/c1/messages"), { retryAfter: 0.1 });
384411expect(fetchSpy).toHaveBeenCalledTimes(1);
385412expect(client.queueSize).toBe(0);
386413});
@@ -412,10 +439,7 @@ describe("RequestClient", () => {
412439),
413440);
414441415-await expect(request).rejects.toMatchObject({
416-name: "RateLimitError",
417-retryAfter: 0,
418-});
442+await expectRateLimitError(request, { retryAfter: 0 });
419443expect(fetchSpy).toHaveBeenCalledTimes(1);
420444expect(client.queueSize).toBe(0);
421445});
@@ -471,8 +495,7 @@ describe("RequestClient", () => {
471495),
472496});
473497474-await expect(client.post("/applications/app/commands", { body: {} })).rejects.toMatchObject({
475-name: "RateLimitError",
498+await expectRateLimitError(client.post("/applications/app/commands", { body: {} }), {
476499discordCode: 30034,
477500retryAfter: 60,
478501});
@@ -490,10 +513,7 @@ describe("RequestClient", () => {
490513}),
491514});
492515493-await expect(client.get("/channels/c1/messages")).rejects.toMatchObject({
494-name: "RateLimitError",
495-retryAfter: 5,
496-});
516+await expectRateLimitError(client.get("/channels/c1/messages"), { retryAfter: 5 });
497517});
498518499519it("falls back to Retry-After when the rate limit body value is malformed", async () => {
@@ -509,10 +529,7 @@ describe("RequestClient", () => {
509529),
510530});
511531512-await expect(client.get("/channels/c1/messages")).rejects.toMatchObject({
513-name: "RateLimitError",
514-retryAfter: 7,
515-});
532+await expectRateLimitError(client.get("/channels/c1/messages"), { retryAfter: 7 });
516533});
517534518535it("tracks invalid requests and exposes bucket scheduler metrics", async () => {
@@ -528,7 +545,7 @@ describe("RequestClient", () => {
528545),
529546});
530547531-await expect(client.get("/channels/c1/messages")).rejects.toMatchObject({ status: 403 });
548+await expectDiscordErrorStatus(client.get("/channels/c1/messages"), 403);
532549533550const metrics = client.getSchedulerMetrics();
534551expect(metrics.invalidRequestCount).toBe(1);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。