import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const exists = vi.fn(); vi.mock("@/lib/redis/client", () => ({ getRedisClient: async () => ({ exists }), discordWorkerHeartbeatKey: () => "buzz:events:discord-worker:heartbeat", })); const { checkSlip2Go, checkDiscordBot, checkLunaris } = await import("./services"); const originalFetch = globalThis.fetch; const originalUrl = process.env.SLIP2GO_VERIFY_URL; const originalSecret = process.env.SLIP2GO_API_SECRET; const fetchMock = vi.fn(); describe("external service checks", () => { beforeEach(() => { vi.clearAllMocks(); globalThis.fetch = fetchMock as unknown as typeof fetch; process.env.SLIP2GO_VERIFY_URL = "https://slip2go.example.test/verify"; process.env.SLIP2GO_API_SECRET = "secret"; }); afterEach(() => { globalThis.fetch = originalFetch; if (originalUrl === undefined) delete process.env.SLIP2GO_VERIFY_URL; else process.env.SLIP2GO_VERIFY_URL = originalUrl; if (originalSecret === undefined) delete process.env.SLIP2GO_API_SECRET; else process.env.SLIP2GO_API_SECRET = originalSecret; }); it("checks Slip2Go reachability without submitting a slip", async () => { fetchMock.mockResolvedValue(new Response(null, { status: 405 })); await expect(checkSlip2Go(AbortSignal.timeout(1000))).resolves.toBeUndefined(); expect(fetchMock).toHaveBeenCalledWith( new URL("https://slip2go.example.test/verify"), expect.objectContaining({ method: "HEAD", cache: "no-store" }), ); fetchMock.mockResolvedValue(new Response(null, { status: 503 })); await expect(checkSlip2Go(AbortSignal.timeout(1000))).rejects.toThrow("503"); }); it("requires a valid Lunaris version response", async () => { fetchMock.mockResolvedValueOnce(Response.json({ version: "7.0.54" })); await expect(checkLunaris(AbortSignal.timeout(1000))).resolves.toBeUndefined(); fetchMock.mockResolvedValueOnce(Response.json({ version: "invalid" })); await expect(checkLunaris(AbortSignal.timeout(1000))).rejects.toThrow(); }); it("requires a live Discord worker heartbeat", async () => { exists.mockResolvedValueOnce(1).mockResolvedValueOnce(0); await expect(checkDiscordBot()).resolves.toBeUndefined(); await expect(checkDiscordBot()).rejects.toThrow("heartbeat"); }); });