unrip/test/operator-dashboard-app-static.test.mjs
philipp cb87910c95
All checks were successful
deploy / deploy (push) Successful in 57s
Implement quote lifecycle investigator
Proof: Adds durable quote lifecycle lookup by quote_id, decision_id, or command_id through the authenticated dashboard API, pins selected Quote lifecycle evidence outside the rolling table, and covers the Awaiting executor follow-up regression with targeted tests.

Assumptions: Existing swap demand, trade decision, execute command, executor result, and quote outcome history rows are sufficient to reconstruct the selected quote lifecycle; this turn stays read-side and does not alter strategy, pricing, limits, arming, signer identity, pair enablement, relay, or executor behavior.

Still fake: Venue-native final fill truth, fee-aware realized PnL, already-pruned historical detail, and the broader quote analytics workbench remain incomplete.
2026-06-12 19:28:38 +02:00

59 lines
3 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
const source = readFileSync(new URL('../src/apps/operator-dashboard.mjs', import.meta.url), 'utf8');
test('operator dashboard awaits API handler promises so request errors reach the top-level catch', () => {
assert.equal(source.includes('return await handleApiRequest({ req, res, url, auth });'), true);
assert.equal(source.includes('return handleApiRequest({ req, res, url, auth });'), false);
});
test('operator dashboard control proxy catches upstream failures before sending JSON response', () => {
assert.match(source, /dashboard_control_failed/);
assert.match(source, /buildDashboardControlErrorResponse/);
assert.match(source, /failure.statusCode/);
});
test('operator dashboard requests enough asset catalog rows for the current 1Click import', () => {
assert.match(source, /loadAssetCatalogSummary\(pool,\s*\{\s*limit:\s*250\s*\}\)/);
assert.doesNotMatch(source, /loadAssetCatalogSummary\(pool,\s*\{\s*limit:\s*80\s*\}\)/);
});
test('operator dashboard exposes DB-backed pair activation and pause controls', () => {
assert.match(source, /setTradingPairMode/);
assert.match(source, /pauseTradingPair/);
assert.match(source, /control\.action === 'set-pair-mode'/);
assert.match(source, /control\.action === 'pause-pair'/);
assert.match(source, /edgeBps: body\.edge_bps/);
assert.match(source, /maxNotional: body\.max_notional/);
assert.match(source, /minNotional: bodyField\(body, 'min_notional', 'minNotional'\)/);
assert.match(source, /requestMaxNotional: bodyField\(body, 'request_max_notional', 'requestMaxNotional'\)/);
assert.match(source, /requestMaxSlippageBps: bodyField\(body, 'request_max_slippage_bps', 'requestMaxSlippageBps'\)/);
});
test('operator dashboard API auth failures are JSON for frontend fetches', () => {
assert.match(source, /req\.url \|\| ''\)\.startsWith\('\/api\/'\)/);
assert.match(source, /sendJson\(res, 401, \{ error: 'authentication_required' \}\)/);
});
test('operator dashboard exposes authenticated durable quote lifecycle lookup API', () => {
assert.match(source, /quote-lifecycle/);
assert.match(source, /lifecycleLookupMatch/);
assert.match(source, /loadQuoteLifecycleLookupEvidence/);
assert.match(source, /buildQuoteLifecycleLookupResponse/);
assert.match(source, /quote_lifecycle_identifier_required/);
assert.match(source, /quote_lifecycle_not_found/);
assert.match(source, /payload\.ok \? 200 : 404/);
});
test('operator dashboard bootstrap does not synchronously refresh intent request outcomes', () => {
assert.match(source, /loadRecentIntentRequests\(pool, \{[\s\S]*refreshOutcomes: false/);
});
test('operator dashboard disconnects backpressured websocket clients before buffering unbounded updates', () => {
assert.match(source, /isDashboardWebSocketBackpressured/);
assert.match(source, /dashboard_websocket_backpressure_disconnect/);
assert.match(source, /buffered_amount: Number\(socket\.bufferedAmount \|\| 0\)/);
assert.match(source, /socket\.terminate\?\.\(\)/);
});