import test from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; const strategySource = readFileSync(new URL('../src/operator-dashboard/static/pages/StrategyPage.jsx', import.meta.url), 'utf8'); const fundsSource = readFileSync(new URL('../src/operator-dashboard/static/pages/FundsPage.jsx', import.meta.url), 'utf8'); const stylesSource = readFileSync(new URL('../src/operator-dashboard/static/styles.css', import.meta.url), 'utf8'); const serviceCardSource = readFileSync(new URL('../src/operator-dashboard/static/components/ServiceCard.jsx', import.meta.url), 'utf8'); test('strategy page owns consolidated quote lifecycle and successful trade tables', () => { assert.match(strategySource, /Quote lifecycle/); assert.match(strategySource, /Incoming quotes and what happened next/); assert.match(strategySource, /Responded\?/); assert.match(strategySource, /Successful trades only/); assert.match(strategySource, /Gross edge est\./); assert.match(strategySource, /successful_trade_gross_edge_estimate_eure/); assert.match(strategySource, /before fees/); assert.match(strategySource, /Show lifecycle/); assert.match(strategySource, /formatAgeFromTimestamp/); assert.match(strategySource, /quote-row-flash/); assert.match(strategySource, /Submitted means the relay accepted the response; it does not prove a trade\./); assert.doesNotMatch(strategySource, /Actionable|actionable/); }); test('funds page no longer renders duplicate quote and submission tables', () => { assert.doesNotMatch(fundsSource, /Recent incoming quotes/); assert.doesNotMatch(fundsSource, /Recent submitted quote terms/); assert.doesNotMatch(fundsSource, /Submitted quote responses/); assert.doesNotMatch(fundsSource, /Durable ledger/); }); test('dashboard freshness surfaces show age and exact timestamp evidence', () => { assert.match(serviceCardSource, /formatTimestamp\(service\.freshness_at\)/); assert.match(serviceCardSource, /Freshness at/); assert.match(stylesSource, /\.quote-row-flash td/); assert.match(stylesSource, /@keyframes quote-row-flash-cell/); }); test('mobile status bar uses normal document flow instead of sticky viewport positioning', () => { assert.match( stylesSource, /@media \(max-width: 720px\)[\s\S]*?\.status-bar \{[\s\S]*?position: static;[\s\S]*?top: auto;[\s\S]*?z-index: auto;[\s\S]*?\}/, ); });