59 lines
3.0 KiB
TypeScript
59 lines
3.0 KiB
TypeScript
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();
|
|
});
|
|
});
|