/
/
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 return provider
22
23
24def test_map_track_to_msx() -> None:
25 """Test mapping a track to MSX item."""
26 prov = _mock_provider()
27 track = MagicMock(spec=Track)
28 track.name = "Test Track"
29 track.uri = "library://track/1"
30 track.duration = 125
31 track.artist_str = "Test Artist"
32 track.image = "some_image"
33
34 item = map_track_to_msx(
35 track=track,
36 prefix="http://localhost",
37 player_id="msx_123",
38 provider=prov,
39 device_param="device_id=abc",
40 )
41
42 assert item.title_header == "{txt:msx-white:Test Track}"
43 assert item.title_footer == "Test Artist · 2:05"
44 assert item.image == "http://image.url"
45 assert item.action is not None
46 assert "audio:http://localhost/msx/audio/msx_123" in item.action
47 assert "uri=library%3A%2F%2Ftrack%2F1" in item.action
48 assert "device_id=abc" in item.action
49
50
51@pytest.mark.asyncio
52async def test_map_album_to_msx() -> None:
53 """Test mapping an album to MSX item."""
54 prov = _mock_provider()
55 album = MagicMock(spec=Album)
56 album.name = "Test Album"
57 album.item_id = "1"
58 album.provider = "library"
59 album.artist_str = "Test Artist"
60 album.image = "album_image"
61
62 item = await map_album_to_msx(
63 album=album,
64 prefix="http://localhost",
65 provider=prov,
66 device_param="device_id=abc",
67 )
68
69 assert item.title == "Test Album"
70 # Mock has no year attribute set, so footer is "Artist · year" only if year exists
71 assert "Test Artist" in (item.title_footer or "")
72 assert item.image == "http://image.url"
73 assert (
74 item.action
75 == "content:http://localhost/msx/albums/1/tracks.json?provider=library&device_id=abc"
76 )
77