Files
buzz-sheet/app/admin/commission/slip-provider-actions.test.ts
T
gunshiz 7ba513c2bb
CI / Verify (push) Successful in 1m56s
CI / Build immutable images and deploy (push) Successful in 3m26s
feat : add slipok and switcher to switch between slip2go and slipok
2026-10-10 00:31:12 +07:00

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();
});
});