Files
integrations/test/yamaha_musiccast/test.yamaha_musiccast.mapper.node.ts
T

107 lines
3.7 KiB
TypeScript
Raw Normal View History

import { expect, tap } from '@git.zone/tstest/tapbundle';
import { YamahaMusiccastMapper, type IYamahaMusiccastSnapshot } from '../../ts/integrations/yamaha_musiccast/index.js';
const snapshot: IYamahaMusiccastSnapshot = {
deviceInfo: {
model_name: 'RX-V685',
device_id: '4C1B86A6CBF5',
system_id: '03E88CF3',
serial_number: 'Y459229YO',
system_version: 1.96,
api_version: 2.11,
},
networkStatus: {
network_name: 'Living Room RX',
ip_address: '192.168.1.70',
mac_address: {
wired_lan: '4C1B86A6CBF5',
},
},
inputNames: {
hdmi1: 'Apple TV',
server: 'Media Server',
tuner: 'Tuner',
audio1: 'AUDIO1',
},
netusb: {
input: 'server',
playback: 'pause',
repeat: 'all',
shuffle: 'on',
artist: 'Artist One',
album: 'Album One',
track: 'Track One',
total_time: 240,
play_time: 12,
},
distribution: {
group_id: '00000000000000000000000000000000',
role: 'none',
},
zones: [{
zone: 'main',
name: 'Main Zone',
power: 'on',
available: true,
volume: 80,
minVolume: 0,
maxVolume: 160,
muted: false,
input: 'server',
inputList: ['hdmi1', 'server', 'tuner'],
soundProgram: 'straight',
soundProgramList: ['straight', '7ch_stereo'],
toneControl: { mode: 'manual', bass: 1, treble: -1 },
toneControlModeList: ['manual', 'auto', 'bypass'],
linkControl: 'standard',
linkControlList: ['speed', 'standard', 'stability'],
extraBass: true,
enhancer: false,
rangeStep: [
{ id: 'volume', min: 0, max: 160, step: 1 },
{ id: 'tone_control', min: -12, max: 12, step: 1 },
],
}, {
zone: 'zone2',
name: 'Patio',
power: 'standby',
available: true,
volumeLevel: 0.25,
muted: true,
input: 'audio1',
inputList: ['server', 'tuner', 'audio1'],
}],
};
tap.test('maps Yamaha MusicCast zones to canonical devices', async () => {
const devices = YamahaMusiccastMapper.toDevices(snapshot);
expect(devices.length).toEqual(2);
expect(devices[0].id).toEqual('yamaha_musiccast.player.03e88cf3');
expect(devices[0].manufacturer).toEqual('Yamaha Corporation');
expect(devices[0].state.some((stateArg) => stateArg.featureId === 'source' && stateArg.value === 'server')).toBeTrue();
expect(devices[0].state.some((stateArg) => stateArg.featureId === 'capability_extra_bass' && stateArg.value === true)).toBeTrue();
expect(devices[1].metadata?.viaDeviceId).toEqual('yamaha_musiccast.player.03e88cf3');
});
tap.test('maps Yamaha MusicCast zones to media, switch, select, and number entities', async () => {
const entities = YamahaMusiccastMapper.toEntities(snapshot);
const media = entities.find((entityArg) => entityArg.id === 'media_player.living_room_rx');
const zone2 = entities.find((entityArg) => entityArg.id === 'media_player.living_room_rx_zone2');
const extraBass = entities.find((entityArg) => entityArg.id === 'switch.living_room_rx_extra_bass');
const linkControl = entities.find((entityArg) => entityArg.id === 'select.living_room_rx_link_control');
const toneBass = entities.find((entityArg) => entityArg.id === 'number.living_room_rx_tone_control_bass');
expect(media?.state).toEqual('paused');
expect(media?.attributes?.volumeLevel).toEqual(0.5);
expect(media?.attributes?.source).toEqual('Media Server');
expect(media?.attributes?.mediaTitle).toEqual('Track One');
expect(zone2?.state).toEqual('off');
expect(extraBass?.state).toEqual(true);
expect(extraBass?.attributes?.capabilityId).toEqual('extra_bass');
expect(linkControl?.state).toEqual('standard');
expect(toneBass?.state).toEqual(1);
expect(toneBass?.attributes?.nativeMinValue).toEqual(-12);
});
export default tap.start();