Spaces:
Paused
Paused
| import { describe, expect, it } from "vitest"; | |
| import { fetchDiscord } from "./api.js"; | |
| function jsonResponse(body: unknown, status = 200) { | |
| return new Response(JSON.stringify(body), { status }); | |
| } | |
| describe("fetchDiscord", () => { | |
| it("formats rate limit payloads without raw JSON", async () => { | |
| const fetcher = async () => | |
| jsonResponse( | |
| { | |
| message: "You are being rate limited.", | |
| retry_after: 0.631, | |
| global: false, | |
| }, | |
| 429, | |
| ); | |
| let error: unknown; | |
| try { | |
| await fetchDiscord("/users/@me/guilds", "test", fetcher as typeof fetch, { | |
| retry: { attempts: 1 }, | |
| }); | |
| } catch (err) { | |
| error = err; | |
| } | |
| const message = String(error); | |
| expect(message).toContain("Discord API /users/@me/guilds failed (429)"); | |
| expect(message).toContain("You are being rate limited."); | |
| expect(message).toContain("retry after 0.6s"); | |
| expect(message).not.toContain("{"); | |
| expect(message).not.toContain("retry_after"); | |
| }); | |
| it("preserves non-JSON error text", async () => { | |
| const fetcher = async () => new Response("Not Found", { status: 404 }); | |
| await expect( | |
| fetchDiscord("/users/@me/guilds", "test", fetcher as typeof fetch, { | |
| retry: { attempts: 1 }, | |
| }), | |
| ).rejects.toThrow("Discord API /users/@me/guilds failed (404): Not Found"); | |
| }); | |
| it("retries rate limits before succeeding", async () => { | |
| let calls = 0; | |
| const fetcher = async () => { | |
| calls += 1; | |
| if (calls === 1) { | |
| return jsonResponse( | |
| { | |
| message: "You are being rate limited.", | |
| retry_after: 0, | |
| global: false, | |
| }, | |
| 429, | |
| ); | |
| } | |
| return jsonResponse([{ id: "1", name: "Guild" }], 200); | |
| }; | |
| const result = await fetchDiscord<Array<{ id: string; name: string }>>( | |
| "/users/@me/guilds", | |
| "test", | |
| fetcher as typeof fetch, | |
| { retry: { attempts: 2, minDelayMs: 0, maxDelayMs: 0 } }, | |
| ); | |
| expect(result).toHaveLength(1); | |
| expect(calls).toBe(2); | |
| }); | |
| }); | |