36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
/// <reference types="bun" />
|
|
|
|
import { describe, expect, test } from "bun:test";
|
|
import {
|
|
EXPENSE_CATEGORIES,
|
|
formatElapsedSeconds,
|
|
getEffectiveInvoiceStatus,
|
|
parseReceiptText,
|
|
} from "../src";
|
|
|
|
describe("shared domain behavior", () => {
|
|
test("exposes the expense category vocabulary", () => {
|
|
expect(EXPENSE_CATEGORIES).toContain("Professional Services");
|
|
});
|
|
|
|
test("calculates overdue status at day precision", () => {
|
|
const yesterday = new Date();
|
|
yesterday.setDate(yesterday.getDate() - 1);
|
|
expect(getEffectiveInvoiceStatus("sent", yesterday)).toBe("overdue");
|
|
expect(getEffectiveInvoiceStatus("paid", yesterday)).toBe("paid");
|
|
});
|
|
|
|
test("formats elapsed time", () => {
|
|
expect(formatElapsedSeconds(3_661)).toBe("01:01:01");
|
|
});
|
|
|
|
test("extracts receipt totals and line items", () => {
|
|
const receipt = parseReceiptText(
|
|
"Corner Store\nCoffee 3.50\nSubtotal 3.50\nTax 0.31\nTotal 3.81",
|
|
);
|
|
expect(receipt.amount).toBe(3.81);
|
|
expect(receipt.tax).toBe(0.31);
|
|
expect(receipt.items[0]?.name).toBe("Coffee");
|
|
});
|
|
});
|