/
/
/
1"""Tests for MSX mappers."""
2
3from __future__ import annotations
4
5from unittest.mock import MagicMock
6
7import pytest
8from music_assistant_models.media_items import Album, Track
9
10from music_assistant.providers.msx_bridge.mappers import (
11 map_album_to_msx,
12 map_track_to_msx,
13)
14from music_assistant.providers.msx_bridge.provider import MSXBridgeProvider
15
16
17def _mock_provider() -> MSXBridgeProvider:
18 """Create a mock provider."""
19 provider = MagicMock()
20 provider.mass.metadata.get_image_url.return_value = "http://image.url"
21 provider.get_stream_token.return_value = "tok123"
22 return provider
23
24
25def test_map_track_to_msx() -> None:
26 """Test mapping a track to MSX item."""
27 prov = _mock_provider()
28 track = MagicMock(spec=Track)
29 track.name = "Test Track"
30 track.uri = "library://track/1"
31 track.duration = 125
32 track.artist_str = "Test Artist"
33 track.image = "some_image"
34
35 item = map_track_to_msx(
36 track=track,
37 prefix="http://localhost",
38 player_id="msx_123",
39 provider=prov,
40 device_param="device_id=abc",
41 )
42
43 assert item.title_header == "{txt:msx-white:Test Track}"
44 assert item.title_footer == "Test Artist · 2:05"
45 assert item.image == "http://image.url"
46 assert item.action is not None
47 assert "audio:http://localhost/msx/audio/msx_123" in item.action
48 assert "uri=library%3A%2F%2Ftrack%2F1" in item.action
49 assert "token=tok123" in item.action
50 assert "device_id=abc" in item.action
51
52
53@pytest.mark.asyncio
54async def test_map_album_to_msx() -> None:
55 """Test mapping an album to MSX item."""
56 prov = _mock_provider()
57 album = MagicMock(spec=Album)
58 album.name = "Test Album"
59 album.item_id = "1"
60 album.provider = "library"
61 album.artist_str = "Test Artist"
62 album.image = "album_image"
63
64 item = await map_album_to_msx(
65 album=album,
66 prefix="http://localhost",
67 provider=prov,
68 device_param="device_id=abc",
69 )
70
71 assert item.title == "Test Album"
72 # Mock has no year attribute set, so footer is "Artist · year" only if year exists
73 assert "Test Artist" in (item.title_footer or "")
74 assert item.image == "http://image.url"
75 assert (
76 item.action
77 == "content:http://localhost/msx/albums/1/tracks.json?provider=library&device_id=abc"
78 )
79