import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import test from 'node:test'; const source = (file) => readFileSync(new URL(`../../src/web/${file}`, import.meta.url), 'utf8'); const app = source('App.tsx'); const overview = source('components/ClientOverviewPage.tsx'); const subscription = source('features/subscription/SubscriptionFeature.tsx'); const devices = source('features/devices/DevicesPanel.tsx'); const deviceFeature = source('features/devices/DevicesFeature.tsx'); const servers = source('features/servers/ServerPicker.tsx'); const routing = source('features/routing/RoutingFeature.tsx'); const diagnostics = source('features/diagnostics/ConnectivityDiagnosticsPanel.tsx'); test('App owns one stable mapping from typed transport to component actions', () => { assert.match(app, /const componentActions = \{[\s\S]*listDevices: api\.devices\.list[\s\S]*refreshDevices: api\.devices\.refresh[\s\S]*resetDeviceTraffic: api\.devices\.resetTraffic[\s\S]*updateDevice: api\.devices\.update[\s\S]*setDevicePolicy: api\.devices\.setPolicy[\s\S]*pingServers: api\.servers\.ping[\s\S]*runConnectivityDiagnostics: api\.diagnostics\.connectivity[\s\S]*\};/); assert.doesNotMatch(app, /validateSubscription: api\.subscription\.validate/); assert.equal((app.match(/actions=\{componentActions\}/g) || []).length, 1); assert.doesNotMatch(app, /componentActions\s*=\s*useMemo|componentActions\s*=\s*\([^)]*\)\s*=>/); }); test('presentational components use only injected narrow actions', () => { const components = [overview, subscription, devices, servers, routing, diagnostics].join('\n'); assert.doesNotMatch(components, /from ['"][^'"]*\/api\/harborClient\.js['"]|\bapi\./); assert.match(subscription, /isSubscriptionUrlValid\(normalizedUrl\)/); assert.doesNotMatch(subscription, /validateSubscription\(|AbortController/); assert.match(overview, /refreshDevices: actions\.refreshDevices/); assert.match(overview, /resetDeviceTraffic: actions\.resetDeviceTraffic/); assert.match(deviceFeature, /discover \? refreshDevices\(\) : listDevices\(\)/); assert.match(overview, //); assert.match(overview, /