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

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();