





















@@ -66,10 +66,18 @@ function requestOptions(source: MockCallSource, callIndex = 0) {
6666);
6767}
686869+function requestPath(source: MockCallSource, callIndex = 0) {
70+return mockArg(source, callIndex, 0, `request path ${callIndex}`);
71+}
72+6973function requestBody(source: MockCallSource, callIndex = 0) {
7074return requireRecord(requestOptions(source, callIndex).body, `request body ${callIndex}`);
7175}
727677+function timerDelayAt(source: MockCallSource, callIndex = 0) {
78+return mockArg(source, callIndex, 1, `timer delay ${callIndex}`);
79+}
80+7381function createRateLimitError(
7482response: Response,
7583body: { message: string; retry_after: number; global: boolean },
@@ -129,7 +137,7 @@ describe("sendMessageDiscord", () => {
129137discordClientOpts(rest),
130138);
131139expect(getMock).not.toHaveBeenCalled();
132-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1", "m1"));
140+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1", "m1"));
133141expect(requestBody(postMock as unknown as MockCallSource)).toEqual({ name: "thread" });
134142});
135143@@ -139,7 +147,7 @@ describe("sendMessageDiscord", () => {
139147postMock.mockResolvedValue({ id: "t1" });
140148await createThreadDiscord("chan1", { name: "thread" }, discordClientOpts(rest));
141149expect(getMock).toHaveBeenCalledWith(Routes.channel("chan1"));
142-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
150+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1"));
143151expect(requestBody(postMock as unknown as MockCallSource)).toEqual({
144152name: "thread",
145153message: { content: "thread" },
@@ -155,7 +163,7 @@ describe("sendMessageDiscord", () => {
155163{ name: "thread", content: "initial forum post" },
156164discordClientOpts(rest),
157165);
158-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
166+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1"));
159167expect(requestBody(postMock as unknown as MockCallSource)).toEqual({
160168name: "thread",
161169message: { content: "initial forum post" },
@@ -171,7 +179,7 @@ describe("sendMessageDiscord", () => {
171179{ name: "tagged post", appliedTags: ["tag1", "tag2"] },
172180discordClientOpts(rest),
173181);
174-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
182+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1"));
175183expect(requestBody(postMock as unknown as MockCallSource)).toEqual({
176184name: "tagged post",
177185message: { content: "tagged post" },
@@ -188,7 +196,7 @@ describe("sendMessageDiscord", () => {
188196{ name: "thread", appliedTags: ["tag1"] },
189197discordClientOpts(rest),
190198);
191-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
199+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1"));
192200expect("applied_tags" in requestBody(postMock as unknown as MockCallSource)).toBe(false);
193201});
194202@@ -197,7 +205,7 @@ describe("sendMessageDiscord", () => {
197205getMock.mockRejectedValue(new Error("lookup failed"));
198206postMock.mockResolvedValue({ id: "t1" });
199207await createThreadDiscord("chan1", { name: "thread" }, discordClientOpts(rest));
200-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
208+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1"));
201209expect(requestBody(postMock as unknown as MockCallSource).name).toBe("thread");
202210expect(requestBody(postMock as unknown as MockCallSource).type).toBe(ChannelType.PublicThread);
203211});
@@ -212,7 +220,7 @@ describe("sendMessageDiscord", () => {
212220discordClientOpts(rest),
213221);
214222expect(getMock).toHaveBeenCalledWith(Routes.channel("chan1"));
215-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
223+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.threads("chan1"));
216224expect(requestBody(postMock as unknown as MockCallSource).name).toBe("thread");
217225expect(requestBody(postMock as unknown as MockCallSource).type).toBe(ChannelType.PrivateThread);
218226});
@@ -228,13 +236,15 @@ describe("sendMessageDiscord", () => {
228236);
229237expect(postMock).toHaveBeenCalledTimes(2);
230238// First call: create thread
231-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1"));
239+expect(requestPath(postMock as unknown as MockCallSource, 0)).toBe(Routes.threads("chan1"));
232240expect(requestBody(postMock as unknown as MockCallSource, 0).name).toBe("thread");
233241expect(requestBody(postMock as unknown as MockCallSource, 0).type).toBe(
234242ChannelType.PublicThread,
235243);
236244// Second call: send message to thread
237-expect(postMock.mock.calls[1]?.[0]).toBe(Routes.channelMessages("t1"));
245+expect(requestPath(postMock as unknown as MockCallSource, 1)).toBe(
246+Routes.channelMessages("t1"),
247+);
238248expect(requestBody(postMock as unknown as MockCallSource, 1)).toEqual({
239249content: "Hello thread!",
240250});
@@ -277,10 +287,14 @@ describe("sendMessageDiscord", () => {
277287expect(getMock).not.toHaveBeenCalled();
278288expect(postMock).toHaveBeenCalledTimes(2);
279289// First call: create thread from message
280-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.threads("chan1", "m1"));
290+expect(requestPath(postMock as unknown as MockCallSource, 0)).toBe(
291+Routes.threads("chan1", "m1"),
292+);
281293expect(requestBody(postMock as unknown as MockCallSource, 0)).toEqual({ name: "thread" });
282294// Second call: send message to thread
283-expect(postMock.mock.calls[1]?.[0]).toBe(Routes.channelMessages("t1"));
295+expect(requestPath(postMock as unknown as MockCallSource, 1)).toBe(
296+Routes.channelMessages("t1"),
297+);
284298expect(requestBody(postMock as unknown as MockCallSource, 1)).toEqual({
285299content: "Discussion here",
286300});
@@ -300,7 +314,9 @@ describe("sendMessageDiscord", () => {
300314{ guildId: "g1", userId: "u1", durationMinutes: 10 },
301315discordClientOpts(rest),
302316);
303-expect(patchMock.mock.calls[0]?.[0]).toBe(Routes.guildMember("g1", "u1"));
317+expect(requestPath(patchMock as unknown as MockCallSource)).toBe(
318+Routes.guildMember("g1", "u1"),
319+);
304320expect(
305321requestBody(patchMock as unknown as MockCallSource).communication_disabled_until,
306322).toBeTypeOf("string");
@@ -323,7 +339,7 @@ describe("sendMessageDiscord", () => {
323339{ guildId: "g1", userId: "u1", deleteMessageDays: 2 },
324340discordClientOpts(rest),
325341);
326-expect(putMock.mock.calls[0]?.[0]).toBe(Routes.guildBan("g1", "u1"));
342+expect(requestPath(putMock as unknown as MockCallSource)).toBe(Routes.guildBan("g1", "u1"));
327343expect(requestBody(putMock as unknown as MockCallSource)).toEqual({ delete_message_days: 2 });
328344});
329345});
@@ -358,7 +374,7 @@ describe("uploadEmojiDiscord", () => {
358374},
359375discordClientOpts(rest),
360376);
361-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.guildEmojis("g1"));
377+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.guildEmojis("g1"));
362378expect(requestBody(postMock as unknown as MockCallSource)).toEqual({
363379name: "party_blob",
364380image: "data:image/png;base64,aW1n",
@@ -386,7 +402,7 @@ describe("uploadStickerDiscord", () => {
386402},
387403discordClientOpts(rest),
388404);
389-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.guildStickers("g1"));
405+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.guildStickers("g1"));
390406const stickerBody = requestBody(postMock as unknown as MockCallSource);
391407expect(stickerBody.name).toBe("openclaw_wave");
392408expect(stickerBody.description).toBe("OpenClaw waving");
@@ -417,7 +433,7 @@ describe("sendStickerDiscord", () => {
417433expect(res.channelId).toBe("789");
418434expect(res.receipt.parts[0]?.platformMessageId).toBe("msg1");
419435expect(res.receipt.parts[0]?.kind).toBe("card");
420-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.channelMessages("789"));
436+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.channelMessages("789"));
421437expect(requestBody(postMock as unknown as MockCallSource)).toEqual({
422438content: "hiya",
423439sticker_ids: ["123"],
@@ -449,7 +465,7 @@ describe("sendPollDiscord", () => {
449465expect(res.channelId).toBe("789");
450466expect(res.receipt.parts[0]?.platformMessageId).toBe("msg1");
451467expect(res.receipt.parts[0]?.kind).toBe("card");
452-expect(postMock.mock.calls[0]?.[0]).toBe(Routes.channelMessages("789"));
468+expect(requestPath(postMock as unknown as MockCallSource)).toBe(Routes.channelMessages("789"));
453469expect(requestBody(postMock as unknown as MockCallSource).poll).toEqual({
454470question: { text: "Lunch?" },
455471answers: [{ poll_media: { text: "Pizza" } }, { poll_media: { text: "Sushi" } }],
@@ -528,7 +544,7 @@ describe("retry rate limits", () => {
528544expect(result.channelId).toBe("789");
529545expect(result.receipt.primaryPlatformMessageId).toBe("msg1");
530546expect(result.receipt.platformMessageIds).toEqual(["msg1"]);
531-expect(setTimeoutSpy.mock.calls[0]?.[1]).toBe(1);
547+expect(timerDelayAt(setTimeoutSpy as unknown as MockCallSource)).toBe(1);
532548} finally {
533549setTimeoutSpy.mockRestore();
534550}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。