// Generated, do not edit. sha256:aba0586264c0c6a96c6db4f231f8de0168b2d96c5e9e95d8a830ca04a1e9dd99 import { describe, it, mock } from 'node:test'; import assert from 'node:assert/strict'; mock.module('../../client/app-settings.js', { namedExports: { appSetting: k => (k === 'asset_show_name' ? 1 : 0), baseCurrency: () => 'EUR' } }); const { originSummaryLines, originLines, originsHtml } = await import('../../client/ui/price-origin.js'); const asset = (id, symbol, name, kind = 'crypto') => ({ id, symbol, name, kind, decimals: 8, unit: symbol, subunit: null, displayUnit: 'unit' }); const BTC = asset(1, 'BTC', 'Bitcoin'); const ETH = asset(2, 'ETH', 'Ether'); const GOUD = { ...asset(3, 'XAU', 'Goud', 'metal'), unit: 'ozt', subunit: 'g' }; const EUR = { ...asset(4, 'EUR', 'Euro', 'fiat'), unit: 'EUR' }; const o = (kind, extra = {}) => ({ day: '2025-01-01', fiatPrice:100, kind, ageDays: 0, deviation: null, source: 'Bron', sourceDay: '2025-01-01', moment: null, ...extra }); describe('originSummaryLines', () => { it('telt per soort en noemt de zwakste, en die bepaalt de nauwkeurigheid', () => { const r = originSummaryLines([ { origin: o('close'), asset: BTC }, { origin: o('spot'), asset: ETH }, { origin: o('carried', { sourceDay: '2024-12-29', ageDays: 3 }), asset: GOUD }, ]); assert.equal(r[0], 'Rust op 3 koersen'); assert.equal(r[1], '1 slotkoers, 1 afgeleid, 1 doorgetrokken'); assert.match(r[2], /^Zwakste: Goud, doorgetrokken van 29 dec\.? 2024 \(Bron\), 3 dagen oud$/); assert.equal(r.at(-1), 'Nauwkeurigheid: laag'); }); it('noemt geen zwakste als alles sterk is', () => { const r = originSummaryLines([{ origin: o('close'), asset: BTC }, { origin: o('live'), asset: ETH }]); assert.deepEqual(r, ['Rust op 2 koersen', '1 slotkoers, 1 vandaag', 'Nauwkeurigheid: hoog']); }); it('kiest van twee doorgetrokken koersen de oudste als zwakste', () => { const r = originSummaryLines([ { origin: o('carried', { ageDays: 2 }), asset: BTC }, { origin: o('carried', { ageDays: 9 }), asset: ETH }, ]); assert.match(r[2], /^Zwakste: Ether, /); assert.equal(r[1], '2 doorgetrokken'); }); it('telt hetzelfde asset op twee rekeningen als één koers, en geeft dan de gewone herkomst', () => { const r = originSummaryLines([{ origin: o('close'), asset: BTC }, { origin: o('close'), asset: BTC }]); assert.deepEqual(r, originLines(o('close'), BTC)); }); it('laat de euro weg en geeft niets als er niets is', () => { assert.equal(originSummaryLines([{ origin: o('close'), asset: EUR }]).length, 0); assert.equal(originsHtml([]), ''); }); it('noemt een post zonder koers naast één met, en zegt bij welke asset de koers hoort', () => { const r = originSummaryLines([{ origin: o('close'), asset: GOUD }, { origin: null, asset: ETH }]); assert.match(r[0], /^Goud: Koers /); assert.equal(r[1], 'Slotkoers van Bron'); assert.equal(r.at(-2), 'Geen koers voor Ether: telt als nul mee'); assert.equal(r.at(-1), 'Nauwkeurigheid: onvolledig'); assert.ok(!r.includes('Nauwkeurigheid: hoog'), 'geen tweede, tegenstrijdige nauwkeurigheid'); }); it('noemt een ontbrekende post ook naast meerdere koersen, en ook als er geen enkele koers is', () => { const r = originSummaryLines([{ origin: o('close'), asset: BTC }, { origin: o('close'), asset: GOUD }, { origin: { ...o('close'), fiatPrice:null }, asset: ETH }, { origin: null, asset: ETH }]); assert.deepEqual(r, ['Rust op 2 koersen', '2 slotkoersen', 'Geen koers voor Ether: telt als nul mee', 'Nauwkeurigheid: onvolledig']); assert.deepEqual(originSummaryLines([{ origin: null, asset: ETH }]), ['Geen koers voor Ether: telt als nul mee', 'Nauwkeurigheid: onvolledig']); }); it('maakt de i een waarschuwing als er een koers ontbreekt, en alleen dan', () => { assert.match(originsHtml([{ origin: o('close'), asset: GOUD }, { origin: null, asset: ETH }]), /class="po-btn is-warn"/); assert.match(originsHtml([{ origin: o('close'), asset: GOUD }]), /class="po-btn"/); }); });