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`.
This commit is contained in:
@@ -2,12 +2,15 @@ import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
import { mock } from 'vitest-mock-extended';
|
||||
import { CardElementManager } from '../../src/card-controller/card-element-manager';
|
||||
import { StateWatcher } from '../../src/card-controller/hass/state-watcher';
|
||||
import { QueryResults } from '../../src/view/query-results';
|
||||
import {
|
||||
callStateWatcherCallback,
|
||||
createCardAPI,
|
||||
createConfig,
|
||||
createLitElement,
|
||||
createStateEntity,
|
||||
createView,
|
||||
TestViewMedia,
|
||||
} from '../test-utils';
|
||||
|
||||
// @vitest-environment jsdom
|
||||
@@ -260,5 +263,75 @@ describe('CardElementManager', () => {
|
||||
|
||||
expect(element.requestUpdate).toBeCalled();
|
||||
});
|
||||
|
||||
it('selected media review status changes', () => {
|
||||
const api = createCardAPI();
|
||||
const selectedMedia = new TestViewMedia({ id: 'media-1' });
|
||||
const queryResults = new QueryResults({
|
||||
results: [selectedMedia],
|
||||
selectedIndex: 0,
|
||||
});
|
||||
const view = createView({ queryResults });
|
||||
|
||||
vi.mocked(api.getViewManager().getView).mockReturnValue(view);
|
||||
|
||||
const element = createLitElement();
|
||||
const manager = new CardElementManager(
|
||||
api,
|
||||
element,
|
||||
() => undefined,
|
||||
() => undefined,
|
||||
);
|
||||
|
||||
manager.elementConnected();
|
||||
|
||||
// Clear any previous calls from elementConnected.
|
||||
vi.mocked(element.requestUpdate).mockClear();
|
||||
|
||||
// Dispatch the media reviewed event with the selected media item.
|
||||
element.dispatchEvent(
|
||||
new CustomEvent('advanced-camera-card:media:reviewed', {
|
||||
detail: selectedMedia,
|
||||
}),
|
||||
);
|
||||
|
||||
expect(element.requestUpdate).toBeCalled();
|
||||
});
|
||||
|
||||
it('non-selected media review status changes does not update', () => {
|
||||
const api = createCardAPI();
|
||||
const selectedMedia = new TestViewMedia({ id: 'media-1' });
|
||||
const otherMedia = new TestViewMedia({ id: 'media-2' });
|
||||
const queryResults = new QueryResults({
|
||||
results: [selectedMedia, otherMedia],
|
||||
selectedIndex: 0,
|
||||
});
|
||||
const view = createView({ queryResults });
|
||||
|
||||
vi.mocked(api.getViewManager().getView).mockReturnValue(view);
|
||||
|
||||
const element = createLitElement();
|
||||
const manager = new CardElementManager(
|
||||
api,
|
||||
element,
|
||||
() => undefined,
|
||||
() => undefined,
|
||||
);
|
||||
|
||||
manager.elementConnected();
|
||||
|
||||
// Clear any previous calls from elementConnected.
|
||||
vi.mocked(element.requestUpdate).mockClear();
|
||||
|
||||
// Dispatch the media reviewed event with a DIFFERENT media item.
|
||||
element.dispatchEvent(
|
||||
new CustomEvent('advanced-camera-card:media:reviewed', {
|
||||
detail: otherMedia,
|
||||
}),
|
||||
);
|
||||
|
||||
// Should NOT update because the reviewed item is not the selected item.
|
||||
expect(element.requestUpdate).not.toBeCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user