import { beforeEach, describe, expect, it, vi } from "vitest"; const authTestMock = vi.hoisted(() => vi.fn()); const createSlackWebClientMock = vi.hoisted(() => vi.fn()); const withTimeoutMock = vi.hoisted(() => vi.fn()); vi.mock("./client.js", () => ({ createSlackWebClient: createSlackWebClientMock, })); vi.mock("../utils/with-timeout.js", () => ({ withTimeout: withTimeoutMock, })); const { probeSlack } = await import("./probe.js"); describe("probeSlack", () => { beforeEach(() => { authTestMock.mockReset(); createSlackWebClientMock.mockReset(); withTimeoutMock.mockReset(); createSlackWebClientMock.mockReturnValue({ auth: { test: authTestMock, }, }); withTimeoutMock.mockImplementation(async (promise: Promise) => await promise); }); it("maps Slack auth metadata on success", async () => { vi.spyOn(Date, "now").mockReturnValueOnce(100).mockReturnValueOnce(145); authTestMock.mockResolvedValue({ ok: true, user_id: "U123", user: "openclaw-bot", team_id: "T123", team: "OpenClaw", }); await expect(probeSlack("xoxb-test", 2500)).resolves.toEqual({ ok: true, status: 200, elapsedMs: 45, bot: { id: "U123", name: "openclaw-bot" }, team: { id: "T123", name: "OpenClaw" }, }); expect(createSlackWebClientMock).toHaveBeenCalledWith("xoxb-test"); expect(withTimeoutMock).toHaveBeenCalledWith(expect.any(Promise), 2500); }); it("keeps optional auth metadata fields undefined when Slack omits them", async () => { vi.spyOn(Date, "now").mockReturnValueOnce(200).mockReturnValueOnce(235); authTestMock.mockResolvedValue({ ok: true }); const result = await probeSlack("xoxb-test"); expect(result.ok).toBe(true); expect(result.status).toBe(200); expect(result.elapsedMs).toBe(35); expect(result.bot).toStrictEqual({ id: undefined, name: undefined }); expect(result.team).toStrictEqual({ id: undefined, name: undefined }); }); });