
























@@ -110,8 +110,14 @@ function requireMockCall<T extends unknown[]>(call: T | undefined, label: string
110110return call;
111111}
112112113+function mockCall(mock: ReturnType<typeof vi.fn>, index: number, label: string): unknown[] {
114+const calls = mock.mock.calls;
115+const resolvedIndex = index < 0 ? calls.length + index : index;
116+return requireMockCall(calls[resolvedIndex], label);
117+}
118+113119function firstMockCall(mock: ReturnType<typeof vi.fn>, label: string): unknown[] {
114-return requireMockCall(mock.mock.calls.at(0), label);
120+return mockCall(mock, 0, label);
115121}
116122117123function requireString(value: unknown, label: string): string {
@@ -121,6 +127,10 @@ function requireString(value: unknown, label: string): string {
121127return value;
122128}
123129130+function mockCallText(call: unknown[], label: string): string {
131+return requireString(call[1], label);
132+}
133+124134function requireRecord(value: unknown, label: string): Record<string, unknown> {
125135if (typeof value !== "object" || value === null) {
126136throw new Error(`expected ${label}`);
@@ -144,7 +154,7 @@ function expectMediaSendCall(
144154145155function expectPersistedTarget(fields: Record<string, unknown>): void {
146156const [target] = requireMockCall(
147-maybePersistResolvedTelegramTarget.mock.calls.at(-1),
157+mockCall(maybePersistResolvedTelegramTarget, -1, "persisted Telegram target"),
148158"persisted Telegram target",
149159);
150160const record = requireRecord(target, "persisted Telegram target");
@@ -1985,10 +1995,15 @@ describe("sendMessageTelegram", () => {
19851995message_thread_id: 271,
19861996},
19871997);
1988-expectMediaSendCall(sendPhoto.mock.calls.at(1), "second send photo call", chatId, {
1989-caption: "photo",
1990-parse_mode: "HTML",
1991-});
1998+expectMediaSendCall(
1999+mockCall(sendPhoto, 1, "second send photo call"),
2000+"second send photo call",
2001+chatId,
2002+{
2003+caption: "photo",
2004+parse_mode: "HTML",
2005+},
2006+);
19922007expect(res.messageId).toBe("59");
19932008});
19942009@@ -2082,7 +2097,7 @@ describe("sendMessageTelegram", () => {
2082209720832098expect(sendMessage).toHaveBeenCalledTimes(2);
20842099const firstCall = firstMockCall(sendMessage, "first sendMessage call");
2085-const secondCall = requireMockCall(sendMessage.mock.calls.at(1), "second sendMessage call");
2100+const secondCall = mockCall(sendMessage, 1, "second sendMessage call");
20862101const firstParams = requireRecord(firstCall[2], "first sendMessage params");
20872102const secondParams = requireRecord(secondCall[2], "second sendMessage params");
20882103expect((firstCall[1] as string).length).toBeLessThanOrEqual(4000);
@@ -2113,7 +2128,7 @@ describe("sendMessageTelegram", () => {
2113212821142129expect(sendMessage).toHaveBeenCalledTimes(2);
21152130const firstCall = firstMockCall(sendMessage, "first sendMessage call");
2116-const secondCall = requireMockCall(sendMessage.mock.calls.at(1), "second sendMessage call");
2131+const secondCall = mockCall(sendMessage, 1, "second sendMessage call");
21172132const firstParams = requireRecord(firstCall[2], "first sendMessage params");
21182133const secondParams = requireRecord(secondCall[2], "second sendMessage params");
21192134const firstText = requireString(firstCall[1], "first sendMessage text");
@@ -2155,9 +2170,15 @@ describe("sendMessageTelegram", () => {
21552170});
2156217121572172expect(sendMessage).toHaveBeenCalledTimes(4);
2158-const plainFallbackCalls = [sendMessage.mock.calls.at(1), sendMessage.mock.calls.at(3)];
2159-expect(plainFallbackCalls.map((call) => String(call?.[1] ?? "")).join("")).toBe(plainText);
2160-expect(plainFallbackCalls.map((call) => String(call?.[1] ?? "")).join("")).not.toContain("<");
2173+const plainFallbackCalls = [
2174+mockCall(sendMessage, 1, "first plain fallback sendMessage call"),
2175+mockCall(sendMessage, 3, "second plain fallback sendMessage call"),
2176+];
2177+const plainFallbackText = plainFallbackCalls
2178+.map((call) => mockCallText(call, "plain fallback text"))
2179+.join("");
2180+expect(plainFallbackText).toBe(plainText);
2181+expect(plainFallbackText).not.toContain("<");
21612182expect(res.messageId).toBe("91");
21622183});
21632184@@ -2188,11 +2209,15 @@ describe("sendMessageTelegram", () => {
21882209expect(
21892210requireString(firstMockCall(sendMessage, "sendMessage call")[1], "sendMessage text"),
21902211).toMatch(/^&/);
2191-const plainFallbackCalls = [sendMessage.mock.calls.at(1), sendMessage.mock.calls.at(3)];
2192-expect(plainFallbackCalls.map((call) => String(call?.[1] ?? "")).join("")).toBe(plainText);
2193-expect(
2194-plainFallbackCalls.map((call) => String(call?.[1] ?? "")).filter((text) => text === ""),
2195-).toEqual([]);
2212+const plainFallbackCalls = [
2213+mockCall(sendMessage, 1, "first plain fallback sendMessage call"),
2214+mockCall(sendMessage, 3, "second plain fallback sendMessage call"),
2215+];
2216+const plainFallbackTexts = plainFallbackCalls.map((call) =>
2217+mockCallText(call, "plain fallback text"),
2218+);
2219+expect(plainFallbackTexts.join("")).toBe(plainText);
2220+expect(plainFallbackTexts.filter((text) => text === "")).toEqual([]);
21962221expect(res.messageId).toBe("93");
21972222});
21982223@@ -2749,7 +2774,7 @@ describe("editMessageTelegram", () => {
2749277427502775if ("secondExpectReplyMarkup" in testCase && testCase.secondExpectReplyMarkup) {
27512776const secondParams = requireRecord(
2752-(botApi.editMessageText.mock.calls.at(1) ?? [])[3],
2777+mockCall(botApi.editMessageText, 1, "second editMessageText call")[3],
27532778"second edit params",
27542779);
27552780expect(secondParams.reply_markup, testCase.name).toEqual(testCase.secondExpectReplyMarkup);
@@ -2885,8 +2910,8 @@ describe("sendPollTelegram", () => {
28852910.message_thread_id,
28862911).toBe(99);
28872912expect(
2888-(api.sendPoll.mock.calls.at(1)?.[3] as { message_thread_id?: unknown } | undefined)
2889-?.message_thread_id,
2913+(mockCall(api.sendPoll, 1, "second send poll call")[3] as { message_thread_id?: unknown })
2914+.message_thread_id,
28902915).toBeUndefined();
28912916});
28922917此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。