/
/
/
1"""Test YouTube Music album track parsing."""
2
3from typing import Any, cast
4from unittest.mock import AsyncMock, MagicMock, patch
5
6import pytest
7
8from music_assistant.providers.ytmusic import YoutubeMusicProvider
9
10
11@pytest.fixture
12def provider() -> YoutubeMusicProvider:
13 """Return a YoutubeMusicProvider instance with mocked dependencies."""
14 mass = AsyncMock()
15 manifest = MagicMock()
16 manifest.domain = "ytmusic"
17 config = MagicMock()
18 config.get_value.return_value = "GLOBAL"
19 prov = YoutubeMusicProvider(mass, manifest, config)
20 prov._headers = {}
21 prov._yt_user = None
22 prov.language = "en"
23 return prov
24
25
26def _album_obj() -> dict[str, Any]:
27 """Return an album response holding one track without a resolvable artist id."""
28 return {
29 "title": "All Stand Together",
30 "artists": [{"id": "UC824jbNWWDR-NBv8wuE-OUg", "name": "Lost Frequencies"}],
31 "tracks": [
32 {
33 "videoId": "video1",
34 "title": "Collaboration Track",
35 "isAvailable": True,
36 "artists": [{"id": None, "name": "Lost Frequencies & Zak Abel"}],
37 },
38 {
39 "videoId": "video2",
40 "title": "Solo Track",
41 "isAvailable": True,
42 "artists": [{"id": "UC824jbNWWDR-NBv8wuE-OUg", "name": "Lost Frequencies"}],
43 },
44 ],
45 }
46
47
48async def test_album_tracks_fall_back_to_album_artist(provider: YoutubeMusicProvider) -> None:
49 """
50 An album track whose artists carry no id is kept, credited to the album artist.
51
52 YTM returns no artist id for some album tracks, which used to drop them from the
53 album listing entirely.
54 """
55 with patch("music_assistant.providers.ytmusic.get_album", AsyncMock(return_value=_album_obj())):
56 # call the undecorated function so the @use_cache wrapper stays out of the test
57 get_album_tracks = cast("Any", YoutubeMusicProvider.get_album_tracks).__wrapped__
58 tracks = await get_album_tracks(provider, "album1")
59
60 assert [track.item_id for track in tracks] == ["video1", "video2"]
61 assert [artist.item_id for artist in tracks[0].artists] == ["UC824jbNWWDR-NBv8wuE-OUg"]
62