Files
AtreidesAssetsFree/tests/ui/herkomst.test.mjs
T

100 lines
5.2 KiB
JavaScript
Raw Permalink Normal View History

2026-10-29 11:57:29 +01:00
// 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: '"><img src=x>' }, BTC);
assert.doesNotMatch(html, /<img/);
assert.match(html, /data-origin-lines="\[/);
assert.match(html, /title=""/, 'onderdrukt de title van de cel eromheen');
});
});