Improve engine identification and id generation.

This commit is contained in:
Dermot Duffy
2023-10-08 14:53:05 -07:00
parent fb5fbe4ce1
commit 7a33f75889
12 changed files with 222 additions and 142 deletions
+128 -104
View File
@@ -29,81 +29,137 @@ const createFactory = (options?: {
);
};
describe('CameraManagerEngineFactory.getEngineForCamera()', () => {
it('should get frigate engine from config', async () => {
const config = createCameraConfig({ engine: 'frigate' });
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Frigate,
);
});
it('should get motionEye engine from config', async () => {
const config = createCameraConfig({ engine: 'motioneye' });
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.MotionEye,
);
});
it('should get generic engine from config', async () => {
const config = createCameraConfig({ engine: 'generic' });
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Generic,
);
});
it('should get frigate engine from auto config', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
describe('getEngineForCamera()', () => {
describe('should get a frigate camera', () => {
it('from manually set engine', async () => {
const config = createCameraConfig({ engine: 'frigate' });
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Frigate,
);
});
entityRegistryManager.getEntity = vi
.fn()
.mockResolvedValue(
createRegistryEntity({ entity_id: 'camera.foo', platform: 'frigate' }),
it('from auto detection', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi
.fn()
.mockResolvedValue(
createRegistryEntity({ entity_id: 'camera.foo', platform: 'frigate' }),
);
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).toBe(Engine.Frigate);
});
it('from config with camera_name', async () => {
const config = createCameraConfig({
frigate: { client_id: 'bar', camera_name: 'foo' },
});
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Frigate,
);
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).toBe(Engine.Frigate);
});
it('should get motioneye engine from auto config', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi
.fn()
.mockResolvedValue(
createRegistryEntity({ entity_id: 'camera.foo', platform: 'motioneye' }),
);
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).toBe(Engine.MotionEye);
});
it('should get generic engine from auto config', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi
.fn()
.mockResolvedValue(
createRegistryEntity({ entity_id: 'camera.foo', platform: 'generic' }),
);
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).toBe(Engine.Generic);
});
it('should get frigate engine from config with camera_name', async () => {
const config = createCameraConfig({
frigate: { client_id: 'bar', camera_name: 'foo' },
});
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Frigate,
);
});
describe('should get a motionEye camera', () => {
it('from manually set engine', async () => {
const config = createCameraConfig({ engine: 'motioneye' });
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.MotionEye,
);
});
it('from auto detection', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi
.fn()
.mockResolvedValue(
createRegistryEntity({ entity_id: 'camera.foo', platform: 'motioneye' }),
);
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).toBe(Engine.MotionEye);
});
});
describe('should get a generic camera', () => {
it('from manually set engine', async () => {
const config = createCameraConfig({ engine: 'generic' });
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Generic,
);
});
it('from auto detection', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi
.fn()
.mockResolvedValue(
createRegistryEntity({ entity_id: 'camera.foo', platform: 'generic' }),
);
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).toBe(Engine.Generic);
});
it('from entity not in registry but with state', async () => {
const config = createCameraConfig({
engine: 'auto',
webrtc_card: { entity: 'camera.foo' },
});
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi.fn().mockRejectedValue(new Error());
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(
createHASS({
'camera.foo': createStateEntity(),
}),
config,
),
).toBe(Engine.Generic);
});
it('from webrtc-card url', async () => {
const config = createCameraConfig({
engine: 'auto',
webrtc_card: { url: 'camera.foo' },
});
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Generic,
);
});
it('from go2rtc url and stream', async () => {
const config = createCameraConfig({
engine: 'auto',
go2rtc: { url: 'https://my-go2rtc', stream: 'office' },
});
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBe(
Engine.Generic,
);
});
});
it('should get no engine from config with insufficient details', async () => {
const config = createCameraConfig({});
expect(await createFactory().getEngineForCamera(createHASS(), config)).toBeNull();
@@ -115,38 +171,6 @@ describe('CameraManagerEngineFactory.getEngineForCamera()', () => {
entityRegistryManager.getEntity = vi.fn().mockRejectedValue(new Error());
await expect(
createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(createHASS(), config),
).rejects.toThrow();
});
it('should treat entity not in registry but with state as generic', async () => {
const config = createCameraConfig({
engine: 'auto',
webrtc_card: { entity: 'camera.foo' },
});
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi.fn().mockRejectedValue(new Error());
expect(
await createFactory({
entityRegistryManager: entityRegistryManager,
}).getEngineForCamera(
createHASS({
'camera.foo': createStateEntity(),
}),
config,
),
).toBe(Engine.Generic);
});
it('should get engine from webrtc-card configuration', async () => {
const config = createCameraConfig({ engine: 'auto', camera_entity: 'camera.foo' });
const entityRegistryManager = new EntityRegistryManager(new EntityCache());
entityRegistryManager.getEntity = vi.fn().mockRejectedValue(new Error());
await expect(
createFactory({
entityRegistryManager: entityRegistryManager,
@@ -155,7 +179,7 @@ describe('CameraManagerEngineFactory.getEngineForCamera()', () => {
});
});
describe('CameraManagerEngineFactory.createEngine()', () => {
describe('createEngine()', () => {
it('should create generic engine', async () => {
expect(await createFactory().createEngine(Engine.Generic)).toBeInstanceOf(
GenericCameraManagerEngine,
@@ -192,11 +192,23 @@ describe('GenericCameraManagerEngine', () => {
expect(
createEngine().getCameraMetadata(createHASS(), createGenericCameraConfig()),
).toEqual({
icon: 'mdi:bookmark',
icon: 'mdi:video',
title: '',
});
});
it('with id', async () => {
expect(
createEngine().getCameraMetadata(
createHASS(),
createGenericCameraConfig({ id: 'https://go2rtc#stream' }),
),
).toEqual({
icon: 'mdi:video',
title: 'https://go2rtc#stream',
});
});
it('with configured title', async () => {
expect(
createEngine().getCameraMetadata(
@@ -206,7 +218,7 @@ describe('GenericCameraManagerEngine', () => {
}),
),
).toEqual({
icon: 'mdi:bookmark',
icon: 'mdi:video',
title: 'My Camera',
});
});
@@ -225,7 +237,7 @@ describe('GenericCameraManagerEngine', () => {
}),
),
).toEqual({
icon: 'mdi:bookmark',
icon: 'mdi:video',
title: 'My Entity Camera',
});
});
@@ -245,7 +257,7 @@ describe('GenericCameraManagerEngine', () => {
}),
),
).toEqual({
icon: 'mdi:bookmark',
icon: 'mdi:video',
title: 'My Entity Camera',
});
});