Files
AtreidesAssetsFree/tests/repo/price-export.test.mjs
T

90 lines
4.6 KiB
JavaScript
Raw Normal View History

2026-10-29 11:57:29 +01:00
// Generated, do not edit. sha256:0be72af65d499e9d6366a58d1015da19ddfe0424554e9524fa644fdd737582f5
import { describe, it, beforeEach, mock } from 'node:test';
import assert from 'node:assert/strict';
import { createDbHarness } from '../helpers/db-node.mjs';
const harness = createDbHarness({ seedPreferences: true });
mock.module('../../server/db.js', { namedExports: harness.exports });
const { priceSeriesExport } = await import('../../server/data/price-history.js');
const { priceHistoryCsv, CSV_COLUMNS } = await import('../../server/price-export.mjs');
const { run, lastId } = harness.exports;
let btc, goud, eur;
function provider(key, { system = false, dekt = [] } = {}) {
run(`INSERT INTO Provider (key, name, searchName, baseUrl, authenticationKind, authenticationRequired, isActive, isSeed, isSystem, createdAt)
VALUES (?, ?, ?, '', 'none', 0, 1, 1, ?, '2026-10-09')`, [key, key, key, system ? 1 : 0]);
const id = lastId();
for (const s of dekt) run(`INSERT INTO ProviderCoverage (providerId, symbol) VALUES (?, ?)`, [id, s]);
return id;
}
function asset(symbol, kind) {
run(`INSERT INTO Asset (symbol, name, searchName, kind, unit, subunit, decimals, displayUnit)
VALUES (?, ?, ?, ?, ?, NULL, 8, 'unit')`, [symbol, symbol, symbol.toLowerCase(), kind, symbol]);
return lastId();
}
const koers = (assetId, providerId, prijs, observedAt, resolution = 'day', createdAt = null) =>
run(`INSERT INTO PriceHistory (assetId, providerId, fiatPrice, resolution, observedAt, createdAt) VALUES (?, ?, ?, ?, ?, ?)`,
[assetId, providerId, prijs, resolution, observedAt, createdAt]);
beforeEach(() => {
harness.recreate();
btc = asset('BTC', 'crypto');
goud = asset('XAU', 'metal');
eur = asset('EUR', 'fiat');
const bitvavo = provider('bitvavo', { dekt: ['BTC'] });
const goldapi = provider('goldapi', { dekt: ['XAU'] });
const manual = provider('manual', { system: true });
const dienst = provider('atreides_services', { system: true });
const vast = provider('fixed', { system: true, dekt: ['EUR'] });
koers(btc, bitvavo, 61000, '2026-10-02T00:00:00Z', 'day', '2026-10-03T01:00:00Z');
koers(btc, bitvavo, 60000, '2026-10-01T00:00:00Z');
koers(btc, bitvavo, 61500, '2026-10-02T14:32:00Z', 'timestamp');
koers(goud, goldapi, 105.5, '2026-10-01T00:00:00Z');
koers(btc, manual, 50000, '2026-09-30T00:00:00Z');
koers(btc, dienst, 61234.5, '2026-10-09T10:00:00Z', 'timestamp');
koers(eur, vast, 1, '2026-10-01T00:00:00Z');
koers(goud, bitvavo, 999, '2026-10-01T00:00:00Z');
});
describe('priceSeriesExport: wat meegaat', () => {
it('alleen de koersreeksen van echte bronnen, in een vaste volgorde', () => {
const rijen = priceSeriesExport().map(r => `${r.symbol}|${r.source}|${r.resolution}|${r.observedAt}`);
assert.deepEqual(rijen, [
'BTC|bitvavo|day|2026-10-01T00:00:00Z',
'BTC|bitvavo|day|2026-10-02T00:00:00Z',
'BTC|bitvavo|timestamp|2026-10-02T14:32:00Z',
'XAU|goldapi|day|2026-10-01T00:00:00Z',
]);
});
});
describe('priceHistoryCsv: het bestand', () => {
it('kolommen zoals de CSV van de dienst, met eenheid en resolutie erbij', () => {
const regels = priceHistoryCsv(priceSeriesExport(), 'EUR').trim().split('\n');
assert.equal(regels[0], CSV_COLUMNS.join(','));
assert.equal(regels[0], 'instrument,source,quote,unit,resolution,observed_at_utc,fetched_at_utc,price');
assert.equal(regels[2], 'crypto:BTC,bitvavo,EUR,,day,2026-10-02T00:00:00.000Z,2026-10-03T01:00:00.000Z,61000');
assert.equal(regels[4], 'metal:XAU,goldapi,EUR,g,day,2026-10-01T00:00:00.000Z,,105.5');
});
it('is herhaalbaar: twee keer exporteren geeft hetzelfde bestand', () => {
assert.equal(priceHistoryCsv(priceSeriesExport(), 'EUR'), priceHistoryCsv(priceSeriesExport(), 'EUR'));
});
it('noemt de rekenvaluta van de portefeuille, want daarin staat de historie', () => {
assert.match(priceHistoryCsv(priceSeriesExport(), 'USD').split('\n')[1], /^crypto:BTC,bitvavo,USD,/);
});
it('slaat een rij zonder bruikbare tijd of prijs over, en zet een lastige waarde tussen aanhalingstekens', () => {
const csv = priceHistoryCsv([
{ kind: 'crypto', symbol: 'BTC', source: 'a,b', resolution: 'day', observedAt: '2026-10-01', createdAt: null, fiatPrice: 1 },
{ kind: 'crypto', symbol: 'BTC', source: 'x', resolution: 'day', observedAt: 'geen datum', createdAt: null, fiatPrice: 1 },
{ kind: 'crypto', symbol: 'BTC', source: 'x', resolution: 'day', observedAt: '2026-10-01', createdAt: null, fiatPrice: 0 },
], 'EUR').trim().split('\n');
assert.equal(csv.length, 2);
assert.equal(csv[1], 'crypto:BTC,"a,b",EUR,,day,2026-10-01T00:00:00.000Z,,1');
});
});