Fix obscure config merge bug.

This commit is contained in:
Dermot Duffy
2024-03-03 18:22:51 -08:00
parent 8f3c6af38f
commit 89ddea69db
4 changed files with 96 additions and 12 deletions
+35 -7
View File
@@ -1,3 +1,4 @@
import { HomeAssistant } from '@dermotduffy/custom-card-helpers';
import add from 'date-fns/add';
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
import { mock } from 'vitest-mock-extended';
@@ -29,6 +30,7 @@ import {
import { sortMedia } from '../../src/camera-manager/utils';
import { CardController } from '../../src/card-controller/controller';
import { CameraConfig } from '../../src/config/types';
import { EntityRegistryManager } from '../../src/utils/ha/entity-registry';
import { ViewMedia } from '../../src/view/media';
import {
TestViewMedia,
@@ -222,7 +224,7 @@ describe('CameraManager', async () => {
factory?: CameraManagerEngineFactory,
): CameraManager => {
const camerasConfig = cameras?.map(
(camera) => camera.config ?? createCameraConfig({ engine: 'generic' }),
(camera) => camera.config ?? createCameraConfig(baseCameraConfig),
);
vi.mocked(api.getConfigManager().getConfig).mockReturnValue(
createConfig({
@@ -238,12 +240,17 @@ describe('CameraManager', async () => {
const engineType =
camera.engineType === undefined ? Engine.Generic : camera.engineType;
if (engineType) {
vi.mocked(mockEngine.createCamera).mockResolvedValueOnce(
createCamera(
camera.config ?? createCameraConfig(baseCameraConfig),
mockEngine,
camera.capabilties ?? createCameraCapabilities(),
),
vi.mocked(mockEngine.createCamera).mockImplementationOnce(
async (
_hass: HomeAssistant,
_entityRegistryManager: EntityRegistryManager,
cameraConfig: CameraConfig,
): Promise<Camera> =>
createCamera(
cameraConfig,
mockEngine,
camera.capabilties ?? createCameraCapabilities(),
),
);
}
vi.mocked(mockFactory.getEngineForCamera).mockResolvedValueOnce(engineType);
@@ -484,6 +491,27 @@ describe('CameraManager', async () => {
expect(manager.generateDefaultEventQueries('id')).toBeNull();
});
});
it('should merge defaults correctly', async () => {
const api = createCardAPI();
vi.mocked(api.getHASSManager().getHASS).mockReturnValue(createHASS());
const engine = mock<CameraManagerEngine>();
const manager = createCameraManager(api, engine, [
{
config: createCameraConfig({
...baseCameraConfig,
triggers: {
events: ['snapshots'],
},
}),
},
]);
expect(await manager.initializeCamerasFromConfig()).toBeTruthy();
expect(manager.getStore().getCamera('id')?.getConfig().triggers.events).toEqual([
'snapshots',
]);
});
});
describe('should get media metadata', () => {
+47
View File
@@ -18,6 +18,7 @@ import {
isTruthy,
isValidDate,
prettifyTitle,
recursivelyMergeObjectsNotArrays,
runWhenIdleIfSupported,
setOrRemoveAttribute,
setify,
@@ -291,3 +292,49 @@ describe('getChildrenFromElement', () => {
expect(getChildrenFromElement(slot)).toEqual(children);
});
});
describe('recursivelyMergeObjectsNotArrays', () => {
it('should recursively merge objects but replace arrays', () => {
expect(
recursivelyMergeObjectsNotArrays(
{
a: {
b: {
c: 3,
d: {
e: 4,
},
array: [1, 2, 3],
},
other: {
field: 7,
},
},
},
{
a: {
b: {
array: [4],
d: {
e: 5,
},
},
},
},
),
).toEqual({
a: {
b: {
c: 3,
array: [4],
d: {
e: 5,
},
},
other: {
field: 7,
},
},
});
});
});