import { describe, expect, it, vi } from "vitest"; import type { WebClient } from "@slack/web-api"; import { readSlackMessages } from "./actions.js"; function createClient() { return { conversations: { replies: vi.fn(async () => ({ messages: [], has_more: false })), history: vi.fn(async () => ({ messages: [], has_more: false })), }, } as unknown as WebClient & { conversations: { replies: ReturnType; history: ReturnType; }; }; } describe("readSlackMessages", () => { it("uses conversations.replies and drops the parent message", async () => { const client = createClient(); client.conversations.replies.mockResolvedValueOnce({ messages: [{ ts: "171234.567" }, { ts: "171234.890" }, { ts: "171235.000" }], has_more: true, }); const result = await readSlackMessages("C1", { client, threadId: "171234.567", token: "xoxb-test", }); expect(client.conversations.replies).toHaveBeenCalledWith({ channel: "C1", ts: "171234.567", limit: undefined, latest: undefined, oldest: undefined, }); expect(client.conversations.history).not.toHaveBeenCalled(); expect(result.messages.map((message) => message.ts)).toEqual(["171234.890", "171235.000"]); }); it("uses conversations.history when threadId is missing", async () => { const client = createClient(); client.conversations.history.mockResolvedValueOnce({ messages: [{ ts: "1" }], has_more: false, }); const result = await readSlackMessages("C1", { client, limit: 20, token: "xoxb-test", }); expect(client.conversations.history).toHaveBeenCalledWith({ channel: "C1", limit: 20, latest: undefined, oldest: undefined, }); expect(client.conversations.replies).not.toHaveBeenCalled(); expect(result.messages.map((message) => message.ts)).toEqual(["1"]); }); });