import { expect } from "@std/expect"; import { describe, it as test } from "@std/testing/bdd"; import { bookingFactsFromOrder } from "#shared/checkout-ledger.ts"; import { assessTax } from "#shared/tax/assessment.ts"; import { pricedLine as line, pricedOrder as order, } from "#test-utils/factories-pricing.ts"; const ctx = { attendeeId: 42, eventId: "cs_test_1", occurredAt: "2026-06-21T00:00:00.000Z", }; describe("bookingFactsFromOrder", () => { test("maps listings, modifiers, fee, and cash taken now", () => { const facts = bookingFactsFromOrder( order({ extras: [{ amount: 300, key: "fee", name: "Booking fee", quantity: 1 }], lines: [line(1, 5000, 2)], modifierApplications: [ { amountApplied: 500, delta: -500, modifierId: 7, name: "10% off", quantity: 1, scopedSubtotal: 10000, }, ], total: 9800, }), ctx, ); expect(facts).toEqual({ amountPaid: 9800, attendeeId: 42, bookingFee: 300, eventId: "cs_test_1", lines: [{ gross: 10000, listingId: 1 }], modifiers: [{ delta: -500, modifierId: 7 }], occurredAt: "2026-06-21T00:00:00.000Z", vat: { mode: "none" }, }); }); test("gross is the full list price, not the deposit charged now", () => { const facts = bookingFactsFromOrder( order({ lines: [line(1, 10000, 1, 3000)], total: 3000 }), ctx, ); expect(facts.lines).toEqual([{ gross: 10000, listingId: 1 }]); expect(facts.amountPaid).toBe(3000); }); test("sums discount-split lines of one listing; no fee means zero", () => { const facts = bookingFactsFromOrder( order({ lines: [line(1, 5000, 3, 5000), line(1, 5000, 2, 4500)], total: 24000, }), ctx, ); expect(facts.lines).toEqual([{ gross: 25000, listingId: 1 }]); expect(facts.bookingFee).toBe(0); }); test("carries the booking's VAT facts", () => { const facts = bookingFactsFromOrder( order({ lines: [line(1, 10000, 1)], tax: assessTax( { lines: [{ gross: 10000, listingId: 1 }], modifiers: [] }, { mode: "add_to_total", rateBasisPoints: 2000 }, ), total: 0, }), ctx, ); expect(facts.vat).toEqual({ mode: "add_to_total", rateBasisPoints: 2000 }); }); });