Kuma/tests/products/pass-purchase-actions.test.ts
2026-10-02 17:44:59 +02:00

58 lines
2.1 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from "vitest";
vi.mock("@/src/lib/prisma", () => ({ prisma: { product: { findUnique: vi.fn() } } }));
vi.mock("@/src/lib/auth/getUser", () => ({
getUserData: vi.fn(),
isUser: (user: { role: string }) => user.role === "user",
}));
vi.mock("@/src/modules/settings/lib/discount-validation", async (importOriginal) => {
const actual =
await importOriginal<typeof import("@/src/modules/settings/lib/discount-validation")>();
return { ...actual, validateDiscountCode: vi.fn() };
});
vi.mock("@/src/modules/marketing/lib/consent", () => ({ hasMarketingConsent: vi.fn() }));
import { prisma } from "@/src/lib/prisma";
import { getUserData } from "@/src/lib/auth/getUser";
import { validateDiscountCode } from "@/src/modules/settings/lib/discount-validation";
import { previewPassDiscountCode } from "@/src/modules/products/actions/pass-purchase-actions";
const product = {
id: "prod-1",
businessId: "biz-1",
priceCents: 12000,
isActive: true,
business: { isPublic: true },
};
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(getUserData).mockResolvedValue({ id: "user-1", role: "user" } as never);
vi.mocked(prisma.product.findUnique).mockResolvedValue(product as never);
vi.mocked(validateDiscountCode).mockResolvedValue({
valid: true,
discountCode: { id: "code-1", type: "percent", value: 25 },
});
});
describe("previewPassDiscountCode", () => {
it("rechnet den Kartenpreis mit Rabatt", async () => {
expect(await previewPassDiscountCode("prod-1", "KARTE25")).toEqual({
valid: true,
discountedPriceCents: 9000,
discountAmountCents: 3000,
});
});
it("lehnt Karten nicht öffentlicher Studios ab - wie der Checkout", async () => {
vi.mocked(prisma.product.findUnique).mockResolvedValue({
...product,
business: { isPublic: false },
} as never);
expect(await previewPassDiscountCode("prod-1", "KARTE25")).toEqual({
valid: false,
error: "Diese Karte ist nicht verfügbar.",
});
expect(validateDiscountCode).not.toHaveBeenCalled();
});
});