100 lines
5.2 KiB
JavaScript
100 lines
5.2 KiB
JavaScript
// 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');
|
||
|
|
});
|
||
|
|
});
|