import { beforeEach, describe, expect, it, vi } from "vitest"; const createTelegramDraftStream = vi.hoisted(() => vi.fn()); const dispatchReplyWithBufferedBlockDispatcher = vi.hoisted(() => vi.fn()); const deliverReplies = vi.hoisted(() => vi.fn()); vi.mock("./draft-stream.js", () => ({ createTelegramDraftStream, })); vi.mock("../auto-reply/reply/provider-dispatcher.js", () => ({ dispatchReplyWithBufferedBlockDispatcher, })); vi.mock("./bot/delivery.js", () => ({ deliverReplies, })); vi.mock("./sticker-cache.js", () => ({ cacheSticker: vi.fn(), describeStickerImage: vi.fn(), })); import { dispatchTelegramMessage } from "./bot-message-dispatch.js"; describe("dispatchTelegramMessage draft streaming", () => { beforeEach(() => { createTelegramDraftStream.mockReset(); dispatchReplyWithBufferedBlockDispatcher.mockReset(); deliverReplies.mockReset(); }); it("streams drafts in private threads and forwards thread id", async () => { const draftStream = { update: vi.fn(), flush: vi.fn().mockResolvedValue(undefined), stop: vi.fn(), }; createTelegramDraftStream.mockReturnValue(draftStream); dispatchReplyWithBufferedBlockDispatcher.mockImplementation( async ({ dispatcherOptions, replyOptions }) => { await replyOptions?.onPartialReply?.({ text: "Hello" }); await dispatcherOptions.deliver({ text: "Hello" }, { kind: "final" }); return { queuedFinal: true }; }, ); deliverReplies.mockResolvedValue({ delivered: true }); const resolveBotTopicsEnabled = vi.fn().mockResolvedValue(true); const context = { ctxPayload: {}, primaryCtx: { message: { chat: { id: 123, type: "private" } } }, msg: { chat: { id: 123, type: "private" }, message_id: 456, message_thread_id: 777, }, chatId: 123, isGroup: false, resolvedThreadId: undefined, replyThreadId: 777, historyKey: undefined, historyLimit: 0, groupHistories: new Map(), route: { agentId: "default", accountId: "default" }, skillFilter: undefined, sendTyping: vi.fn(), sendRecordVoice: vi.fn(), ackReactionPromise: null, reactionApi: null, removeAckAfterReply: false, }; await dispatchTelegramMessage({ context, bot: { api: {} }, cfg: {}, runtime: {}, replyToMode: "first", streamMode: "partial", textLimit: 4096, telegramCfg: {}, opts: {}, resolveBotTopicsEnabled, }); expect(resolveBotTopicsEnabled).toHaveBeenCalledWith(context.primaryCtx); expect(createTelegramDraftStream).toHaveBeenCalledWith( expect.objectContaining({ chatId: 123, messageThreadId: 777, }), ); expect(draftStream.update).toHaveBeenCalledWith("Hello"); expect(deliverReplies).toHaveBeenCalledWith( expect.objectContaining({ messageThreadId: 777, }), ); }); });