


























@@ -121,6 +121,16 @@ function mockCallArg(mock: ReturnType<typeof vi.fn>, callIndex: number, argIndex
121121return call[argIndex];
122122}
123123124+function firstMockCallArg(mock: ReturnType<typeof vi.fn>, argIndex: number) {
125+return mockCallArg(mock, 0, argIndex);
126+}
127+128+function firstSendText(mock: ReturnType<typeof vi.fn>) {
129+const text = firstMockCallArg(mock, 1);
130+expect(text).toBeTypeOf("string");
131+return text as string;
132+}
133+124134function createSendMessageHarness(messageId = 4) {
125135const runtime = createRuntime();
126136const sendMessage = vi.fn().mockResolvedValue({
@@ -229,7 +239,7 @@ describe("deliverReplies", () => {
229239230240expect(runtime.error).toHaveBeenCalledTimes(1);
231241expect(sendMessage).toHaveBeenCalledTimes(1);
232-expect(sendMessage.mock.calls.at(0)?.[1]).toBe("hello");
242+expect(firstMockCallArg(sendMessage, 1)).toBe("hello");
233243});
234244235245it("mirrors delivered replies once after successful sends", async () => {
@@ -276,8 +286,8 @@ describe("deliverReplies", () => {
276286 bot,
277287});
278288279-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
280-expect(sendMessage.mock.calls.at(0)?.[1]).toBe("Plugin bind approval required");
289+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
290+expect(firstMockCallArg(sendMessage, 1)).toBe("Plugin bind approval required");
281291expectRecordFields(mockCallArg(sendMessage, 0, 2), {
282292reply_markup: {
283293inline_keyboard: [
@@ -309,8 +319,8 @@ describe("deliverReplies", () => {
309319});
310320311321expect(runtime.error).not.toHaveBeenCalled();
312-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
313-expect(sendMessage.mock.calls.at(0)?.[1]).toContain("Retry");
322+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
323+expect(firstMockCallArg(sendMessage, 1)).toContain("Retry");
314324expectRecordFields(mockCallArg(sendMessage, 0, 2), {
315325reply_markup: {
316326inline_keyboard: [[{ text: "Retry", callback_data: "cmd:retry" }]],
@@ -392,8 +402,8 @@ describe("deliverReplies", () => {
392402silent: true,
393403});
394404395-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
396-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
405+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
406+firstSendText(sendMessage);
397407expectRecordFields(mockCallArg(sendMessage, 0, 2), { disable_notification: true });
398408});
399409@@ -455,9 +465,9 @@ describe("deliverReplies", () => {
455465});
456466457467expect(sendMessage).toHaveBeenCalledTimes(1);
458-expect(sendMessage.mock.calls.at(0)?.[1]).toBeTypeOf("string");
459-expect(sendMessage.mock.calls.at(0)?.[1]).not.toBe("");
460-expect(sendMessage.mock.calls.at(0)?.[1]?.trim()).not.toBe("NO_REPLY");
468+const text = firstSendText(sendMessage);
469+expect(text).not.toBe("");
470+expect(text.trim()).not.toBe("NO_REPLY");
461471});
462472463473it("uses the policy session key for exact NO_REPLY policy", async () => {
@@ -474,9 +484,9 @@ describe("deliverReplies", () => {
474484});
475485476486expect(sendMessage).toHaveBeenCalledTimes(1);
477-expect(sendMessage.mock.calls.at(0)?.[1]).toBeTypeOf("string");
478-expect(sendMessage.mock.calls.at(0)?.[1]).not.toBe("");
479-expect(sendMessage.mock.calls.at(0)?.[1]?.trim()).not.toBe("NO_REPLY");
487+const text = firstSendText(sendMessage);
488+expect(text).not.toBe("");
489+expect(text.trim()).not.toBe("NO_REPLY");
480490});
481491482492it("suppresses exact NO_REPLY for group Telegram sessions", async () => {
@@ -631,8 +641,8 @@ describe("deliverReplies", () => {
631641 bot,
632642});
633643634-expect(sendPhoto.mock.calls.at(0)?.[0]).toBe("123");
635-if (sendPhoto.mock.calls.at(0)?.[1] === undefined) {
644+expect(firstMockCallArg(sendPhoto, 0)).toBe("123");
645+if (firstMockCallArg(sendPhoto, 1) === undefined) {
636646throw new Error("Expected Telegram photo media");
637647}
638648expectRecordFields(mockCallArg(sendPhoto, 0, 2), {
@@ -659,8 +669,8 @@ describe("deliverReplies", () => {
659669});
660670661671expect(probeVideoDimensions).toHaveBeenCalledWith(Buffer.from("video"));
662-expect(sendVideo.mock.calls.at(0)?.[0]).toBe("123");
663-if (sendVideo.mock.calls.at(0)?.[1] === undefined) {
672+expect(firstMockCallArg(sendVideo, 0)).toBe("123");
673+if (firstMockCallArg(sendVideo, 1) === undefined) {
664674throw new Error("Expected Telegram video media");
665675}
666676expectRecordFields(mockCallArg(sendVideo, 0, 2), {
@@ -688,8 +698,8 @@ describe("deliverReplies", () => {
688698});
689699690700expect(probeVideoDimensions).not.toHaveBeenCalled();
691-expect(sendAnimation.mock.calls.at(0)?.[0]).toBe("123");
692-if (sendAnimation.mock.calls.at(0)?.[1] === undefined) {
701+expect(firstMockCallArg(sendAnimation, 0)).toBe("123");
702+if (firstMockCallArg(sendAnimation, 1) === undefined) {
693703throw new Error("Expected Telegram animation media");
694704}
695705const options = mockCallArg(sendAnimation, 0, 2) as Record<string, unknown>;
@@ -735,8 +745,8 @@ describe("deliverReplies", () => {
735745linkPreview: false,
736746});
737747738-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
739-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
748+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
749+firstSendText(sendMessage);
740750expectRecordFields(mockCallArg(sendMessage, 0, 2), {
741751link_preview_options: { is_disabled: true },
742752});
@@ -752,8 +762,8 @@ describe("deliverReplies", () => {
752762thread: { id: 42, scope: "dm" },
753763});
754764755-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
756-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
765+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
766+firstSendText(sendMessage);
757767expectRecordFields(mockCallArg(sendMessage, 0, 2), { message_thread_id: 42 });
758768});
759769@@ -867,8 +877,8 @@ describe("deliverReplies", () => {
867877linkPreview: true,
868878});
869879870-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
871-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
880+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
881+firstSendText(sendMessage);
872882expect(mockCallArg(sendMessage, 0, 2)).not.toHaveProperty("link_preview_options");
873883});
874884@@ -897,8 +907,8 @@ describe("deliverReplies", () => {
897907});
898908899909expect(sendMessage).toHaveBeenCalledTimes(1);
900-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
901-expect(sendMessage.mock.calls.at(0)?.[1]).toBe(">");
910+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
911+expect(firstMockCallArg(sendMessage, 1)).toBe(">");
902912expectRecordFields(mockCallArg(sendMessage, 0, 2), { message_thread_id: 42 });
903913});
904914@@ -940,8 +950,8 @@ describe("deliverReplies", () => {
940950replyQuoteEntities: [{ type: "bold", offset: 0, length: 6 }],
941951});
942952943-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
944-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
953+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
954+firstSendText(sendMessage);
945955expectRecordFields(mockCallArg(sendMessage, 0, 2), {
946956reply_parameters: {
947957message_id: 500,
@@ -1052,8 +1062,8 @@ describe("deliverReplies", () => {
10521062replyQuoteText: "quoted text",
10531063});
105410641055-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
1056-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
1065+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
1066+firstSendText(sendMessage);
10571067expectRecordFields(mockCallArg(sendMessage, 0, 2), {
10581068reply_to_message_id: 501,
10591069allow_sending_without_reply: true,
@@ -1098,8 +1108,8 @@ describe("deliverReplies", () => {
10981108replyQuoteText: "quoted text",
10991109});
110011101101-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
1102-expect(typeof sendMessage.mock.calls.at(0)?.[1]).toBe("string");
1111+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
1112+firstSendText(sendMessage);
11031113expectRecordFields(mockCallArg(sendMessage, 0, 2), {
11041114reply_to_message_id: 501,
11051115allow_sending_without_reply: true,
@@ -1130,9 +1140,9 @@ describe("deliverReplies", () => {
11301140expect(sendVoice).toHaveBeenCalledTimes(1);
11311141// Fallback to text succeeded
11321142expect(sendMessage).toHaveBeenCalledTimes(1);
1133-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
1134-expect(sendMessage.mock.calls.at(0)?.[1]).toContain("Hello there");
1135-if (sendMessage.mock.calls.at(0)?.[2] === undefined) {
1143+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
1144+expect(firstMockCallArg(sendMessage, 1)).toContain("Hello there");
1145+if (firstMockCallArg(sendMessage, 2) === undefined) {
11361146throw new Error("Expected Telegram fallback text options");
11371147}
11381148});
@@ -1158,8 +1168,8 @@ describe("deliverReplies", () => {
11581168});
1159116911601170expect(sendVoice).toHaveBeenCalledTimes(1);
1161-expect(sendMessage.mock.calls.at(0)?.[0]).toBe("123");
1162-expect(sendMessage.mock.calls.at(0)?.[1]).toContain("Hello there");
1171+expect(firstMockCallArg(sendMessage, 0)).toBe("123");
1172+expect(firstMockCallArg(sendMessage, 1)).toContain("Hello there");
11631173expectRecordFields(mockCallArg(sendMessage, 0, 2), { disable_notification: true });
11641174});
11651175此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。