73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
'use strict';
|
|
|
|
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const { createScanSession } = require('../src/scan-session');
|
|
|
|
const camera = {
|
|
alta_key: 'ABH7-C62U-GC3E',
|
|
hostname: 'avacam-abh7-c62u-gc3e.local',
|
|
web_ui_url: 'https://avacam-abh7-c62u-gc3e.local',
|
|
ip_address: '10.0.0.223',
|
|
port: 443,
|
|
service: '_vaioncam._tcp.local',
|
|
};
|
|
|
|
test('shares one scan, publishes defensive state, and binds camera URLs', async () => {
|
|
let scanCalls = 0;
|
|
let releaseScan;
|
|
const scan = () => {
|
|
scanCalls += 1;
|
|
return new Promise((resolve) => { releaseScan = resolve; });
|
|
};
|
|
const times = [1000, 2345];
|
|
const session = createScanSession({ scan, now: () => times.shift() });
|
|
|
|
const first = session.scanOnce();
|
|
const second = session.scanOnce();
|
|
assert.strictEqual(first, second);
|
|
assert.equal(scanCalls, 1);
|
|
assert.equal(session.allowedCameraUrl(camera.web_ui_url), null);
|
|
assert.deepEqual(session.getLatestCameras(), []);
|
|
|
|
releaseScan([camera]);
|
|
assert.deepEqual(await first, {
|
|
ok: true,
|
|
count: 1,
|
|
duration_seconds: 1.3,
|
|
cameras: [camera],
|
|
});
|
|
assert.equal(session.allowedCameraUrl(camera.web_ui_url), camera.web_ui_url);
|
|
assert.equal(session.allowedCameraUrl(`${camera.web_ui_url}/?secret=value`), null);
|
|
assert.equal(session.allowedCameraUrl('https://avacam-ahg2-z4nd-fvrn.local'), null);
|
|
|
|
const exposed = session.getLatestCameras();
|
|
exposed[0].alta_key = 'MUTATED';
|
|
assert.equal(session.getLatestCameras()[0].alta_key, camera.alta_key);
|
|
});
|
|
|
|
test('revokes prior state at rescan and permits retry after failure', async () => {
|
|
let call = 0;
|
|
let releaseSecondScan;
|
|
const scan = () => {
|
|
call += 1;
|
|
if (call === 1) return Promise.resolve([camera]);
|
|
if (call === 2) return new Promise((_resolve, reject) => { releaseSecondScan = reject; });
|
|
return Promise.resolve([camera]);
|
|
};
|
|
const session = createScanSession({ scan, now: () => 0 });
|
|
|
|
await session.scanOnce();
|
|
assert.equal(session.allowedCameraUrl(camera.web_ui_url), camera.web_ui_url);
|
|
|
|
const failed = session.scanOnce();
|
|
assert.equal(session.allowedCameraUrl(camera.web_ui_url), null);
|
|
assert.deepEqual(session.getLatestCameras(), []);
|
|
releaseSecondScan(new Error('network failed'));
|
|
await assert.rejects(failed, /network failed/);
|
|
|
|
const retried = await session.scanOnce();
|
|
assert.equal(call, 3);
|
|
assert.equal(retried.count, 1);
|
|
});
|