






















@@ -1,5 +1,6 @@
11import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
22import { beforeEach, describe, expect, it, vi } from "vitest";
3+import { DiscordError, RateLimitError } from "./internal/rest-errors.js";
34import { sendWebhookMessageDiscord } from "./send.webhook.js";
4556const makeProxyFetchMock = vi.hoisted(() => vi.fn());
@@ -145,18 +146,30 @@ describe("sendWebhookMessageDiscord proxy support", () => {
145146},
146147} as OpenClawConfig;
147148148-await expect(
149-sendWebhookMessageDiscord("hello", {
150- cfg,
151-accountId: "default",
152-webhookId: "123",
153-webhookToken: "abc",
154-wait: true,
155-}),
156-).rejects.toMatchObject({
157-name: "RateLimitError",
158-status: 429,
159-retryAfter: 0.25,
149+const thrown = await sendWebhookMessageDiscord("hello", {
150+ cfg,
151+accountId: "default",
152+webhookId: "123",
153+webhookToken: "abc",
154+wait: true,
155+}).then(
156+() => undefined,
157+(error: unknown) => error,
158+);
159+expect(thrown).toBeInstanceOf(RateLimitError);
160+const error = thrown as RateLimitError;
161+expect(error.name).toBe("RateLimitError");
162+expect(error.status).toBe(429);
163+expect(error.statusCode).toBe(429);
164+expect(error.retryAfter).toBe(0.25);
165+expect(error.scope).toBeNull();
166+expect(error.bucket).toBeNull();
167+expect(error.message).toBe("Slow down");
168+expect(error.rawBody).toEqual({
169+message: "Slow down",
170+retry_after: 0.25,
171+code: undefined,
172+global: false,
160173});
161174globalFetchMock.mockRestore();
162175});
@@ -174,18 +187,24 @@ describe("sendWebhookMessageDiscord proxy support", () => {
174187},
175188} as OpenClawConfig;
176189177-await expect(
178-sendWebhookMessageDiscord("hello", {
179- cfg,
180-accountId: "default",
181-webhookId: "123",
182-webhookToken: "abc",
183-wait: true,
184-}),
185-).rejects.toMatchObject({
186-name: "DiscordError",
187-status: 503,
188-});
190+const thrown = await sendWebhookMessageDiscord("hello", {
191+ cfg,
192+accountId: "default",
193+webhookId: "123",
194+webhookToken: "abc",
195+wait: true,
196+}).then(
197+() => undefined,
198+(error: unknown) => error,
199+);
200+expect(thrown).toBeInstanceOf(DiscordError);
201+expect(thrown).not.toBeInstanceOf(RateLimitError);
202+const error = thrown as DiscordError;
203+expect(error.name).toBe("DiscordError");
204+expect(error.status).toBe(503);
205+expect(error.statusCode).toBe(503);
206+expect(error.message).toBe("upstream unavailable");
207+expect(error.rawBody).toEqual({ message: "upstream unavailable" });
189208globalFetchMock.mockRestore();
190209});
191210});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。