86 lines
3.9 KiB
JavaScript
86 lines
3.9 KiB
JavaScript
// Generated, do not edit. sha256:19a3bb75110abcec8d0ce1494adf6296cb48fd73fb9943873caae31596ad520e
|
|||
|
|
import { describe, it, before, beforeEach, mock } from 'node:test';
|
||
|
|
import assert from 'node:assert/strict';
|
||
|
|
|
||
|
|
import { mkdtemp } from 'node:fs/promises';
|
||
|
|
import { tmpdir } from 'node:os';
|
||
|
|
import { join } from 'node:path';
|
||
|
|
|
||
|
|
import { createDbHarness } from '../helpers/db-node.mjs';
|
||
|
|
|
||
|
|
process.env.ASSETAPP_DATA_DIR = await mkdtemp(join(tmpdir(), 'assetapp-dienstdiagnose-'));
|
||
|
|
|
||
|
|
const harness = createDbHarness({ seedPreferences: true });
|
||
|
|
mock.module('../../server/db.js', { namedExports: harness.exports });
|
||
|
|
|
||
|
|
let DEKKING = { status: 'off' };
|
||
|
|
mock.module('../../server/data/market.js', { namedExports: { serviceCoverage: async () => DEKKING } });
|
||
|
|
|
||
|
|
const { READ_TOOLS } = await import('../../server/mcp/read-tools.mjs');
|
||
|
|
const { PRICE_TOOLS } = await import('../../server/mcp/price-tool.mjs');
|
||
|
|
const { _resetVertalers } = await import('../../server/mcp/session.mjs');
|
||
|
|
const { setPref } = await import('../../server/data/preferences.js');
|
||
|
|
|
||
|
|
const gezondheid = READ_TOOLS.find(t => t.name === 'integration_health');
|
||
|
|
const koersen = PRICE_TOOLS.find(t => t.name === 'price_data');
|
||
|
|
const ctx = { session: { id: 'dienst' } };
|
||
|
|
const { run, lastId } = harness.exports;
|
||
|
|
let btc;
|
||
|
|
|
||
|
|
before(() => {
|
||
|
|
harness.recreate();
|
||
|
|
run(`INSERT INTO Asset (symbol, name, searchName, kind, unit, subunit, decimals, displayUnit)
|
||
|
|
VALUES ('BTC','Bitcoin','bitcoin','crypto','BTC','sat',8,'unit')`);
|
||
|
|
btc = lastId();
|
||
|
|
run(`INSERT INTO Provider (key, name, searchName, baseUrl, authenticationKind, authenticationRequired,
|
||
|
|
isActive, isSeed, isSystem, createdAt)
|
||
|
|
VALUES ('bitvavo','Bitvavo','bitvavo','https://x','none',0,0,1,0,'2026-10-16T00:00:00Z')`);
|
||
|
|
const p = lastId();
|
||
|
|
run(`INSERT INTO ProviderCoverage (providerId, symbol) VALUES (?, 'BTC')`, [p]);
|
||
|
|
run(`INSERT INTO ProviderEndpoint (providerId, capability, method, pathTemplate) VALUES (?, 'daily_history', 'GET', '/c')`, [p]);
|
||
|
|
});
|
||
|
|
|
||
|
|
beforeEach(async () => {
|
||
|
|
_resetVertalers();
|
||
|
|
DEKKING = { status: 'off' };
|
||
|
|
await setPref('app', 'market_spot', 'off');
|
||
|
|
});
|
||
|
|
|
||
|
|
const bronkeuzeRegel = text => text.split('\n').find(r => r.startsWith('- BTC (crypto):')) || '';
|
||
|
|
|
||
|
|
describe('integration_health: de bronkeuze met de dienst', () => {
|
||
|
|
it('met de stand aan en BTC gedekt: geen melding, wel dat de dienst de historie levert', async () => {
|
||
|
|
await setPref('app', 'market_spot', 'first');
|
||
|
|
DEKKING = { status: 'ok', assetIds: [btc] };
|
||
|
|
const r = bronkeuzeRegel((await gezondheid.run({}, ctx)).text);
|
||
|
|
assert.doesNotMatch(r, /staan uit/);
|
||
|
|
assert.match(r, /historie uit Atreides Services/);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('met de stand uit, of zonder dekking, blijft de melding', async () => {
|
||
|
|
DEKKING = { status: 'ok', assetIds: [btc] };
|
||
|
|
assert.match(bronkeuzeRegel((await gezondheid.run({}, ctx)).text), /de dekkende bronnen staan uit \(Bitvavo\)/, 'stand uit');
|
||
|
|
await setPref('app', 'market_spot', 'first');
|
||
|
|
DEKKING = { status: 'ok', assetIds: [] };
|
||
|
|
const r = bronkeuzeRegel((await gezondheid.run({}, ctx)).text);
|
||
|
|
assert.match(r, /staan uit/, 'niet gedekt');
|
||
|
|
assert.doesNotMatch(r, /Atreides Services/);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('price_data sources: de diagnose met de dienst', () => {
|
||
|
|
it('met de stand aan en BTC gedekt: in orde, en de dienst genoemd', async () => {
|
||
|
|
await setPref('app', 'market_spot', 'fallback');
|
||
|
|
DEKKING = { status: 'ok', assetIds: [btc] };
|
||
|
|
const uit = (await koersen.run({ asset: 'BTC', view: 'sources' }, ctx)).text;
|
||
|
|
assert.match(uit, /Diagnose van de bronkeuze:\n- in orde/);
|
||
|
|
assert.match(uit, /historie uit Atreides Services/);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('met een onbereikbare dienst blijft de melding', async () => {
|
||
|
|
await setPref('app', 'market_spot', 'first');
|
||
|
|
DEKKING = { status: 'unavailable' };
|
||
|
|
const uit = (await koersen.run({ asset: 'BTC', view: 'sources' }, ctx)).text;
|
||
|
|
assert.match(uit, /- allInactive \(Bitvavo\)/);
|
||
|
|
});
|
||
|
|
});
|