import { describe, expect, it } from "vitest"; import { computePoMoney, poNetPayable, amountToPercent, percentToAmount, } from "@/lib/po-money"; const items = [ { quantity: 10, unitPrice: 100, gstRate: 0.18 }, // taxable 1000, gst 180 { quantity: 2, unitPrice: 50, gstRate: 0.05 }, // taxable 100, gst 5 ]; describe("computePoMoney", () => { it("breaks down taxable, GST and incl-GST", () => { const m = computePoMoney(items); expect(m.taxable).toBe(1100); expect(m.gst).toBeCloseTo(185, 5); expect(m.inclGst).toBeCloseTo(1285, 5); expect(m.netPayable).toBeCloseTo(1285, 5); // no charges ⇒ equals inclGst }); it("adds TCS and subtracts Discount post-GST", () => { const m = computePoMoney(items, 50, 85); expect(m.tcs).toBe(50); expect(m.discount).toBe(85); expect(m.netPayable).toBeCloseTo(1285 + 50 - 85, 5); }); it("defaults a missing gstRate to 18%", () => { expect(computePoMoney([{ quantity: 1, unitPrice: 100 }]).gst).toBeCloseTo(18, 5); }); it("treats nullish charges as zero", () => { const m = computePoMoney(items, undefined, undefined); expect(m.netPayable).toBeCloseTo(1285, 5); }); }); describe("poNetPayable", () => { it("is incl-GST + TCS − Discount", () => { expect(poNetPayable(items, 100, 200)).toBeCloseTo(1285 + 100 - 200, 5); }); }); describe("percent ↔ amount conversion", () => { it("round-trips against a base", () => { expect(amountToPercent(128.5, 1285)).toBeCloseTo(10, 5); expect(percentToAmount(10, 1285)).toBeCloseTo(128.5, 5); }); it("is zero-safe when the base is zero", () => { expect(amountToPercent(50, 0)).toBe(0); expect(percentToAmount(10, 0)).toBe(0); }); });