* fix(telegram): scope DM topic thread keys by chat id * test(telegram): update dm topic session-key expectation * fix(telegram): parse scoped dm thread ids in outbound recovery * chore(telegram): format accounts config merge block * test(nodes): simplify mocked exports for ts tuple spreads
143 lines
4.1 KiB
TypeScript
143 lines
4.1 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import type { ReplyPayload } from "../../../auto-reply/types.js";
|
|
import { telegramOutbound } from "./telegram.js";
|
|
|
|
describe("telegramOutbound", () => {
|
|
it("passes parsed reply/thread ids for sendText", async () => {
|
|
const sendTelegram = vi.fn().mockResolvedValue({ messageId: "tg-text-1", chatId: "123" });
|
|
const sendText = telegramOutbound.sendText;
|
|
expect(sendText).toBeDefined();
|
|
|
|
const result = await sendText!({
|
|
cfg: {},
|
|
to: "123",
|
|
text: "<b>hello</b>",
|
|
accountId: "work",
|
|
replyToId: "44",
|
|
threadId: "55",
|
|
deps: { sendTelegram },
|
|
});
|
|
|
|
expect(sendTelegram).toHaveBeenCalledWith(
|
|
"123",
|
|
"<b>hello</b>",
|
|
expect.objectContaining({
|
|
textMode: "html",
|
|
verbose: false,
|
|
accountId: "work",
|
|
replyToMessageId: 44,
|
|
messageThreadId: 55,
|
|
}),
|
|
);
|
|
expect(result).toEqual({ channel: "telegram", messageId: "tg-text-1", chatId: "123" });
|
|
});
|
|
|
|
it("parses scoped DM thread ids for sendText", async () => {
|
|
const sendTelegram = vi.fn().mockResolvedValue({ messageId: "tg-text-2", chatId: "12345" });
|
|
const sendText = telegramOutbound.sendText;
|
|
expect(sendText).toBeDefined();
|
|
|
|
await sendText!({
|
|
cfg: {},
|
|
to: "12345",
|
|
text: "<b>hello</b>",
|
|
accountId: "work",
|
|
threadId: "12345:99",
|
|
deps: { sendTelegram },
|
|
});
|
|
|
|
expect(sendTelegram).toHaveBeenCalledWith(
|
|
"12345",
|
|
"<b>hello</b>",
|
|
expect.objectContaining({
|
|
textMode: "html",
|
|
verbose: false,
|
|
accountId: "work",
|
|
messageThreadId: 99,
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("passes media options for sendMedia", async () => {
|
|
const sendTelegram = vi.fn().mockResolvedValue({ messageId: "tg-media-1", chatId: "123" });
|
|
const sendMedia = telegramOutbound.sendMedia;
|
|
expect(sendMedia).toBeDefined();
|
|
|
|
const result = await sendMedia!({
|
|
cfg: {},
|
|
to: "123",
|
|
text: "caption",
|
|
mediaUrl: "https://example.com/a.jpg",
|
|
mediaLocalRoots: ["/tmp/media"],
|
|
accountId: "default",
|
|
deps: { sendTelegram },
|
|
});
|
|
|
|
expect(sendTelegram).toHaveBeenCalledWith(
|
|
"123",
|
|
"caption",
|
|
expect.objectContaining({
|
|
textMode: "html",
|
|
verbose: false,
|
|
mediaUrl: "https://example.com/a.jpg",
|
|
mediaLocalRoots: ["/tmp/media"],
|
|
}),
|
|
);
|
|
expect(result).toEqual({ channel: "telegram", messageId: "tg-media-1", chatId: "123" });
|
|
});
|
|
|
|
it("sends payload media list and applies buttons only to first message", async () => {
|
|
const sendTelegram = vi
|
|
.fn()
|
|
.mockResolvedValueOnce({ messageId: "tg-1", chatId: "123" })
|
|
.mockResolvedValueOnce({ messageId: "tg-2", chatId: "123" });
|
|
const sendPayload = telegramOutbound.sendPayload;
|
|
expect(sendPayload).toBeDefined();
|
|
|
|
const payload: ReplyPayload = {
|
|
text: "caption",
|
|
mediaUrls: ["https://example.com/1.jpg", "https://example.com/2.jpg"],
|
|
channelData: {
|
|
telegram: {
|
|
quoteText: "quoted",
|
|
buttons: [[{ text: "Approve", callback_data: "ok" }]],
|
|
},
|
|
},
|
|
};
|
|
|
|
const result = await sendPayload!({
|
|
cfg: {},
|
|
to: "123",
|
|
text: "",
|
|
payload,
|
|
mediaLocalRoots: ["/tmp/media"],
|
|
accountId: "default",
|
|
deps: { sendTelegram },
|
|
});
|
|
|
|
expect(sendTelegram).toHaveBeenCalledTimes(2);
|
|
expect(sendTelegram).toHaveBeenNthCalledWith(
|
|
1,
|
|
"123",
|
|
"caption",
|
|
expect.objectContaining({
|
|
mediaUrl: "https://example.com/1.jpg",
|
|
quoteText: "quoted",
|
|
buttons: [[{ text: "Approve", callback_data: "ok" }]],
|
|
}),
|
|
);
|
|
expect(sendTelegram).toHaveBeenNthCalledWith(
|
|
2,
|
|
"123",
|
|
"",
|
|
expect.objectContaining({
|
|
mediaUrl: "https://example.com/2.jpg",
|
|
quoteText: "quoted",
|
|
}),
|
|
);
|
|
const secondCallOpts = sendTelegram.mock.calls[1]?.[2] as Record<string, unknown>;
|
|
expect(secondCallOpts?.buttons).toBeUndefined();
|
|
expect(result).toEqual({ channel: "telegram", messageId: "tg-2", chatId: "123" });
|
|
});
|
|
});
|