Files
advanced-camera-card/tests/utils/task.test.ts
T
Dermot Duffy fc32727860 feat: Add support for Frigate reviews / detections [initial PR] (#2315)
- Add support for Frigate reviews / detections.
 - Add support for GenAI metadata.
- Significant internal refactor to more flexible "UnifiedQuery" to allow
mixing cameras with simple metadata and review metadata (e.g. a timeline
view of a Frigate camera with reviews, and a Reolink camera with simple
metadata).
 - Add support for folder media as camera media.

There are a few more PRs to commit prior to this going live, but
commiting this for now due to the scale of the change.

BREAKING CHANGE: `media_type` and `events_type` are retired under
`live`, `viewer` and `timeline` configuration sections, instead media
type is associated (once) with the camera under `media`.
2026-01-19 13:32:50 -08:00

90 lines
3.1 KiB
TypeScript

import { Task } from '@lit-labs/task';
import { html, render, TemplateResult } from 'lit';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { mock } from 'vitest-mock-extended';
import { renderProgressIndicator } from '../../src/components/progress-indicator';
import { renderTask } from '../../src/utils/task';
vi.mock('../../src/components/progress-indicator');
const getRenderedContent = (template: TemplateResult): string => {
const container = document.createElement('div');
render(template, container);
return container.textContent || '';
};
// @vitest-environment jsdom
describe('task utilities', () => {
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.restoreAllMocks();
});
it('should render initial state', () => {
const task = mock<Task<unknown[], string>>();
task.render.mockImplementation((renderers) => renderers.initial?.());
vi.mocked(renderProgressIndicator).mockReturnValue(html`progress`);
const result = renderTask(task, (r) => html`${r}`);
expect(getRenderedContent(result)).toContain('progress');
});
it('should render pending state', () => {
const task = mock<Task<unknown[], string>>();
task.render.mockImplementation((renderers) => renderers.pending?.());
vi.mocked(renderProgressIndicator).mockReturnValue(html`progress`);
const result = renderTask(task, (r) => html`${r}`);
expect(getRenderedContent(result)).toContain('progress');
});
it('should render error state', () => {
const task = mock<Task<unknown[], string>>();
task.render.mockImplementation((renderers) =>
renderers.error?.(new Error('test error')),
);
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
const errorFunc = vi.fn().mockReturnValue(html`error`);
const result = renderTask(task, (r) => html`${r}`, { errorFunc });
expect(errorFunc).toHaveBeenCalledWith(new Error('test error'));
expect(consoleSpy).toHaveBeenCalled();
expect(getRenderedContent(result)).toContain('error');
});
it('should render complete state', () => {
const task = mock<Task<unknown[], string>>();
task.render.mockImplementation((renderers) => renderers.complete?.('result'));
const result = renderTask(task, (r) => html`complete: ${r}`);
expect(getRenderedContent(result)).toContain('complete: result');
});
it('should use custom inProgressFunc', () => {
const task = mock<Task<unknown[], string>>();
task.render.mockImplementation((renderers) => renderers.initial?.());
const inProgressFunc = () => html`custom progress`;
const result = renderTask(task, (r) => html`${r}`, { inProgressFunc });
expect(getRenderedContent(result)).toContain('custom progress');
});
it('should use cardWideConfig', () => {
const task = mock<Task<unknown[], string>>();
task.render.mockImplementation((renderers) => renderers.initial?.());
const cardWideConfig = {};
vi.mocked(renderProgressIndicator).mockReturnValue(html`progress`);
renderTask(task, (r) => html`${r}`, { cardWideConfig });
expect(renderProgressIndicator).toHaveBeenCalledWith({
cardWideConfig,
});
});
});