mirror of
https://github.com/Since-3/Kuma.git
synced 2026-10-12 20:51:18 +00:00
81 lines
3 KiB
TypeScript
81 lines
3 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from "vitest";
|
||
|
||
vi.mock("@/src/lib/auth/getUser", () => ({
|
||
requireManager: vi.fn(),
|
||
}));
|
||
vi.mock("@/src/lib/prisma", () => ({
|
||
prisma: {
|
||
courseBooking: { findMany: vi.fn(), groupBy: vi.fn() },
|
||
course: { findMany: vi.fn() },
|
||
customerPass: { findMany: vi.fn() },
|
||
},
|
||
}));
|
||
// Cache ausschalten - der Test soll die Rechnung sehen, nicht den Cache.
|
||
vi.mock("next/cache", () => ({
|
||
unstable_cache: (fn: () => unknown) => fn,
|
||
}));
|
||
|
||
import { getZahlungMetrics } from "@/src/modules/zahlungen/actions/zahlungen-metrics-actions";
|
||
import { requireManager } from "@/src/lib/auth/getUser";
|
||
import { prisma } from "@/src/lib/prisma";
|
||
|
||
beforeEach(() => {
|
||
vi.clearAllMocks();
|
||
vi.mocked(requireManager).mockResolvedValue({
|
||
id: "manager-1",
|
||
businesses: [{ id: "biz-1" }],
|
||
} as never);
|
||
vi.mocked(prisma.courseBooking.groupBy).mockResolvedValue([] as never);
|
||
vi.mocked(prisma.customerPass.findMany).mockResolvedValue([] as never);
|
||
});
|
||
|
||
describe("getZahlungMetrics – Umsatz diesen Monat", () => {
|
||
it("zählt die Servicegebühr nicht als Umsatz des Studios", async () => {
|
||
vi.mocked(prisma.courseBooking.findMany)
|
||
// bezahlt
|
||
.mockResolvedValueOnce([
|
||
// Neues Modell: Kunde zahlte 29,50 €, davon 0,50 € an Kumasy.
|
||
{ amountPaid: 2950, platformFee: 50, platformFeeOnTop: true, refundedAmount: null },
|
||
// Altes 5-%-Modell: amountPaid ist bereits der Kurspreis.
|
||
{ amountPaid: 2900, platformFee: 145, platformFeeOnTop: false, refundedAmount: null },
|
||
] as never)
|
||
// teilerstattet: 50 % des Kursanteils zurück
|
||
.mockResolvedValueOnce([
|
||
{ amountPaid: 2950, platformFee: 50, platformFeeOnTop: true, refundedAmount: 1450 },
|
||
] as never);
|
||
|
||
const result = await getZahlungMetrics({});
|
||
|
||
expect(result.success).toBe(true);
|
||
if (!result.success) return;
|
||
// 29,00 + 29,00 + (29,00 − 14,50). Mit amountPaid wären es 0,50 € mehr pro
|
||
// Buchung im neuen Modell gewesen.
|
||
expect(result.metrics.revenueThisMonth).toBe(2900 + 2900 + 1450);
|
||
expect(result.metrics.paidCount).toBe(3);
|
||
});
|
||
|
||
it("zählt Kartenverkäufe als Umsatz, erstattete nicht", async () => {
|
||
vi.mocked(prisma.courseBooking.findMany).mockResolvedValue([] as never);
|
||
vi.mocked(prisma.customerPass.findMany).mockResolvedValue([
|
||
{ status: "active", amountPaid: 12500, platformFee: 500 },
|
||
{ status: "refunded", amountPaid: 6250, platformFee: 250 },
|
||
] as never);
|
||
|
||
const result = await getZahlungMetrics({});
|
||
|
||
expect(result.success).toBe(true);
|
||
if (!result.success) return;
|
||
expect(result.metrics.revenueThisMonth).toBe(12000);
|
||
expect(result.metrics.paidCount).toBe(1);
|
||
});
|
||
|
||
it("zählt Kartenbuchungen nicht als bezahlte Zahlung", async () => {
|
||
vi.mocked(prisma.courseBooking.findMany).mockResolvedValue([] as never);
|
||
|
||
await getZahlungMetrics({});
|
||
|
||
expect(vi.mocked(prisma.courseBooking.findMany).mock.calls[0][0]?.where).toMatchObject({
|
||
passId: null,
|
||
});
|
||
});
|
||
});
|