Files
advanced-camera-card/tests/card-controller/message-manager.test.ts
T

142 lines
4.6 KiB
TypeScript

import { afterAll, describe, expect, it, vi } from 'vitest';
import { FrigateCardError, Message } from '../../src/types';
import { MessageManager } from '../../src/card-controller/message-manager';
import { createCardAPI } from '../test-utils';
const createMessage = (options?: Partial<Message>): Message => {
return {
message: options?.message ?? 'message',
type: options?.type ?? 'info',
...(!!options?.icon && { icon: options.icon }),
...(!!options?.context && { context: options.context }),
...(!!options?.dotdotdot && { dotdotdot: options.dotdotdot }),
};
};
describe('MessageManager', () => {
afterAll(() => {
vi.restoreAllMocks();
});
it('should construct', () => {
const manager = new MessageManager(createCardAPI());
expect(manager.hasMessage()).toBeFalsy();
expect(manager.getMessage()).toBeNull();
expect(manager.hasErrorMessage()).toBeFalsy();
});
it('should set info message', () => {
const api = createCardAPI();
const manager = new MessageManager(api);
const message = createMessage();
manager.setMessageIfHigherPriority(message);
expect(manager.hasMessage()).toBeTruthy();
expect(manager.getMessage()).toBe(message);
expect(manager.hasErrorMessage()).toBeFalsy();
expect(api.getMediaLoadedInfoManager().clear).toBeCalled();
expect(api.getCardElementManager().scrollReset).toBeCalled();
expect(api.getCardElementManager().update).toBeCalled();
});
it('should set error message', () => {
const api = createCardAPI();
const manager = new MessageManager(api);
const message = createMessage({ type: 'error' });
manager.setMessageIfHigherPriority(message);
expect(manager.hasMessage()).toBeTruthy();
expect(manager.getMessage()).toBe(message);
expect(manager.hasErrorMessage()).toBeTruthy();
expect(api.getMediaLoadedInfoManager().clear).toBeCalled();
expect(api.getCardElementManager().scrollReset).toBeCalled();
expect(api.getCardElementManager().update).toBeCalled();
});
it('should reset message', () => {
const api = createCardAPI();
const manager = new MessageManager(api);
manager.reset();
expect(manager.hasMessage()).toBeFalsy();
const message = createMessage({ type: 'error' });
manager.setMessageIfHigherPriority(message);
expect(manager.hasMessage()).toBeTruthy();
vi.mocked(api.getCardElementManager().update).mockClear();
manager.reset();
expect(manager.hasMessage()).toBeFalsy();
expect(api.getCardElementManager().update).toBeCalled();
});
it('should respect priority', () => {
const api = createCardAPI();
const manager = new MessageManager(api);
manager.reset();
expect(manager.hasMessage()).toBeFalsy();
const errorMessage = createMessage({ type: 'error' });
manager.setMessageIfHigherPriority(errorMessage);
const infoMessage = createMessage({ type: 'info' });
manager.setMessageIfHigherPriority(infoMessage);
expect(manager.getMessage()).toBe(errorMessage);
const connectionMessage = createMessage({ type: 'connection' });
manager.setMessageIfHigherPriority(connectionMessage);
expect(manager.getMessage()).toBe(connectionMessage);
});
it('should set FrigateCardError object', () => {
const consoleSpy = vi.spyOn(global.console, 'warn').mockReturnValue(undefined);
const api = createCardAPI();
const manager = new MessageManager(api);
const context = { foo: 'bar' };
manager.setErrorIfHigherPriority(
new FrigateCardError('frigate card message', context),
);
expect(manager.hasMessage()).toBeTruthy();
expect(manager.getMessage()).toEqual({
message: 'frigate card message',
type: 'error',
context: context,
});
expect(consoleSpy).toBeCalled();
});
it('should set Error object', () => {
const consoleSpy = vi.spyOn(global.console, 'warn').mockReturnValue(undefined);
const api = createCardAPI();
const manager = new MessageManager(api);
manager.setErrorIfHigherPriority(new Error('generic error message'));
expect(manager.hasMessage()).toBeTruthy();
expect(manager.getMessage()).toEqual({
message: 'generic error message',
type: 'error',
});
expect(consoleSpy).toBeCalled();
});
it('should not set unknown error type', () => {
const consoleSpy = vi.spyOn(global.console, 'warn').mockReturnValue(undefined);
const api = createCardAPI();
const manager = new MessageManager(api);
manager.setErrorIfHigherPriority('not_an_error_object');
expect(manager.hasMessage()).toBeFalsy();
expect(consoleSpy).not.toBeCalled();
});
});