fix: Substream only cameras should not be triggerable (#1848)

- Closes #1846
This commit is contained in:
Dermot Duffy
2025-01-21 07:17:09 -08:00
committed by GitHub
parent 596a724714
commit 0212840688
13 changed files with 100 additions and 9 deletions
+33 -1
View File
@@ -81,6 +81,9 @@ describe('Camera', () => {
},
}),
new GenericCameraManagerEngine(mock<StateWatcherSubscriptionInterface>()),
{
capabilities: createCapabilities({ trigger: true }),
},
);
const stateWatcher = mock<StateWatcherSubscriptionInterface>();
@@ -117,7 +120,10 @@ describe('Camera', () => {
},
}),
new GenericCameraManagerEngine(mock<StateWatcherSubscriptionInterface>()),
{ eventCallback: eventCallback },
{
capabilities: createCapabilities({ trigger: true }),
eventCallback: eventCallback,
},
);
const stateWatcher = mock<StateWatcherSubscriptionInterface>();
@@ -125,6 +131,8 @@ describe('Camera', () => {
stateWatcher: stateWatcher,
});
expect(stateWatcher.subscribe).toBeCalled();
const diff = {
entityID: 'sensor.force_update',
oldState: createStateEntity({ state: stateFrom }),
@@ -138,6 +146,30 @@ describe('Camera', () => {
});
},
);
it('should not trigger without trigger capability', async () => {
const eventCallback = vi.fn();
const camera = new Camera(
createCameraConfig({
id: 'camera_1',
triggers: {
entities: ['binary_sensor.foo'],
},
}),
new GenericCameraManagerEngine(mock<StateWatcherSubscriptionInterface>()),
{
capabilities: createCapabilities({ trigger: false }),
eventCallback: eventCallback,
},
);
const stateWatcher = mock<StateWatcherSubscriptionInterface>();
await camera.initialize({
stateWatcher: stateWatcher,
});
expect(stateWatcher.subscribe).not.toBeCalled();
});
});
describe('should get proxy config', () => {
@@ -162,6 +162,7 @@ describe('FrigateCamera', () => {
expect(camera.getCapabilities()?.has('live')).toBeTruthy();
expect(camera.getCapabilities()?.has('snapshots')).toBeTruthy();
expect(camera.getCapabilities()?.has('recordings')).toBeTruthy();
expect(camera.getCapabilities()?.has('trigger')).toBeTruthy();
expect(vi.mocked(getPTZInfo)).toBeCalled();
});
@@ -188,6 +189,7 @@ describe('FrigateCamera', () => {
expect(camera.getCapabilities()?.has('live')).toBeTruthy();
expect(camera.getCapabilities()?.has('snapshots')).toBeFalsy();
expect(camera.getCapabilities()?.has('recordings')).toBeFalsy();
expect(camera.getCapabilities()?.has('trigger')).toBeTruthy();
expect(vi.mocked(getPTZInfo)).not.toBeCalled();
});
@@ -344,6 +346,31 @@ describe('FrigateCamera', () => {
expect(eventWatcher.subscribe).not.toBeCalled();
});
it('should not subscribe without trigger capability', async () => {
const camera = new FrigateCamera(
createCameraConfig({
frigate: {
client_id: 'CLIENT_ID',
camera_name: 'CAMERA',
},
capabilities: {
disable: ['trigger'],
},
}),
mock<CameraManagerEngine>(),
);
const hass = createHASS();
const eventWatcher = mock<FrigateEventWatcher>();
await camera.initialize({
hass: hass,
entityRegistryManager: mock<EntityRegistryManager>(),
stateWatcher: mock<StateWatcher>(),
frigateEventWatcher: eventWatcher,
});
expect(eventWatcher.subscribe).not.toBeCalled();
});
it('should not subscribe with no camera name', async () => {
const camera = new FrigateCamera(
createCameraConfig({
@@ -37,6 +37,7 @@ describe('GenericCameraManagerEngine', () => {
expect(camera.getCapabilities()?.has('clips')).toBeFalsy();
expect(camera.getCapabilities()?.has('recordings')).toBeFalsy();
expect(camera.getCapabilities()?.has('snapshots')).toBeFalsy();
expect(camera.getCapabilities()?.has('trigger')).toBeTruthy();
});
it('should generate default event query', () => {
@@ -248,6 +248,7 @@ describe('ReolinkCameraManagerEngine', () => {
seek: false,
snapshots: false,
substream: true,
trigger: true,
});
});