Kuma/tests/products/pass-rules.test.ts
2026-10-02 14:30:54 +02:00

58 lines
2.2 KiB
TypeScript

import { describe, it, expect } from "vitest";
import {
canRedeemPass,
passCoversCourse,
passDisplayStatus,
passRevenueCents,
validUntilFrom,
} from "@/src/modules/products/lib/pass-rules";
const now = new Date("2026-10-02T12:00:00Z");
const pass = { status: "active", validUntil: null as Date | null, creditsRemaining: 3 };
describe("passCoversCourse", () => {
it("gilt ohne Kursarten für alle Kurse", () => {
expect(passCoversCourse([], ["yoga"])).toBe(true);
});
it("gilt nur für Kurse mit mindestens einer passenden Kursart", () => {
expect(passCoversCourse(["pilates"], ["pilates", "reformer"])).toBe(true);
expect(passCoversCourse(["pilates"], ["yoga"])).toBe(false);
});
});
describe("canRedeemPass", () => {
it("braucht eine aktive, nicht abgelaufene Karte mit genug Einheiten", () => {
expect(canRedeemPass(pass, 3, now)).toBe(true);
expect(canRedeemPass(pass, 4, now)).toBe(false);
expect(canRedeemPass({ ...pass, status: "ended" }, 1, now)).toBe(false);
expect(canRedeemPass({ ...pass, validUntil: new Date("2026-10-01") }, 1, now)).toBe(false);
});
});
describe("passDisplayStatus", () => {
it("zeigt erstattet und beendet vor abgelaufen", () => {
const expired = new Date("2026-01-01");
expect(passDisplayStatus({ ...pass, status: "refunded", validUntil: expired }, now)).toBe(
"refunded"
);
expect(passDisplayStatus({ ...pass, validUntil: expired }, now)).toBe("expired");
expect(passDisplayStatus({ ...pass, creditsRemaining: 0 }, now)).toBe("used_up");
expect(passDisplayStatus(pass, now)).toBe("active");
});
});
describe("passRevenueCents", () => {
it("zählt den Kartenpreis ohne Servicegebühr, nach Erstattung nichts", () => {
expect(passRevenueCents({ status: "active", amountPaid: 12500, platformFee: 500 })).toBe(12000);
expect(passRevenueCents({ status: "refunded", amountPaid: 12500, platformFee: 500 })).toBe(0);
expect(passRevenueCents({ status: "active", amountPaid: null, platformFee: null })).toBe(0);
});
});
describe("validUntilFrom", () => {
it("rechnet Monate ab dem Kauf, ohne Gültigkeit unbegrenzt", () => {
expect(validUntilFrom(now, 6)?.toISOString()).toBe("2027-04-02T12:00:00.000Z");
expect(validUntilFrom(now, null)).toBeNull();
});
});