feat: publish Alta Local Camera Discovery
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
'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);
|
||||
});
|
||||
Reference in New Issue
Block a user