test: Split test utilities to improve test times (#2622)

This commit is contained in:
Dermot Duffy
2026-07-26 16:29:53 -07:00
committed by GitHub
parent 8d44fcecf1
commit ad89aa9538
234 changed files with 2730 additions and 2516 deletions
+32 -32
View File
@@ -26,15 +26,15 @@ import type {
EntityRegistryManager,
} from '../../../src/ha/registry/entity/types';
import { ViewMediaType } from '../../../src/view/item';
import { createCameraConfig } from '../../config/test-utils';
import { EntityRegistryManagerMock } from '../../ha/registry/entity/mock';
import {
createCameraConfig,
createCapabilities,
createHASS,
createHASSManager,
createRegistryEntity,
createStateEntity,
} from '../../test-utils';
import { createCapabilities } from '../test-utils';
vi.mock('../../../src/camera-manager/frigate/requests');
@@ -98,7 +98,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: mock<FrigateEventWatcher>(),
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
}),
).rejects.toThrowError(/Could not find camera entity/);
).rejects.toThrow(/Could not find camera entity/);
});
it('with a valid camera_entity', async () => {
@@ -315,7 +315,7 @@ describe('FrigateCamera', () => {
expect(camera.getCapabilities()?.has('snapshots')).toBeTruthy();
expect(camera.getCapabilities()?.has('recordings')).toBeTruthy();
expect(camera.getCapabilities()?.has('trigger')).toBeTruthy();
expect(vi.mocked(getPTZInfo)).toBeCalled();
expect(vi.mocked(getPTZInfo)).toHaveBeenCalled();
});
it('basic birdseye', async () => {
@@ -342,7 +342,7 @@ describe('FrigateCamera', () => {
expect(camera.getCapabilities()?.has('snapshots')).toBeFalsy();
expect(camera.getCapabilities()?.has('recordings')).toBeFalsy();
expect(camera.getCapabilities()?.has('trigger')).toBeTruthy();
expect(vi.mocked(getPTZInfo)).not.toBeCalled();
expect(vi.mocked(getPTZInfo)).not.toHaveBeenCalled();
});
describe('with ptz', () => {
@@ -368,7 +368,7 @@ describe('FrigateCamera', () => {
expect(camera.getCapabilities()?.has('ptz')).toBeFalsy();
expect(camera.getCapabilities()?.hasPTZCapability()).toBeFalsy();
expect(consoleSpy).toBeCalled();
expect(consoleSpy).toHaveBeenCalled();
});
it('when getPTZInfo call succeeds with continuous motion', async () => {
@@ -824,7 +824,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: eventWatcher,
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
});
expect(eventWatcher.subscribe).toBeCalledWith(
expect(eventWatcher.subscribe).toHaveBeenCalledWith(
expect.objectContaining({
instanceID: 'CLIENT_ID',
}),
@@ -853,7 +853,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: eventWatcher,
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
});
expect(eventWatcher.subscribe).not.toBeCalled();
expect(eventWatcher.subscribe).not.toHaveBeenCalled();
});
it('should not subscribe without trigger capability', async () => {
@@ -878,7 +878,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: eventWatcher,
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
});
expect(eventWatcher.subscribe).not.toBeCalled();
expect(eventWatcher.subscribe).not.toHaveBeenCalled();
});
it('should not subscribe with no camera name', async () => {
@@ -902,7 +902,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: eventWatcher,
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
});
expect(eventWatcher.subscribe).not.toBeCalled();
expect(eventWatcher.subscribe).not.toHaveBeenCalled();
});
it('should unsubscribe on destroy', async () => {
@@ -926,10 +926,10 @@ describe('FrigateCamera', () => {
frigateEventWatcher: eventWatcher,
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
});
expect(eventWatcher.unsubscribe).not.toBeCalled();
expect(eventWatcher.unsubscribe).not.toHaveBeenCalled();
await camera.destroy();
expect(eventWatcher.unsubscribe).toBeCalled();
expect(eventWatcher.unsubscribe).toHaveBeenCalled();
});
it('should not subscribe when destroyed while base initialization is pending', async () => {
@@ -965,22 +965,22 @@ describe('FrigateCamera', () => {
frigateReviewWatcher: reviewWatcher,
capabilityOptions: { capabilities: createCapabilities({ trigger: true }) },
});
await vi.waitFor(() => expect(entityRegistryManager.getEntity).toBeCalled());
await vi.waitFor(() => expect(entityRegistryManager.getEntity).toHaveBeenCalled());
await camera.destroy();
// `_destroyed` short-circuits initialize() after the pending await, so
// neither watcher is ever subscribed.
expect(eventWatcher.subscribe).not.toBeCalled();
expect(reviewWatcher.subscribe).not.toBeCalled();
expect(eventWatcher.subscribe).not.toHaveBeenCalled();
expect(reviewWatcher.subscribe).not.toHaveBeenCalled();
resolveEntity();
await initializePromise;
expect(eventWatcher.subscribe).not.toBeCalled();
expect(eventWatcher.unsubscribe).not.toBeCalled();
expect(reviewWatcher.subscribe).not.toBeCalled();
expect(reviewWatcher.unsubscribe).not.toBeCalled();
expect(eventWatcher.subscribe).not.toHaveBeenCalled();
expect(eventWatcher.unsubscribe).not.toHaveBeenCalled();
expect(reviewWatcher.subscribe).not.toHaveBeenCalled();
expect(reviewWatcher.unsubscribe).not.toHaveBeenCalled();
});
describe('should call handler correctly', () => {
@@ -1097,7 +1097,7 @@ describe('FrigateCamera', () => {
});
if (call) {
expect(eventCallback).toBeCalledWith({
expect(eventCallback).toHaveBeenCalledWith({
type: 'new',
cameraID: 'CAMERA_1',
id: 'event-1',
@@ -1106,7 +1106,7 @@ describe('FrigateCamera', () => {
fidelity: 'high',
});
} else {
expect(eventCallback).not.toBeCalled();
expect(eventCallback).not.toHaveBeenCalled();
}
},
);
@@ -1170,7 +1170,7 @@ describe('FrigateCamera', () => {
},
});
expect(eventCallback).toBeCalledWith({
expect(eventCallback).toHaveBeenCalledWith({
type: 'end',
cameraID: 'CAMERA_1',
id: 'event-1',
@@ -1378,7 +1378,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: mock<FrigateEventWatcher>(),
frigateReviewWatcher: reviewWatcher,
});
expect(reviewWatcher.subscribe).toBeCalledWith(
expect(reviewWatcher.subscribe).toHaveBeenCalledWith(
expect.objectContaining({
instanceID: 'CLIENT_ID',
}),
@@ -1409,7 +1409,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: mock<FrigateEventWatcher>(),
frigateReviewWatcher: reviewWatcher,
});
expect(reviewWatcher.subscribe).not.toBeCalled();
expect(reviewWatcher.subscribe).not.toHaveBeenCalled();
});
it('should not subscribe to reviews with description only (no severities)', async () => {
@@ -1438,7 +1438,7 @@ describe('FrigateCamera', () => {
frigateReviewWatcher: reviewWatcher,
});
// Severities are required - description alone is not enough
expect(reviewWatcher.subscribe).not.toBeCalled();
expect(reviewWatcher.subscribe).not.toHaveBeenCalled();
});
describe('should call handler correctly', () => {
@@ -1495,7 +1495,7 @@ describe('FrigateCamera', () => {
},
});
expect(eventCallback).toBeCalledWith({
expect(eventCallback).toHaveBeenCalledWith({
type: 'new',
cameraID: 'CAMERA_1',
id: '123',
@@ -1566,7 +1566,7 @@ describe('FrigateCamera', () => {
},
});
expect(eventCallback).toBeCalledWith({
expect(eventCallback).toHaveBeenCalledWith({
type: 'update',
cameraID: 'CAMERA_1',
id: '123',
@@ -1637,7 +1637,7 @@ describe('FrigateCamera', () => {
},
});
expect(eventCallback).toBeCalledWith({
expect(eventCallback).toHaveBeenCalledWith({
type: 'update',
cameraID: 'CAMERA_1',
id: '123',
@@ -1995,7 +1995,7 @@ describe('FrigateCamera', () => {
},
});
expect(eventCallback).toBeCalledWith({
expect(eventCallback).toHaveBeenCalledWith({
type: 'end',
cameraID: 'CAMERA_1',
id: '123',
@@ -2123,7 +2123,7 @@ describe('FrigateCamera', () => {
frigateEventWatcher: mock<FrigateEventWatcher>(),
frigateReviewWatcher: mock<FrigateReviewWatcher>(),
}),
).rejects.toThrowError(/Could not find camera entity/);
).rejects.toThrow(/Could not find camera entity/);
});
});
@@ -2284,7 +2284,7 @@ describe('FrigateCamera', () => {
const executor = mock<ActionsExecutor>();
await camera.executePTZAction(executor, 'preset');
expect(executor.executeActions).not.toBeCalled();
expect(executor.executeActions).not.toHaveBeenCalled();
});
it('should ignore actions with configured action', async () => {
@@ -2316,7 +2316,7 @@ describe('FrigateCamera', () => {
const executor = mock<ActionsExecutor>();
await camera.executePTZAction(executor, 'left', { phase: 'start' });
expect(executor.executeActions).toBeCalledTimes(1);
expect(executor.executeActions).toHaveBeenCalledTimes(1);
expect(executor.executeActions).toHaveBeenLastCalledWith({
actions: {
action: 'perform-action',
@@ -38,17 +38,17 @@ import type { RawAdvancedCameraCardConfig } from '../../../src/config/types';
import { QuerySource } from '../../../src/query-source';
import type { Severity } from '../../../src/severity';
import { ViewMedia, ViewMediaType } from '../../../src/view/item';
import { createCameraConfig } from '../../config/test-utils';
import { EntityRegistryManagerMock } from '../../ha/registry/entity/mock';
import {
createCameraConfig,
createFrigateEvent,
createFrigateRecording,
createFrigateReview,
createHASS,
createHASSManager,
createStore,
TestViewMedia,
} from '../../test-utils';
import { TestViewMedia } from '../../view/test-utils';
import { createStore } from '../test-utils';
vi.mock('../../../src/camera-manager/frigate/requests');
+1 -1
View File
@@ -7,8 +7,8 @@ import {
FrigateViewMediaFactory,
} from '../../../src/camera-manager/frigate/media';
import { ViewMediaType } from '../../../src/view/item';
import { createCameraConfig } from '../../config/test-utils';
import {
createCameraConfig,
createFrigateEvent,
createFrigateRecording,
createFrigateReview,
+12 -12
View File
@@ -46,7 +46,7 @@ describe('frigate requests', () => {
expect(await getRecordingsSummary(hass, 'clientID', 'camera.office')).toBe(
recordingSummary,
);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
recordingSummarySchema,
expect.objectContaining({
@@ -77,7 +77,7 @@ describe('frigate requests', () => {
before: 0,
}),
).toBe(recordingSegments);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
recordingSegmentsSchema,
expect.objectContaining({
@@ -101,7 +101,7 @@ describe('frigate requests', () => {
const hass = createHASS();
retainEvent(hass, 'clientID', 'eventID', true);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
retainResultSchema,
expect.objectContaining({
@@ -121,10 +121,10 @@ describe('frigate requests', () => {
});
const hass = createHASS();
await expect(retainEvent(hass, 'clientID', 'eventID', true)).rejects.toThrowError(
await expect(retainEvent(hass, 'clientID', 'eventID', true)).rejects.toThrow(
/Could not retain event/,
);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
retainResultSchema,
expect.objectContaining({
@@ -157,7 +157,7 @@ describe('frigate requests', () => {
favorites: true,
}),
).toBe(events);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
frigateEventsSchema,
expect.objectContaining({
@@ -193,7 +193,7 @@ describe('frigate requests', () => {
vi.mocked(homeAssistantWSRequest).mockResolvedValue(eventSummary);
expect(await getEventSummary(hass, 'clientID')).toBe(eventSummary);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
eventSummarySchema,
expect.objectContaining({
@@ -216,7 +216,7 @@ describe('frigate requests', () => {
const hass = createHASS();
vi.mocked(homeAssistantWSRequest).mockResolvedValue(ptzInfo);
expect(await getPTZInfo(hass, 'clientID', 'camera.office')).toBe(ptzInfo);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
ptzInfoSchema,
expect.objectContaining({
@@ -259,7 +259,7 @@ describe('frigate requests', () => {
reviewed: false,
}),
).toBe(reviews);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
frigateReviewsSchema,
expect.objectContaining({
@@ -288,7 +288,7 @@ describe('frigate requests', () => {
const hass = createHASS();
setReviewsReviewed(hass, 'clientID', ['review_id'], true);
expect(homeAssistantWSRequest).toBeCalledWith(
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
reviewResultSchema,
expect.objectContaining({
@@ -309,8 +309,8 @@ describe('frigate requests', () => {
const hass = createHASS();
await expect(
setReviewsReviewed(hass, 'clientID', ['review_id'], true),
).rejects.toThrowError(/Failed to receive response from Home Assistant/);
expect(homeAssistantWSRequest).toBeCalledWith(
).rejects.toThrow(/Failed to receive response from Home Assistant/);
expect(homeAssistantWSRequest).toHaveBeenCalledWith(
hass,
reviewResultSchema,
expect.objectContaining({
+1 -1
View File
@@ -15,8 +15,8 @@ import {
getReviewTitle,
} from '../../../src/camera-manager/frigate/util';
import type { CameraConfig } from '../../../src/config/schema/cameras';
import { createCameraConfig } from '../../config/test-utils';
import {
createCameraConfig,
createFrigateEvent,
createFrigateRecording,
createFrigateReview,
+12 -12
View File
@@ -93,7 +93,7 @@ describe('FrigateEventWatcher', () => {
watcher.subscribe({ instanceID: 'frigate', callback: vi.fn() });
await flushPromises();
expect(hass.connection.subscribeMessage).toBeCalledWith(
expect(hass.connection.subscribeMessage).toHaveBeenCalledWith(
expect.any(Function),
expect.objectContaining({
type: 'frigate/events/subscribe',
@@ -116,7 +116,7 @@ describe('FrigateEventWatcher', () => {
watcher.unsubscribe(request);
await flushPromises();
expect(unsub).toBeCalledTimes(1);
expect(unsub).toHaveBeenCalledTimes(1);
});
it('should drop messages from an old-connection subscription after a swap', async () => {
@@ -140,7 +140,7 @@ describe('FrigateEventWatcher', () => {
await flushPromises();
oldDispatcher(JSON.stringify(createEventChange()));
expect(callback).not.toBeCalled();
expect(callback).not.toHaveBeenCalled();
});
describe('should call handler', () => {
@@ -156,8 +156,8 @@ describe('FrigateEventWatcher', () => {
await flushPromises();
fireMessage(hass, 'NOT_JSON');
expect(callback).not.toBeCalled();
expect(spy).toBeCalledWith(
expect(callback).not.toHaveBeenCalled();
expect(spy).toHaveBeenCalledWith(
'Received non-JSON payload from subscription: frigate/events/subscribe',
'NOT_JSON',
);
@@ -176,8 +176,8 @@ describe('FrigateEventWatcher', () => {
const data = JSON.stringify({});
fireMessage(hass, data);
expect(callback).not.toBeCalled();
expect(spy).toBeCalledWith(
expect(callback).not.toHaveBeenCalled();
expect(spy).toHaveBeenCalledWith(
'Received malformed message from subscription: frigate/events/subscribe',
data,
);
@@ -194,7 +194,7 @@ describe('FrigateEventWatcher', () => {
const eventChange = createEventChange();
fireMessage(hass, JSON.stringify(eventChange));
expect(callback).toBeCalledWith(eventChange);
expect(callback).toHaveBeenCalledWith(eventChange);
});
it('with a matcher', async () => {
@@ -219,8 +219,8 @@ describe('FrigateEventWatcher', () => {
const eventChange = createEventChange();
fireMessage(hass, JSON.stringify(eventChange));
expect(non_matching_callback).not.toBeCalledWith(eventChange);
expect(matching_callback).toBeCalledWith(eventChange);
expect(non_matching_callback).not.toHaveBeenCalledWith(eventChange);
expect(matching_callback).toHaveBeenCalledWith(eventChange);
});
});
});
@@ -239,7 +239,7 @@ describe('FrigateReviewWatcher', () => {
watcher.subscribe({ instanceID: 'frigate', callback });
await flushPromises();
expect(hass.connection.subscribeMessage).toBeCalledWith(
expect(hass.connection.subscribeMessage).toHaveBeenCalledWith(
expect.any(Function),
expect.objectContaining({
type: 'frigate/reviews/subscribe',
@@ -249,6 +249,6 @@ describe('FrigateReviewWatcher', () => {
const reviewChange = createReviewChange();
fireMessage(hass, JSON.stringify(reviewChange));
expect(callback).toBeCalledWith(reviewChange);
expect(callback).toHaveBeenCalledWith(reviewChange);
});
});