75 lines
3.3 KiB
TypeScript
75 lines
3.3 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import { HeosIntegration, type IHeosRawCommandRequest, type IHeosSnapshot } from '../../ts/integrations/heos/index.js';
|
|
|
|
const snapshot: IHeosSnapshot = {
|
|
system: { host: '192.168.1.80', currentHost: '192.168.1.80' },
|
|
players: [{
|
|
name: 'Living Room',
|
|
playerId: 101,
|
|
model: 'Denon HEOS 7',
|
|
state: 'pause',
|
|
volume: 20,
|
|
groupId: 201,
|
|
available: true,
|
|
}, {
|
|
name: 'Kitchen',
|
|
playerId: 102,
|
|
model: 'Denon HEOS 5',
|
|
state: 'pause',
|
|
volume: 30,
|
|
groupId: 201,
|
|
available: true,
|
|
}],
|
|
groups: [{ name: 'Downstairs', groupId: 201, leadPlayerId: 101, memberPlayerIds: [102] }],
|
|
favorites: {
|
|
1: { sourceId: 1028, name: 'Jazz Radio', type: 'station', mediaId: 'fav-jazz', playable: true },
|
|
},
|
|
inputSources: [{ sourceId: 1027, name: 'HDMI ARC', type: 'station', mediaId: 'inputs/hdmi_arc_1', playable: true }],
|
|
};
|
|
|
|
tap.test('models HEOS media player commands through an executor', async () => {
|
|
const commands: IHeosRawCommandRequest[] = [];
|
|
const runtime = await new HeosIntegration().setup({
|
|
snapshot,
|
|
commandExecutor: {
|
|
execute: async (requestArg) => {
|
|
commands.push(requestArg);
|
|
return { command: requestArg.command, result: true, message: {} };
|
|
},
|
|
},
|
|
}, {});
|
|
|
|
const play = await runtime.callService!({ domain: 'media_player', service: 'media_play', target: { entityId: 'media_player.living_room' } });
|
|
const volume = await runtime.callService!({ domain: 'media_player', service: 'volume_set', target: { entityId: 'media_player.living_room' }, data: { volume_level: 0.35 } });
|
|
const source = await runtime.callService!({ domain: 'media_player', service: 'select_source', target: { entityId: 'media_player.living_room' }, data: { source: 'Jazz Radio' } });
|
|
const join = await runtime.callService!({ domain: 'media_player', service: 'join', target: { entityId: 'media_player.living_room' }, data: { group_members: ['media_player.kitchen'] } });
|
|
const groupVolume = await runtime.callService!({ domain: 'heos', service: 'group_volume_set', target: { entityId: 'media_player.living_room' }, data: { volume_level: 0.5 } });
|
|
|
|
expect(play.success).toBeTrue();
|
|
expect(volume.success).toBeTrue();
|
|
expect(source.success).toBeTrue();
|
|
expect(join.success).toBeTrue();
|
|
expect(groupVolume.success).toBeTrue();
|
|
expect(commands.map((commandArg) => commandArg.command)).toEqual([
|
|
'player/set_play_state',
|
|
'player/set_volume',
|
|
'browse/play_preset',
|
|
'group/set_group',
|
|
'group/set_volume',
|
|
]);
|
|
expect(commands[0].parameters).toEqual({ pid: 101, state: 'play' });
|
|
expect(commands[1].parameters).toEqual({ pid: 101, level: 35 });
|
|
expect(commands[2].parameters).toEqual({ pid: 101, preset: 1 });
|
|
expect(commands[3].parameters).toEqual({ pid: '101,102' });
|
|
expect(commands[4].parameters).toEqual({ gid: 201, level: 50 });
|
|
});
|
|
|
|
tap.test('does not report live command success for static snapshots without transport', async () => {
|
|
const runtime = await new HeosIntegration().setup({ snapshot }, {});
|
|
const result = await runtime.callService!({ domain: 'media_player', service: 'media_play', target: { entityId: 'media_player.living_room' } });
|
|
expect(result.success).toBeFalse();
|
|
expect(result.error?.includes('config.host or commandExecutor')).toBeTrue();
|
|
});
|
|
|
|
export default tap.start();
|