
























@@ -1791,4 +1791,91 @@ describe("dispatchTelegramMessage draft streaming", () => {
17911791expect(replies?.[0]?.text?.trim()).toBeTruthy();
17921792expect(replies?.[0]?.text).not.toBe("NO_REPLY");
17931793});
1794+1795+describe("non-streaming media dedup", () => {
1796+const finalDeliveryPayload = () => {
1797+for (const [params] of deliverInboundReplyWithMessageSendContext.mock.calls) {
1798+if (params.info.kind === "final") {
1799+return params.payload;
1800+}
1801+}
1802+throw new Error("missing final delivery");
1803+};
1804+1805+it("deduplicates block-sent media from final reply", async () => {
1806+deliverReplies.mockResolvedValue({ delivered: true });
1807+deliverInboundReplyWithMessageSendContext.mockResolvedValue({
1808+status: "handled_visible",
1809+delivery: { messageIds: ["101"], visibleReplySent: true },
1810+});
1811+dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ dispatcherOptions }) => {
1812+await dispatcherOptions.deliver({ mediaUrls: ["/tmp/cat.jpg"] }, { kind: "block" });
1813+await dispatcherOptions.deliver(
1814+{ text: "Here is the image", mediaUrls: ["/tmp/cat.jpg"] },
1815+{ kind: "final" },
1816+);
1817+return { queuedFinal: true };
1818+});
1819+1820+await dispatchWithContext({
1821+context: createContext(),
1822+streamMode: "off",
1823+telegramDeps: telegramDepsForTest,
1824+});
1825+1826+expect(finalDeliveryPayload().mediaUrls).toEqual([]);
1827+});
1828+1829+it("preserves final media when block delivery reports no visible send", async () => {
1830+deliverReplies.mockResolvedValueOnce({ delivered: false });
1831+deliverReplies.mockResolvedValue({ delivered: true });
1832+deliverInboundReplyWithMessageSendContext.mockResolvedValue({
1833+status: "handled_visible",
1834+delivery: { messageIds: ["101"], visibleReplySent: true },
1835+});
1836+dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ dispatcherOptions }) => {
1837+await dispatcherOptions.deliver({ mediaUrls: ["/tmp/cat.jpg"] }, { kind: "block" });
1838+await dispatcherOptions.deliver(
1839+{ text: "Here is the image", mediaUrls: ["/tmp/cat.jpg"] },
1840+{ kind: "final" },
1841+);
1842+return { queuedFinal: true };
1843+});
1844+1845+await dispatchWithContext({
1846+context: createContext(),
1847+streamMode: "off",
1848+telegramDeps: telegramDepsForTest,
1849+});
1850+1851+expect(finalDeliveryPayload().mediaUrls).toEqual(["/tmp/cat.jpg"]);
1852+});
1853+1854+it("preserves final media when block delivery fails", async () => {
1855+deliverReplies.mockRejectedValueOnce(new Error("Telegram API error"));
1856+deliverReplies.mockResolvedValue({ delivered: true });
1857+deliverInboundReplyWithMessageSendContext.mockResolvedValue({
1858+status: "handled_visible",
1859+delivery: { messageIds: ["101"], visibleReplySent: true },
1860+});
1861+dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ dispatcherOptions }) => {
1862+try {
1863+await dispatcherOptions.deliver({ mediaUrls: ["/tmp/cat.jpg"] }, { kind: "block" });
1864+} catch {}
1865+await dispatcherOptions.deliver(
1866+{ text: "Here is the image", mediaUrls: ["/tmp/cat.jpg"] },
1867+{ kind: "final" },
1868+);
1869+return { queuedFinal: true };
1870+});
1871+1872+await dispatchWithContext({
1873+context: createContext(),
1874+streamMode: "off",
1875+telegramDeps: telegramDepsForTest,
1876+});
1877+1878+expect(finalDeliveryPayload().mediaUrls).toEqual(["/tmp/cat.jpg"]);
1879+});
1880+});
17941881});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。