import assert from 'node:assert/strict'; import test from 'node:test'; import { createDataplaneClient } from '../../src/server/dataplaneClient.js'; test('control uses the dataplane socket protocol', async () => { const requests = []; const send = async (socketPath, pathname, method, body, timeoutMs) => { requests.push({ method, pathname, socketPath, body, timeoutMs }); return { running: pathname !== '/stop', startedAt: 'now', gatewayBackendVersion: '0.1.0', singBoxVersion: '1.12.13', }; }; const client = createDataplaneClient('/run/dataplane.sock', send); const status = await client.refresh(); assert.equal(status.running, true); assert.equal(status.gatewayBackendVersion, '0.1.0'); assert.equal(status.singBoxVersion, '1.12.13'); await client.apply(); const devices = await client.observeDevices(); assert.equal(devices.running, true); const traffic = await client.observeTraffic(); assert.equal(traffic.running, true); const domainTraffic = await client.observeDomainTraffic(); assert.equal(domainTraffic.running, true); await client.observeDevicePolicy(); await client.applyDevicePolicies([{ id: 'dev_0011223344556677' }]); await client.runConnectivityDiagnostics( [{ id: 'custom-test', url: 'https://example.com' }], 'site:custom-test', ); assert.equal(client.running, true); await client.restart(); assert.equal((await client.stop()).running, false); assert.deepEqual(requests.map(({ method, pathname, socketPath }) => `${method} ${pathname} ${socketPath}`), [ 'GET /status /run/dataplane.sock', 'POST /apply /run/dataplane.sock', 'GET /devices /run/dataplane.sock', 'GET /device-traffic /run/dataplane.sock', 'GET /domain-traffic /run/dataplane.sock', 'GET /device-policy /run/dataplane.sock', 'PUT /device-policy /run/dataplane.sock', 'POST /diagnostics/connectivity /run/dataplane.sock', 'POST /restart /run/dataplane.sock', 'POST /stop /run/dataplane.sock', ]); assert.deepEqual(requests[6].body, { devices: [{ id: 'dev_0011223344556677' }] }); assert.deepEqual(requests[7].body, { services: [{ id: 'custom-test', url: 'https://example.com' }], target: 'site:custom-test', }); assert.equal(requests[7].timeoutMs, 25_000); }); test('connectivity diagnostics expose a retryable domain error', async () => { const client = createDataplaneClient('/run/dataplane.sock', async () => { throw new Error('Dataplane не ответил'); }); await assert.rejects(client.runConnectivityDiagnostics(), { code: 'DIAGNOSTICS_FAILED', retryable: true, }); });