105 lines
3.3 KiB
TypeScript
105 lines
3.3 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import { HeosMapper, type IHeosSnapshot } from '../../ts/integrations/heos/index.js';
|
|
|
|
const snapshot: IHeosSnapshot = {
|
|
system: {
|
|
host: '192.168.1.80',
|
|
currentHost: '192.168.1.80',
|
|
signedInUsername: 'listener@example.com',
|
|
isSignedIn: true,
|
|
},
|
|
players: [{
|
|
name: 'Living Room',
|
|
playerId: 101,
|
|
model: 'Denon HEOS 7',
|
|
serial: 'LR123',
|
|
version: '3.40.0',
|
|
ipAddress: '192.168.1.80',
|
|
network: 'wired',
|
|
state: 'play',
|
|
volume: 45,
|
|
muted: false,
|
|
repeat: 'on_all',
|
|
shuffle: true,
|
|
groupId: 201,
|
|
available: true,
|
|
nowPlayingMedia: {
|
|
type: 'station',
|
|
station: 'Jazz Radio',
|
|
albumId: 'fav-jazz',
|
|
mediaId: 'station-1',
|
|
sourceId: 3,
|
|
duration: 180000,
|
|
currentPosition: 30000,
|
|
supportedControls: ['play', 'pause', 'stop'],
|
|
},
|
|
}, {
|
|
name: 'Kitchen',
|
|
playerId: 102,
|
|
model: 'Denon HEOS 5',
|
|
serial: 'KT456',
|
|
version: '3.40.0',
|
|
ipAddress: '192.168.1.81',
|
|
network: 'wifi',
|
|
state: 'pause',
|
|
volume: 25,
|
|
muted: true,
|
|
groupId: 201,
|
|
available: true,
|
|
nowPlayingMedia: {
|
|
type: 'station',
|
|
station: 'HDMI ARC',
|
|
mediaId: 'inputs/hdmi_arc_1',
|
|
sourceId: 1027,
|
|
},
|
|
}],
|
|
groups: [{
|
|
name: 'Living Room + Kitchen',
|
|
groupId: 201,
|
|
leadPlayerId: 101,
|
|
memberPlayerIds: [102],
|
|
volume: 40,
|
|
muted: false,
|
|
}],
|
|
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('maps HEOS players and system snapshot to devices', async () => {
|
|
const devices = HeosMapper.toDevices(snapshot);
|
|
expect(devices.some((deviceArg) => deviceArg.id === 'heos.system.192_168_1_80')).toBeTrue();
|
|
const player = devices.find((deviceArg) => deviceArg.id === 'heos.player.101');
|
|
expect(player?.manufacturer).toEqual('Denon');
|
|
expect(player?.state.some((stateArg) => stateArg.featureId === 'source' && stateArg.value === 'Jazz Radio')).toBeTrue();
|
|
});
|
|
|
|
tap.test('maps HEOS players groups sources and media entities', async () => {
|
|
const entities = HeosMapper.toEntities(snapshot);
|
|
const player = entities.find((entityArg) => entityArg.id === 'media_player.living_room');
|
|
const kitchen = entities.find((entityArg) => entityArg.id === 'media_player.kitchen');
|
|
const sources = entities.find((entityArg) => entityArg.id === 'sensor.heos_system_sources');
|
|
const groups = entities.find((entityArg) => entityArg.id === 'sensor.heos_system_groups');
|
|
const media = entities.find((entityArg) => entityArg.id === 'sensor.living_room_heos_media');
|
|
|
|
expect(player?.state).toEqual('playing');
|
|
expect(player?.attributes?.volumeLevel).toEqual(0.45);
|
|
expect(player?.attributes?.source).toEqual('Jazz Radio');
|
|
expect(player?.attributes?.groupMembers).toEqual(['media_player.living_room', 'media_player.kitchen']);
|
|
expect(player?.attributes?.mediaDuration).toEqual(180);
|
|
expect(player?.attributes?.mediaPosition).toEqual(30);
|
|
expect(kitchen?.attributes?.source).toEqual('HDMI ARC');
|
|
expect(sources?.state).toEqual(2);
|
|
expect(groups?.state).toEqual(1);
|
|
expect(media?.state).toEqual('Jazz Radio');
|
|
});
|
|
|
|
export default tap.start();
|