Kuma/tests/settings/discount-validation.test.ts
2026-10-02 17:31:08 +02:00

70 lines
2.5 KiB
TypeScript

import { describe, it, expect, vi } from "vitest";
import { validateDiscountCode } from "@/src/modules/settings/lib/discount-validation";
function dbWith(code: Record<string, unknown> | 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.",
});
});
});