import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const { requireAdmin, update, set, where, returning, refresh } = vi.hoisted(() => ({ requireAdmin: vi.fn(), update: vi.fn(), set: vi.fn(), where: vi.fn(), returning: vi.fn(), refresh: vi.fn(), })); vi.mock("server-only", () => ({})); vi.mock("@/lib/auth/server", () => ({ requireAdmin })); vi.mock("@/db", () => ({ getDb: () => ({ update }) })); vi.mock("next/cache", () => ({ refresh })); import { setCommissionSlipProvider } from "./actions"; beforeEach(() => { vi.clearAllMocks(); requireAdmin.mockResolvedValue({ user: { id: "admin" } }); update.mockReturnValue({ set }); set.mockReturnValue({ where }); where.mockReturnValue({ returning }); returning.mockResolvedValue([{ slipProvider: "slipok" }]); vi.stubEnv("SLIPOK_BRANCH_ID", "123"); vi.stubEnv("SLIPOK_API_KEY", "secret"); }); afterEach(() => vi.unstubAllEnvs()); describe("admin slip provider settings", () => { it("requires authorization before updating settings", async () => { requireAdmin.mockRejectedValue(new Error("unauthorized")); await expect(setCommissionSlipProvider("slipok")).rejects.toThrow("unauthorized"); expect(update).not.toHaveBeenCalled(); }); it.each(["invalid", null, { slipProvider: "slipok" }])("rejects invalid input", async (value) => { expect(await setCommissionSlipProvider(value)).toMatchObject({ status: "error" }); expect(update).not.toHaveBeenCalled(); }); it.each(["", "abc", "123/other"])("rejects unconfigured or invalid branch IDs", async (branch) => { vi.stubEnv("SLIPOK_BRANCH_ID", branch); expect(await setCommissionSlipProvider("slipok")).toMatchObject({ status: "error" }); expect(update).not.toHaveBeenCalled(); }); it("rejects a missing key", async () => { vi.stubEnv("SLIPOK_API_KEY", " "); expect(await setCommissionSlipProvider("slipok")).toMatchObject({ status: "error" }); expect(update).not.toHaveBeenCalled(); }); it("saves only the provider and timestamp and refreshes the current view", async () => { expect(await setCommissionSlipProvider("slipok")).toEqual({ status: "saved" }); expect(set).toHaveBeenCalledWith({ slipProvider: "slipok", updatedAt: expect.any(Date) }); expect(refresh).toHaveBeenCalledOnce(); }); it("supports switching back to Slip2Go", async () => { vi.stubEnv("SLIP2GO_VERIFY_URL", "https://slip2go.test/verify"); vi.stubEnv("SLIP2GO_API_SECRET", "secret"); expect(await setCommissionSlipProvider("slip2go")).toEqual({ status: "saved" }); expect(set).toHaveBeenCalledWith({ slipProvider: "slip2go", updatedAt: expect.any(Date) }); }); it.each([{ result: [] }, { result: "throw" }])("reports missing settings or failed persistence", async ({ result }) => { if (result === "throw") returning.mockRejectedValueOnce(new Error("database error")); else returning.mockResolvedValueOnce(result); expect(await setCommissionSlipProvider("slipok")).toMatchObject({ status: "error" }); expect(refresh).not.toHaveBeenCalled(); }); });