Introduces a ProblemManager that detects and surfaces actionable issues (stale config, legacy frigate-hass-card resources, slow/failed streams) via status bar indicators and notification popups with fix actions.
158 lines
4.7 KiB
TypeScript
158 lines
4.7 KiB
TypeScript
import yaml from 'js-yaml';
|
|
import { describe, expect, it } from 'vitest';
|
|
import { MessageController } from '../../../src/components-lib/message/controller';
|
|
import { Link } from '../../../src/config/schema/common/link';
|
|
import { TROUBLESHOOTING_URL } from '../../../src/const';
|
|
import { localize } from '../../../src/localize/localize';
|
|
import { Message, MessageType } from '../../../src/types';
|
|
|
|
describe('MessageController', () => {
|
|
describe('should return the correct message string', () => {
|
|
it('should return simple message string', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
type: 'info',
|
|
};
|
|
expect(controller.getMessageString(message)).toBe('Message');
|
|
});
|
|
|
|
it('should embed simple string context', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
context: 'Context',
|
|
type: 'info',
|
|
};
|
|
expect(controller.getMessageString(message)).toBe('Message: Context');
|
|
});
|
|
});
|
|
|
|
describe('should return the correct icon', () => {
|
|
describe('when icon is specified', () => {
|
|
it.each([['info' as const], ['error' as const], ['connection' as const]])(
|
|
'%s',
|
|
(type: MessageType) => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
icon: 'mdi:car',
|
|
type,
|
|
};
|
|
expect(controller.getIcon(message)).toBe('mdi:car');
|
|
},
|
|
);
|
|
});
|
|
|
|
it('when type is an error', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
type: 'error',
|
|
};
|
|
expect(controller.getIcon(message)).toBe('mdi:alert-circle');
|
|
});
|
|
|
|
it('by default', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
};
|
|
expect(controller.getIcon(message)).toBe('mdi:information-outline');
|
|
});
|
|
});
|
|
|
|
describe('should show troubleshooting link', () => {
|
|
it('should show for errors', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = { message: 'Error message', type: 'error' };
|
|
expect(controller.getLink(message)).toEqual({
|
|
url: TROUBLESHOOTING_URL,
|
|
title: localize('error.troubleshooting'),
|
|
});
|
|
});
|
|
|
|
describe('should not show for other types', () => {
|
|
it.each([['info' as const], ['connection' as const]])(
|
|
'%s',
|
|
(type: MessageType) => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
icon: 'mdi:car',
|
|
type,
|
|
};
|
|
expect(controller.getLink(message)).toBeNull();
|
|
},
|
|
);
|
|
});
|
|
|
|
describe('should show correct URL', () => {
|
|
it('by default', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = { message: 'Error message', type: 'error' };
|
|
expect(controller.getLink(message)?.url).toBe(TROUBLESHOOTING_URL);
|
|
});
|
|
|
|
it('when specified', () => {
|
|
const controller = new MessageController();
|
|
const url: Link = {
|
|
url: 'link',
|
|
title: 'title',
|
|
};
|
|
const message: Message = {
|
|
message: 'Error message',
|
|
type: 'error',
|
|
link: url,
|
|
};
|
|
expect(controller.getLink(message)).toBe(url);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('should get context strings', () => {
|
|
it('for no context', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
type: 'info',
|
|
};
|
|
expect(controller.getContextStrings(message)).toEqual([]);
|
|
});
|
|
|
|
it('for simple string', () => {
|
|
const controller = new MessageController();
|
|
const message: Message = {
|
|
message: 'Message',
|
|
context: 'Context',
|
|
type: 'info',
|
|
};
|
|
expect(controller.getContextStrings(message)).toEqual(['Context']);
|
|
});
|
|
|
|
it('for object', () => {
|
|
const controller = new MessageController();
|
|
const obj = { one: 1, two: 2 };
|
|
const message: Message = {
|
|
message: 'Message',
|
|
context: obj,
|
|
type: 'info',
|
|
};
|
|
expect(controller.getContextStrings(message)).toEqual([yaml.dump(obj)]);
|
|
});
|
|
|
|
it('for array', () => {
|
|
const controller = new MessageController();
|
|
const array = ['one', 'two'];
|
|
const message: Message = {
|
|
message: 'Message',
|
|
context: array,
|
|
type: 'info',
|
|
};
|
|
expect(controller.getContextStrings(message)).toEqual(
|
|
array.map((item) => yaml.dump(item)),
|
|
);
|
|
});
|
|
});
|
|
});
|