import { describe, it, expect, vi } from "vitest"; import { validateDiscountCode } from "@/src/modules/settings/lib/discount-validation"; function dbWith(code: Record | null) { return { discountCode: { findUnique: vi.fn().mockResolvedValue(code) }, discountRedemption: { findUnique: vi.fn().mockResolvedValue(null) }, } as never; } const baseCode = { id: "code-1", code: "SOMMER", type: "percent", value: 10, scope: "all_courses", courseIds: [], appliesTo: "courses", restrictedToUserId: null, maxRedemptions: null, redeemedCount: 0, startsAt: null, expiresAt: null, isActive: true, }; const base = { code: "sommer", businessId: "biz-1", userId: "user-1" }; describe("validateDiscountCode - wofür ein Code gilt", () => { it("Kurs-Codes gelten nicht beim Kartenkauf", async () => { const result = await validateDiscountCode(dbWith(baseCode), { ...base, productId: "prod-1" }); expect(result).toEqual({ valid: false, reason: "Dieser Rabattcode gilt nicht für Karten." }); }); it("Karten-Codes gelten nicht für Kurse", async () => { const result = await validateDiscountCode(dbWith({ ...baseCode, appliesTo: "passes" }), { ...base, courseId: "course-1", }); expect(result).toEqual({ valid: false, reason: "Dieser Rabattcode gilt nur für Karten." }); }); it("Codes für beides gelten bei Kurs und Karte", async () => { const db = dbWith({ ...baseCode, appliesTo: "all" }); expect((await validateDiscountCode(db, { ...base, courseId: "c" })).valid).toBe(true); expect((await validateDiscountCode(db, { ...base, productId: "p" })).valid).toBe(true); }); it("die Kursauswahl wirkt beim Kartenkauf nicht", async () => { const db = dbWith({ ...baseCode, appliesTo: "all", scope: "specific_courses", courseIds: ["c1"], }); expect((await validateDiscountCode(db, { ...base, productId: "p" })).valid).toBe(true); expect((await validateDiscountCode(db, { ...base, courseId: "c2" })).valid).toBe(false); }); }); describe("validateDiscountCode - persönliche Codes", () => { it("gilt nur für das eigene Konto", async () => { const db = dbWith({ ...baseCode, restrictedToUserId: "user-1" }); expect((await validateDiscountCode(db, { ...base, courseId: "c" })).valid).toBe(true); expect(await validateDiscountCode(db, { ...base, userId: "user-2", courseId: "c" })).toEqual({ valid: false, reason: "Dieser Rabattcode gehört zu einem anderen Kundenkonto.", }); }); });