


















@@ -843,11 +843,7 @@ describe("deliverReplies", () => {
843843).rejects.toThrow("message thread not found");
844844845845expect(sendPhoto).toHaveBeenCalledTimes(1);
846-expect(sendPhoto.mock.calls[0]?.[2]).toEqual(
847-expect.objectContaining({
848-message_thread_id: 42,
849-}),
850-);
846+expectRecordFields(sendPhoto.mock.calls[0]?.[2], { message_thread_id: 42 });
851847expect(runtime.error).toHaveBeenCalledTimes(1);
852848});
853849@@ -861,18 +857,14 @@ describe("deliverReplies", () => {
861857linkPreview: true,
862858});
863859864-expect(sendMessage).toHaveBeenCalledWith(
865-"123",
866-expect.any(String),
867-expect.not.objectContaining({
868-link_preview_options: expect.anything(),
869-}),
870-);
860+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
861+expect(typeof sendMessage.mock.calls[0]?.[1]).toBe("string");
862+expect(sendMessage.mock.calls[0]?.[2]).not.toHaveProperty("link_preview_options");
871863});
872864873865it("falls back to plain text when markdown renders to empty HTML in threaded mode", async () => {
874866const runtime = createRuntime();
875-const sendMessage = vi.fn(async (_chatId: string, text: string) => {
867+const sendMessage = vi.fn(async (_chatId: string, text: string, _options?: unknown) => {
876868if (text === "") {
877869throw new Error("400: Bad Request: message text is empty");
878870}
@@ -895,13 +887,9 @@ describe("deliverReplies", () => {
895887});
896888897889expect(sendMessage).toHaveBeenCalledTimes(1);
898-expect(sendMessage).toHaveBeenCalledWith(
899-"123",
900-">",
901-expect.objectContaining({
902-message_thread_id: 42,
903-}),
904-);
890+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
891+expect(sendMessage.mock.calls[0]?.[1]).toBe(">");
892+expectRecordFields(sendMessage.mock.calls[0]?.[2], { message_thread_id: 42 });
905893});
906894907895it("skips whitespace-only text replies without calling Telegram", async () => {
@@ -942,26 +930,18 @@ describe("deliverReplies", () => {
942930replyQuoteEntities: [{ type: "bold", offset: 0, length: 6 }],
943931});
944932945-expect(sendMessage).toHaveBeenCalledWith(
946-"123",
947-expect.any(String),
948-expect.objectContaining({
949-reply_parameters: {
950-message_id: 500,
951-quote: " quoted text\n",
952-quote_position: 17,
953-quote_entities: [{ type: "bold", offset: 0, length: 6 }],
954-allow_sending_without_reply: true,
955-},
956-}),
957-);
958-expect(sendMessage).toHaveBeenCalledWith(
959-"123",
960-expect.any(String),
961-expect.not.objectContaining({
962-reply_to_message_id: expect.anything(),
963-}),
964-);
933+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
934+expect(typeof sendMessage.mock.calls[0]?.[1]).toBe("string");
935+expectRecordFields(sendMessage.mock.calls[0]?.[2], {
936+reply_parameters: {
937+message_id: 500,
938+quote: " quoted text\n",
939+quote_position: 17,
940+quote_entities: [{ type: "bold", offset: 0, length: 6 }],
941+allow_sending_without_reply: true,
942+},
943+});
944+expect(sendMessage.mock.calls[0]?.[2]).not.toHaveProperty("reply_to_message_id");
965945});
966946967947it("uses the native quote candidate that matches each reply target", async () => {
@@ -986,26 +966,22 @@ describe("deliverReplies", () => {
986966},
987967});
988968989-expect(sendMessage.mock.calls[0]?.[2]).toEqual(
990-expect.objectContaining({
991-reply_parameters: {
992-message_id: 500,
993-quote: "first quote",
994-quote_position: 0,
995-allow_sending_without_reply: true,
996-},
997-}),
998-);
999-expect(sendMessage.mock.calls[1]?.[2]).toEqual(
1000-expect.objectContaining({
1001-reply_parameters: {
1002-message_id: 501,
1003-quote: "second quote",
1004-quote_position: 0,
1005-allow_sending_without_reply: true,
1006-},
1007-}),
1008-);
969+expectRecordFields(sendMessage.mock.calls[0]?.[2], {
970+reply_parameters: {
971+message_id: 500,
972+quote: "first quote",
973+quote_position: 0,
974+allow_sending_without_reply: true,
975+},
976+});
977+expectRecordFields(sendMessage.mock.calls[1]?.[2], {
978+reply_parameters: {
979+message_id: 501,
980+quote: "second quote",
981+quote_position: 0,
982+allow_sending_without_reply: true,
983+},
984+});
1009985});
10109861011987it("retries with legacy reply id when native quote parameters are rejected", async () => {
@@ -1034,21 +1010,17 @@ describe("deliverReplies", () => {
10341010});
1035101110361012expect(sendMessage).toHaveBeenCalledTimes(2);
1037-expect(sendMessage.mock.calls[0][2]).toEqual(
1038-expect.objectContaining({
1039-reply_parameters: {
1040-message_id: 500,
1041-quote: " quoted text\n",
1042-allow_sending_without_reply: true,
1043-},
1044-}),
1045-);
1046-expect(sendMessage.mock.calls[1][2]).toEqual(
1047-expect.objectContaining({
1048-reply_to_message_id: 500,
1013+expectRecordFields(sendMessage.mock.calls[0][2], {
1014+reply_parameters: {
1015+message_id: 500,
1016+quote: " quoted text\n",
10491017allow_sending_without_reply: true,
1050-}),
1051-);
1018+},
1019+});
1020+expectRecordFields(sendMessage.mock.calls[1][2], {
1021+reply_to_message_id: 500,
1022+allow_sending_without_reply: true,
1023+});
10521024expect(sendMessage.mock.calls[1][2]).not.toHaveProperty("reply_parameters");
10531025}
10541026});
@@ -1070,14 +1042,12 @@ describe("deliverReplies", () => {
10701042replyQuoteText: "quoted text",
10711043});
107210441073-expect(sendMessage).toHaveBeenCalledWith(
1074-"123",
1075-expect.any(String),
1076-expect.objectContaining({
1077-reply_to_message_id: 501,
1078-allow_sending_without_reply: true,
1079-}),
1080-);
1045+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
1046+expect(typeof sendMessage.mock.calls[0]?.[1]).toBe("string");
1047+expectRecordFields(sendMessage.mock.calls[0]?.[2], {
1048+reply_to_message_id: 501,
1049+allow_sending_without_reply: true,
1050+});
10811051expect(sendMessage.mock.calls[0][2]).not.toHaveProperty("reply_parameters");
10821052});
10831053@@ -1118,14 +1088,12 @@ describe("deliverReplies", () => {
11181088replyQuoteText: "quoted text",
11191089});
112010901121-expect(sendMessage).toHaveBeenCalledWith(
1122-"123",
1123-expect.any(String),
1124-expect.objectContaining({
1125-reply_to_message_id: 501,
1126-allow_sending_without_reply: true,
1127-}),
1128-);
1091+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
1092+expect(typeof sendMessage.mock.calls[0]?.[1]).toBe("string");
1093+expectRecordFields(sendMessage.mock.calls[0]?.[2], {
1094+reply_to_message_id: 501,
1095+allow_sending_without_reply: true,
1096+});
11291097expect(sendMessage.mock.calls[0][2]).not.toHaveProperty("reply_parameters");
11301098});
11311099@@ -1152,11 +1120,9 @@ describe("deliverReplies", () => {
11521120expect(sendVoice).toHaveBeenCalledTimes(1);
11531121// Fallback to text succeeded
11541122expect(sendMessage).toHaveBeenCalledTimes(1);
1155-expect(sendMessage).toHaveBeenCalledWith(
1156-"123",
1157-expect.stringContaining("Hello there"),
1158-expect.any(Object),
1159-);
1123+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
1124+expect(sendMessage.mock.calls[0]?.[1]).toContain("Hello there");
1125+expect(sendMessage.mock.calls[0]?.[2]).toBeDefined();
11601126});
1161112711621128it("keeps disable_notification on voice fallback text when silent is true", async () => {
@@ -1180,13 +1146,9 @@ describe("deliverReplies", () => {
11801146});
1181114711821148expect(sendVoice).toHaveBeenCalledTimes(1);
1183-expect(sendMessage).toHaveBeenCalledWith(
1184-"123",
1185-expect.stringContaining("Hello there"),
1186-expect.objectContaining({
1187-disable_notification: true,
1188-}),
1189-);
1149+expect(sendMessage.mock.calls[0]?.[0]).toBe("123");
1150+expect(sendMessage.mock.calls[0]?.[1]).toContain("Hello there");
1151+expectRecordFields(sendMessage.mock.calls[0]?.[2], { disable_notification: true });
11901152});
1191115311921154it("voice fallback applies reply-to only on first chunk when replyToMode is first", async () => {
@@ -1224,21 +1186,17 @@ describe("deliverReplies", () => {
1224118612251187expect(sendVoice).toHaveBeenCalledTimes(1);
12261188expect(sendMessage.mock.calls.length).toBeGreaterThanOrEqual(2);
1227-expect(sendMessage.mock.calls[0][2]).toEqual(
1228-expect.objectContaining({
1229-reply_parameters: {
1230-message_id: 77,
1231-quote: "quoted context",
1232-allow_sending_without_reply: true,
1233-},
1234-reply_markup: {
1235-inline_keyboard: [[{ text: "Ack", callback_data: "ack" }]],
1236-},
1237-}),
1238-);
1239-expect(sendMessage.mock.calls[1][2]).not.toEqual(
1240-expect.objectContaining({ reply_to_message_id: 77 }),
1241-);
1189+expectRecordFields(sendMessage.mock.calls[0][2], {
1190+reply_parameters: {
1191+message_id: 77,
1192+quote: "quoted context",
1193+allow_sending_without_reply: true,
1194+},
1195+reply_markup: {
1196+inline_keyboard: [[{ text: "Ack", callback_data: "ack" }]],
1197+},
1198+});
1199+expect(sendMessage.mock.calls[1][2]).not.toHaveProperty("reply_to_message_id", 77);
12421200expect(sendMessage.mock.calls[1][2]).not.toHaveProperty("reply_parameters");
12431201expect(sendMessage.mock.calls[1][2]).not.toHaveProperty("reply_markup");
12441202});
@@ -1285,12 +1243,10 @@ describe("deliverReplies", () => {
1285124312861244expect(sendMessage.mock.calls.length).toBeGreaterThanOrEqual(2);
12871245// First chunk should have reply_to_message_id
1288-expect(sendMessage.mock.calls[0][2]).toEqual(
1289-expect.objectContaining({
1290-reply_to_message_id: 700,
1291-allow_sending_without_reply: true,
1292-}),
1293-);
1246+expectRecordFields(sendMessage.mock.calls[0][2], {
1247+reply_to_message_id: 700,
1248+allow_sending_without_reply: true,
1249+});
12941250// Second chunk should NOT have reply_to_message_id
12951251expect(sendMessage.mock.calls[1][2]).not.toHaveProperty("reply_to_message_id");
12961252});
@@ -1316,12 +1272,10 @@ describe("deliverReplies", () => {
13161272expect(sendMessage.mock.calls.length).toBeGreaterThanOrEqual(2);
13171273// Both chunks should have reply_to_message_id
13181274for (const call of sendMessage.mock.calls) {
1319-expect(call[2]).toEqual(
1320-expect.objectContaining({
1321-reply_to_message_id: 800,
1322-allow_sending_without_reply: true,
1323-}),
1324-);
1275+expectRecordFields(call[2], {
1276+reply_to_message_id: 800,
1277+allow_sending_without_reply: true,
1278+});
13251279}
13261280});
13271281@@ -1348,12 +1302,10 @@ describe("deliverReplies", () => {
1348130213491303expect(sendPhoto).toHaveBeenCalledTimes(2);
13501304// First media should have reply_to_message_id
1351-expect(sendPhoto.mock.calls[0][2]).toEqual(
1352-expect.objectContaining({
1353-reply_to_message_id: 900,
1354-allow_sending_without_reply: true,
1355-}),
1356-);
1305+expectRecordFields(sendPhoto.mock.calls[0][2], {
1306+reply_to_message_id: 900,
1307+allow_sending_without_reply: true,
1308+});
13571309// Second media should NOT have reply_to_message_id
13581310expect(sendPhoto.mock.calls[1][2]).not.toHaveProperty("reply_to_message_id");
13591311});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。