39 lines
2.9 KiB
JavaScript
39 lines
2.9 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\(customServices, target\)/);
|
|
});
|