feat: Add hardened error handling and retries (#2451)

- Closes #1830
 - Closes #2099
This commit is contained in:
Dermot Duffy
2026-06-30 17:45:12 -07:00
committed by dermotduffy
parent 4bc787e2b7
commit 47bcce93d3
182 changed files with 7877 additions and 4043 deletions
@@ -0,0 +1,74 @@
import { describe, expect, it, vi } from 'vitest';
import { renderNoMedia } from '../../../src/components/notification/no-media';
import { createCameraManager, createStore } from '../../test-utils';
// @vitest-environment jsdom
describe('renderNoMedia', () => {
it('should render "No media" heading when not loading', () => {
const result = renderNoMedia({
cameraID: null,
cameraManager: null,
});
expect(result).toBeTruthy();
});
it('should render "Awaiting media" heading when loading', () => {
const result = renderNoMedia({
cameraID: null,
cameraManager: null,
loading: true,
});
expect(result).toBeTruthy();
});
it('should include camera title as metadata when camera resolves', () => {
const cameraManager = createCameraManager();
vi.mocked(cameraManager.getCameraMetadata).mockReturnValue({
title: 'Office',
icon: { icon: 'mdi:cctv' },
});
const result = renderNoMedia({
cameraID: 'camera.office',
cameraManager,
});
expect(result).toBeTruthy();
expect(cameraManager.getCameraMetadata).toBeCalledWith('camera.office');
});
it('should fall back to raw camera ID when metadata has no title', () => {
const cameraManager = createCameraManager();
vi.mocked(cameraManager.getCameraMetadata).mockReturnValue(null);
const result = renderNoMedia({
cameraID: 'camera.office',
cameraManager,
});
expect(result).toBeTruthy();
});
it('should fall back to default camera ID when cameraID is null', () => {
const store = createStore([{ cameraID: 'camera.default' }]);
const cameraManager = createCameraManager(store);
vi.mocked(cameraManager.getCameraMetadata).mockReturnValue(null);
const result = renderNoMedia({
cameraID: null,
cameraManager,
});
expect(result).toBeTruthy();
expect(cameraManager.getCameraMetadata).toBeCalledWith('camera.default');
});
it('should not include metadata when no camera is resolvable', () => {
// Empty store — no default camera.
const cameraManager = createCameraManager(createStore());
const result = renderNoMedia({
cameraID: null,
cameraManager,
});
expect(result).toBeTruthy();
expect(cameraManager.getCameraMetadata).not.toBeCalled();
});
});