Files
harbor-net/test/web/component-actions-contract.test.js
dokril 416b2b294a
Build and Deploy Gateway / build-and-push (push) Successful in 21s
Build and Deploy Gateway / deploy (push) Successful in 14s
Persist configurable connectivity diagnostics
2026-08-19 13:38:19 +03:00

40 lines
3.0 KiB
JavaScript

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, /<ServerPicker[\s\S]*pingServers=\{actions\.pingServers\}/);
assert.match(overview, /useDevicesFeature\(\{[\s\S]*listDevices: actions\.listDevices[\s\S]*refreshDevices: actions\.refreshDevices[\s\S]*updateDevice: actions\.updateDevice[\s\S]*setDevicePolicy: actions\.setDevicePolicy/);
assert.match(overview, /<DevicesPanel feature=\{devicesFeature\} \/>/);
assert.match(overview, /<ConnectivityDiagnosticsPanel[\s\S]*runConnectivityDiagnostics=\{actions\.runConnectivityDiagnostics\}/);
assert.match(deviceFeature, /requestDeviceUpdate\(device\.id, patch, snapshot\.revision\)/);
assert.match(deviceFeature, /setDevicePolicy\(device\.id, mode, snapshot\.revision\)/);
assert.match(servers, /await pingServers\(profileId, ids\)/);
assert.match(diagnostics, /await runConnectivityDiagnostics\(target\)/);
assert.match(overview, /settings=\{state\.diagnostics\}[\s\S]*updateSettings=\{onUpdateDiagnosticsSettings\}/);
});