80 lines
2.6 KiB
TypeScript
80 lines
2.6 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import { MpdMapper, type IMpdSnapshot } from '../../ts/integrations/mpd/index.js';
|
|
|
|
const snapshot: IMpdSnapshot = {
|
|
server: {
|
|
id: 'mpd-living-room',
|
|
host: '192.168.1.50',
|
|
port: 6600,
|
|
name: 'Living Room MPD',
|
|
protocolVersion: '0.24.0',
|
|
},
|
|
status: {
|
|
volume: '42',
|
|
repeat: '1',
|
|
single: '0',
|
|
random: '1',
|
|
playlist: '12',
|
|
playlistlength: '7',
|
|
state: 'play',
|
|
songid: '23',
|
|
elapsed: '31.2',
|
|
duration: '180.5',
|
|
audio: '44100:16:2',
|
|
bitrate: '320',
|
|
lastloadedplaylist: 'Favorites',
|
|
},
|
|
currentSong: {
|
|
file: 'artist/album/example.flac',
|
|
artist: ['Example Artist', 'Guest Artist'],
|
|
album: 'Example Album',
|
|
title: 'Example Track',
|
|
time: '180',
|
|
id: '23',
|
|
},
|
|
outputs: [{
|
|
outputid: 0,
|
|
outputname: 'Main ALSA',
|
|
plugin: 'alsa',
|
|
outputenabled: true,
|
|
attributes: { dop: '0' },
|
|
}, {
|
|
outputid: 1,
|
|
outputname: 'Headphones',
|
|
plugin: 'pulse',
|
|
outputenabled: false,
|
|
}],
|
|
commands: ['status', 'currentsong', 'play', 'pause', 'setvol', 'outputs'],
|
|
playlists: [{ playlist: 'Favorites' }, { playlist: 'Radio' }],
|
|
stats: { songs: '2000', uptime: '3600' },
|
|
online: true,
|
|
updatedAt: '2026-01-01T00:00:00.000Z',
|
|
source: 'manual',
|
|
};
|
|
|
|
tap.test('maps MPD server and outputs to canonical devices', async () => {
|
|
const devices = MpdMapper.toDevices(snapshot);
|
|
expect(devices.some((deviceArg) => deviceArg.id === 'mpd.server.mpd_living_room')).toBeTrue();
|
|
expect(devices.some((deviceArg) => deviceArg.id === 'mpd.output.mpd_living_room.0')).toBeTrue();
|
|
});
|
|
|
|
tap.test('maps MPD status current song and outputs to entities', async () => {
|
|
const entities = MpdMapper.toEntities(snapshot);
|
|
const player = entities.find((entityArg) => entityArg.id === 'media_player.living_room_mpd');
|
|
const status = entities.find((entityArg) => entityArg.id === 'sensor.living_room_mpd_mpd_status');
|
|
const output = entities.find((entityArg) => entityArg.id === 'switch.living_room_mpd_main_alsa_mpd_output');
|
|
|
|
expect(player?.platform).toEqual('media_player');
|
|
expect(player?.state).toEqual('playing');
|
|
expect(player?.attributes?.volumeLevel).toEqual(0.42);
|
|
expect(player?.attributes?.mediaTitle).toEqual('Example Track');
|
|
expect(player?.attributes?.mediaArtist).toEqual('Example Artist, Guest Artist');
|
|
expect(player?.attributes?.sourceList).toEqual(['Favorites', 'Radio']);
|
|
expect(status?.state).toEqual('play');
|
|
expect(output?.platform).toEqual('switch');
|
|
expect(output?.state).toEqual('on');
|
|
expect(output?.attributes?.mpdOutputId).toEqual(0);
|
|
});
|
|
|
|
export default tap.start();
|