Files
AtreidesAssetsFree/tests/server/mcp-dienst-diagnose.test.mjs
T

86 lines
3.9 KiB
JavaScript
Raw Normal View History

2026-10-29 11:57:29 +01:00
// 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\)/);
});
});