// Generated, do not edit. sha256:e3f07d60b1d7716de10f35f932ae6f2f2e3db5a07433459721f39ceee41a1a6d import { describe, it, beforeEach, mock } from 'node:test'; import assert from 'node:assert/strict'; import { createDbHarness } from '../helpers/db-node.mjs'; const harness = createDbHarness(); mock.module('../../server/db.js', { namedExports: harness.exports }); for (const mod of ['providers', 'price-source', 'price-history', 'api-metrics']) { mock.module(`../../client/data/${mod}.js`, { namedExports: await import(`../../server/data/${mod}.js`) }); } const facade = await import('../../client/price/providers.js'); const gisteren = new Date(Date.now() - 86400000).toISOString().slice(0, 10); const tijd = dag => Math.floor(Date.parse(`${dag}T00:00:00Z`) / 1000); let fetchCalls = 0; let faalt = false; globalThis.fetch = async () => { fetchCalls++; if (faalt) throw new Error('geen netwerk in deze test'); return { ok: true, status: 200, json: async () => [{ time: tijd(gisteren), price: 0.87 }] }; }; const { run, lastId, one } = harness.exports; let usd; beforeEach(() => { harness.recreate(); facade.forgetSeriesFetches(); fetchCalls = 0; faalt = false; run(`INSERT INTO Asset (symbol, name, searchName, kind, unit, subunit, decimals, displayUnit) VALUES ('USD','Dollar','dollar','fiat','USD','cent',2,'unit')`); usd = lastId(); run(`INSERT INTO Provider (key, name, searchName, baseUrl, authenticationKind, authenticationRequired, isActive, isSeed, isSystem, createdAt) VALUES ('ecb','ECB','ecb','https://voorbeeld.test','none',0,1,1,0,'2026-09-01T10:00:00.000Z')`); const p = lastId(); run(`INSERT INTO ProviderCoverage (providerId, symbol) VALUES (?, 'USD')`, [p]); run(`INSERT INTO ProviderEndpoint (providerId, capability, method, pathTemplate) VALUES (?, 'daily_history', 'GET', '/reeks')`, [p]); run(`INSERT INTO PriceSource (assetId, capability, providerId, rank, status) VALUES (?, 'history', ?, 1, 'confirmed')`, [usd, p]); }); const asset = () => one(`SELECT * FROM Asset WHERE id = ?`, [usd]); describe('een reeks die vandaag niet haalt', () => { it('gaat op één dag maar één keer naar buiten', async () => { await facade.ensurePriceHistoryFor(asset()); await facade.ensurePriceHistoryFor(asset()); await facade.ensurePriceHistoryFor(asset()); assert.equal(fetchCalls, 1); assert.equal(one(`SELECT fiatPrice FROM PriceHistory WHERE assetId = ?`, [usd]).fiatPrice, 0.87, 'en de reeks staat er'); }); it('probeert het na een MISLUKTE poging gewoon opnieuw', async () => { faalt = true; await assert.rejects(() => facade.ensurePriceHistoryFor(asset())); faalt = false; await facade.ensurePriceHistoryFor(asset()); assert.equal(fetchCalls, 2); }); it('haalt na een bronwijziging wel opnieuw op', async () => { await facade.ensurePriceHistoryFor(asset()); facade.forgetSeriesFetches(); await facade.ensurePriceHistoryFor(asset()); assert.equal(fetchCalls, 2); }); });