94 lines
3.1 KiB
TypeScript
94 lines
3.1 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { ResolvedMediaCache, resolveMedia } from '../../src/ha/resolved-media';
|
|
import { ResolvedMedia, resolvedMediaSchema } from '../../src/ha/types';
|
|
import { homeAssistantWSRequest } from '../../src/ha/ws-request';
|
|
import { errorToConsole } from '../../src/utils/basic';
|
|
import { createHASS } from '../test-utils';
|
|
|
|
vi.mock('../../src/ha/ws-request', () => ({
|
|
homeAssistantWSRequest: vi.fn(),
|
|
}));
|
|
vi.mock('../../src/utils/basic', () => ({
|
|
errorToConsole: vi.fn(),
|
|
}));
|
|
|
|
describe('ResolvedMediaCache', () => {
|
|
it('should store and retrieve values', () => {
|
|
const cache = new ResolvedMediaCache();
|
|
const key = 'media-id';
|
|
const resolvedMedia = {
|
|
id: key,
|
|
title: 'Test Media',
|
|
mime_type: 'video/mp4',
|
|
url: 'http://media',
|
|
media_content_type: 'video',
|
|
media_content_id: key,
|
|
};
|
|
cache.set(key, resolvedMedia);
|
|
expect(cache.get(key)).toBe(resolvedMedia);
|
|
});
|
|
});
|
|
|
|
describe('resolveMedia', () => {
|
|
const mediaContentID = 'media-123';
|
|
const resolvedMedia: ResolvedMedia = {
|
|
mime_type: 'video/mp4',
|
|
url: 'http://media',
|
|
};
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it('returns cached value if present', async () => {
|
|
const cache = new ResolvedMediaCache();
|
|
cache.set(mediaContentID, resolvedMedia);
|
|
const result = await resolveMedia(createHASS(), mediaContentID, cache);
|
|
expect(result).toBe(resolvedMedia);
|
|
expect(homeAssistantWSRequest).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('fetches and caches value if not present in cache', async () => {
|
|
vi.mocked(homeAssistantWSRequest).mockResolvedValueOnce(resolvedMedia);
|
|
|
|
const hass = createHASS();
|
|
const cache = new ResolvedMediaCache();
|
|
const result = await resolveMedia(hass, mediaContentID, cache);
|
|
|
|
expect(homeAssistantWSRequest).toBeCalledWith(
|
|
hass,
|
|
resolvedMediaSchema,
|
|
expect.objectContaining({
|
|
type: 'media_source/resolve_media',
|
|
media_content_id: mediaContentID,
|
|
}),
|
|
);
|
|
expect(result).toEqual(resolvedMedia);
|
|
expect(cache.get(mediaContentID)).toEqual(resolvedMedia);
|
|
});
|
|
|
|
it('returns null and logs error if request fails', async () => {
|
|
const error = new Error('fail');
|
|
vi.mocked(homeAssistantWSRequest).mockRejectedValueOnce(error);
|
|
|
|
const cache = new ResolvedMediaCache();
|
|
const result = await resolveMedia(createHASS(), mediaContentID, cache);
|
|
expect(result).toBeNull();
|
|
expect(errorToConsole).toBeCalledWith(error);
|
|
});
|
|
|
|
it('does not cache null results', async () => {
|
|
vi.mocked(homeAssistantWSRequest).mockResolvedValueOnce(null);
|
|
const cache = new ResolvedMediaCache();
|
|
const result = await resolveMedia(createHASS(), mediaContentID, cache);
|
|
expect(result).toBeNull();
|
|
expect(cache.get(mediaContentID)).toBeNull();
|
|
});
|
|
|
|
it('works without cache argument', async () => {
|
|
vi.mocked(homeAssistantWSRequest).mockResolvedValueOnce(resolvedMedia);
|
|
const result = await resolveMedia(createHASS(), mediaContentID);
|
|
expect(result).toEqual(resolvedMedia);
|
|
});
|
|
});
|