import { test } from "node:test"; import assert from "node:assert/strict"; import { buildRateResolver, convertedPart, toTotal, totalOverMonths, rateFormula } from "./fx.ts"; const rows = [ { year: 2026, month: 1, average_rate: "1.0801" }, { year: 2026, month: 3, average_rate: 1.08642 }, ]; test("tasso del mese quando c'è", () => { const r = buildRateResolver(rows)(2026, 3); assert.deepEqual(r, { rate: 1.08642, source: "month", year: 2026, month: 3 }); }); test("mese mancante: ultimo tasso precedente, segnalato come stima", () => { const r = buildRateResolver(rows)(2026, 2); assert.equal(r?.rate, 1.0801); assert.equal(r?.source, "previous"); assert.equal(r?.month, 1); }); test("prima del primo tasso noto: si usa il successivo", () => { const r = buildRateResolver(rows)(2025, 12); assert.equal(r?.source, "next"); assert.equal(r?.month, 1); }); test("nessun tasso: null, mai 1", () => { assert.equal(buildRateResolver([])(2026, 3), null); }); test("Total EUR = EUR + USD ÷ tasso, arrotondato ai centesimi", () => { const p = { eur: 4210, usd: 610 }; assert.equal(convertedPart(p, 1.08642, "EUR"), 561.48); assert.equal(toTotal(p, 1.08642, "EUR"), 4771.48); }); test("Total USD = USD + EUR × tasso", () => { const p = { eur: 4210, usd: 610 }; assert.equal(convertedPart(p, 1.08642, "USD"), 4573.83); assert.equal(toTotal(p, 1.08642, "USD"), 5183.83); }); test("più mesi: ogni mese col suo tasso", () => { const t = totalOverMonths([{ eur: 100, usd: 108 }, { eur: 100, usd: 110 }], [1.08, 1.1], "EUR"); assert.equal(t, 400); }); test("mese con importi ma senza tasso: totale non calcolabile", () => { assert.equal(totalOverMonths([{ eur: 1, usd: 1 }], [null], "EUR"), null); assert.equal(totalOverMonths([{ eur: 0, usd: 0 }], [null], "EUR"), 0); }); test("formula", () => { assert.equal(rateFormula("1.086420", "EUR"), "USD ÷ 1.086420"); assert.equal(rateFormula("1.086420", "USD"), "EUR × 1.086420"); });