// Generated, do not edit. sha256:e6372fe91ca8e6ef9c9213910791d9f4680d2b61f799f7e5cca275bcd9a9d482 import { describe, it, mock } from 'node:test'; import assert from 'node:assert/strict'; import { vasteRekenvaluta } from '../helpers/rekenvaluta.mjs'; await vasteRekenvaluta(mock, 'EUR'); const { originLines, originHtml, bookingOriginLines } = await import('../../client/ui/price-origin.js'); const BTC = { kind: 'crypto', decimals: 8, unit: 'BTC', subunit: 'sat', displayUnit: 'unit' }; const GOUD = { kind: 'metal', unit: 'ozt', subunit: 'g', displayUnit: 'unit' }; const basis = { day: '2025-01-01', fiatPrice:90000, ageDays: 0, deviation: null, source: 'Bitvavo', sourceDay: '2025-01-01', moment: null }; describe('originLines: per soort de zin die de gebruiker leest', () => { it('een slotkoers noemt de bron en is sterk', () => { const r = originLines({ ...basis, kind: 'close' }, BTC); assert.match(r[0], /^Koers .*90\.000.* per BTC op 1 jan\.? 2025$/); assert.equal(r[1], 'Slotkoers van Bitvavo'); assert.equal(r.at(-1), 'Nauwkeurigheid: hoog'); }); it('een afgeleide koers noemt het moment en de afwijking aan beide kanten', () => { const r = originLines({ ...basis, kind: 'spot', moment: '2025-01-01T09:12:00.000Z', deviation: { before: 1.8, after: -0.4 } }, BTC); assert.match(r[1], /^Afgeleid uit de spot van \d\d:\d\d bij Bitvavo, geen slotkoers$/); assert.equal(r[2], '+1,8% naast de slotkoers ervoor, -0,4% naast die erna'); assert.equal(r.at(-1), 'Nauwkeurigheid: lager'); }); it('een afgeleide koers zonder slotkoers erna noemt alleen de kant die er is', () => { const r = originLines({ ...basis, kind: 'spot', deviation: { before: 2, after: null } }, BTC); assert.equal(r[2], '+2% naast de slotkoers ervoor'); }); it('een doorgetrokken koers noemt zijn brondag en leeftijd, en is zwak', () => { const r = originLines({ ...basis, day: '2025-01-01', kind: 'carried', sourceDay: '2024-12-29', ageDays: 3 }, BTC); assert.match(r[1], /^Doorgetrokken van 29 dec\.? 2024 \(Bitvavo\), 3 dagen oud$/); assert.equal(r.at(-1), 'Nauwkeurigheid: laag'); }); it('met de hand en live zeggen dat, en metaal staat per ozt', () => { assert.equal(originLines({ ...basis, kind: 'manual' }, GOUD)[1], 'Met de hand ingevoerd'); assert.match(originLines({ ...basis, kind: 'manual' }, GOUD)[0], / per ozt op /); assert.equal(originLines({ ...basis, kind: 'live', source: null }, BTC)[1], 'Actuele koers, die nog beweegt'); assert.equal(originLines({ ...basis, kind: 'live', source: null }, BTC).at(-1), 'Nauwkeurigheid: hoog'); }); it('noemt nooit een percentage als nauwkeurigheid', () => { for (const kind of ['close', 'manual', 'live', 'spot', 'carried']) { const laatste = originLines({ ...basis, kind }, BTC).at(-1); assert.doesNotMatch(laatste, /%/, `${kind}: ${laatste}`); } }); it('geeft niets zonder herkomst of zonder koers', () => { assert.deepEqual(originLines(null, BTC), []); assert.deepEqual(originLines({ ...basis, kind: 'close', fiatPrice:null }, BTC), []); assert.equal(originHtml(null, BTC), ''); }); }); describe('bookingOriginLines: de prijs van een boeking', () => { const boeking = extra => ({ fiatPrice: 90000, occurredAt: '2025-03-04T14:32:00.000Z', priceOrigin: 'paid', ...extra }); it('een betaalde prijs is hoog', () => { const r = bookingOriginLines(boeking(), BTC); assert.match(r[0], /^Prijs .*90\.000.* per BTC$/); assert.equal(r[1], 'Betaald: de prijs die je zelf invoerde'); assert.equal(r.at(-1), 'Nauwkeurigheid: hoog'); }); it('een opgezochte dagkoers zegt dat hij geen koers van het moment is, en is lager', () => { const r = bookingOriginLines(boeking({ priceOrigin: 'market_day' }), BTC); assert.match(r[1], /^Dagkoers van 4 mrt\.? 2025, opgezocht bij het boeken$/); assert.equal(r[2], 'Een dagkoers is niet de koers van het moment zelf'); assert.equal(r.at(-1), 'Nauwkeurigheid: lager'); }); it('noemt de dagkoers uit de historie als die er nog precies zo staat, en een doorgetrokken is laag', () => { const dagHerkomst = { ...basis, day: '2025-03-04', kind: 'carried', sourceDay: '2025-03-01', ageDays: 3 }; const r = bookingOriginLines(boeking({ priceOrigin: 'market_day' }), BTC, dagHerkomst); assert.match(r[1], /^Dagkoers van 4 mrt\.? 2025: doorgetrokken van 1 mrt\.? 2025 \(Bitvavo\), 3 dagen oud$/); assert.equal(r.at(-1), 'Nauwkeurigheid: laag'); }); it('een gift heeft geen prijs en dus geen hover, een onbekende herkomst zegt dat', () => { assert.deepEqual(bookingOriginLines(boeking({ priceOrigin: 'none', fiatPrice: 0 }), BTC), []); const r = bookingOriginLines(boeking({ priceOrigin: null }), BTC); assert.equal(r[1], 'Niet vastgelegd of deze prijs betaald of opgezocht is'); assert.equal(r.at(-1), 'Nauwkeurigheid: onbekend'); }); }); describe('originHtml', () => { it('escapet een bronnaam met markup in het attribuut, en de tekst gaat mee', () => { const html = originHtml({ ...basis, kind: 'close', source: '">' }, BTC); assert.doesNotMatch(html, /