From 82d132f1ba791b463d8d34291f4dcf7946624b8b Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 16 Feb 2026 12:45:07 -0500 Subject: [PATCH] Slack: add send blocks behavior tests --- src/slack/send.blocks.test.ts | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/slack/send.blocks.test.ts diff --git a/src/slack/send.blocks.test.ts b/src/slack/send.blocks.test.ts new file mode 100644 index 00000000000..1b64ee5ffc5 --- /dev/null +++ b/src/slack/send.blocks.test.ts @@ -0,0 +1,65 @@ +import type { WebClient } from "@slack/web-api"; +import { describe, expect, it, vi } from "vitest"; + +vi.mock("../config/config.js", () => ({ + loadConfig: () => ({}), +})); + +vi.mock("./accounts.js", () => ({ + resolveSlackAccount: () => ({ + accountId: "default", + botToken: "xoxb-test", + botTokenSource: "config", + config: {}, + }), +})); + +const { sendMessageSlack } = await import("./send.js"); + +function createClient() { + return { + conversations: { + open: vi.fn(async () => ({ channel: { id: "D123" } })), + }, + chat: { + postMessage: vi.fn(async () => ({ ts: "171234.567" })), + }, + } as unknown as WebClient & { + conversations: { open: ReturnType }; + chat: { postMessage: ReturnType }; + }; +} + +describe("sendMessageSlack blocks", () => { + it("posts blocks with fallback text when message is empty", async () => { + const client = createClient(); + const result = await sendMessageSlack("channel:C123", "", { + token: "xoxb-test", + client, + blocks: [{ type: "divider" }], + }); + + expect(client.conversations.open).not.toHaveBeenCalled(); + expect(client.chat.postMessage).toHaveBeenCalledWith( + expect.objectContaining({ + channel: "C123", + text: " ", + blocks: [{ type: "divider" }], + }), + ); + expect(result).toEqual({ messageId: "171234.567", channelId: "C123" }); + }); + + it("rejects blocks combined with mediaUrl", async () => { + const client = createClient(); + await expect( + sendMessageSlack("channel:C123", "hi", { + token: "xoxb-test", + client, + mediaUrl: "https://example.com/image.png", + blocks: [{ type: "divider" }], + }), + ).rejects.toThrow(/does not support blocks with mediaUrl/i); + expect(client.chat.postMessage).not.toHaveBeenCalled(); + }); +});