Files
Wabenhain/src/lib/bulk-discount-calc.test.ts
T
Nick Szaunig c7927f2883 feat: Wabenhain Honig-Shop Anwendung
Vollstaendige Next.js/Prisma-E-Commerce-Anwendung fuer eine Imkerei:
Shop, Warenkorb, Stripe-Checkout, Kundenkonto mit 2FA, Admin-Bereich
(Produkte, Ernten, Chargen, Bestellungen, Gutscheine, admin-editierbare
Website-Inhalte), i18n (DE/EN), Rate-Limiting/CSP/Audit-Log-Haertung,
PostgreSQL- und MySQL-Unterstuetzung ueber austauschbare Prisma-
Treiber-Adapter, Unit-/Komponenten-/E2E-Tests.
2026-08-17 14:30:28 +02:00

49 lines
1.7 KiB
TypeScript

import { describe, test, expect } from "vitest";
import { resolveBulkDiscount, getNextBulkDiscountTier } from "./bulk-discount-calc";
const tiers = [
{ code: "MENGE10", minQuantity: 3, percent: 10 },
{ code: "MENGE15", minQuantity: 6, percent: 15 },
];
describe("resolveBulkDiscount", () => {
test("returns null when no tier is configured", () => {
expect(resolveBulkDiscount([], 5)).toBeNull();
});
test("returns null below the lowest threshold", () => {
expect(resolveBulkDiscount(tiers, 2)).toBeNull();
});
test("picks the lowest tier at its boundary", () => {
expect(resolveBulkDiscount(tiers, 3)).toEqual({ code: "MENGE10", minQuantity: 3, percent: 10 });
});
test("picks the higher tier once its threshold is reached", () => {
expect(resolveBulkDiscount(tiers, 6)).toEqual({ code: "MENGE15", minQuantity: 6, percent: 15 });
});
test("is unaffected by tier input order", () => {
const shuffled = [...tiers].reverse();
expect(resolveBulkDiscount(shuffled, 6)).toEqual({ code: "MENGE15", minQuantity: 6, percent: 15 });
});
});
describe("getNextBulkDiscountTier", () => {
test("returns null when no tier is configured", () => {
expect(getNextBulkDiscountTier([], 1)).toBeNull();
});
test("returns null once the highest tier is reached", () => {
expect(getNextBulkDiscountTier(tiers, 6)).toBeNull();
});
test("reports units and percent of the next tier", () => {
expect(getNextBulkDiscountTier(tiers, 1)).toEqual({ unitsUntilNext: 2, percent: 10 });
});
test("reports the tier after the currently active one", () => {
expect(getNextBulkDiscountTier(tiers, 3)).toEqual({ unitsUntilNext: 3, percent: 15 });
});
});