import { describe, expect, it, vi } from "vitest"; const set = vi.fn().mockResolvedValue(null); const getRedisClient = vi.fn().mockResolvedValue({ set }); const inspectImage = vi.fn(); const verifyCommissionSlip = vi.fn(); vi.mock("server-only", () => ({})); vi.mock("@/lib/redis/client", () => ({ getRedisClient })); vi.mock("@/lib/media/inspect", () => ({ inspectImage })); vi.mock("@/lib/commission/payment", () => ({ verifyCommissionSlip })); const { verifyAndCreateTicket } = await import("./slip-upload"); describe("commission slip submission lock", () => { it("rejects a second verification for the same checkout before calling Slip2Go", async () => { const checkout = { id: "checkout-1", userId: "customer-1", amountBaht: 150 }; const file = new File(["image"], "slip.png", { type: "image/png" }); await expect(verifyAndCreateTicket(checkout as Parameters[0], file)) .rejects.toMatchObject({ status: 409, message: "slip-verification-in-progress" }); expect(set).toHaveBeenCalledWith(expect.stringContaining(":commission-slip-lock:checkout-1"), expect.any(String), "EX", 60, "NX"); expect(inspectImage).not.toHaveBeenCalled(); expect(verifyCommissionSlip).not.toHaveBeenCalled(); }); });