/
/
/
1"""Tests for parsing YTM podcasts from browse/search results."""
2
3from unittest.mock import MagicMock
4
5from music_assistant_models.media_items import Podcast
6
7from music_assistant.providers.ytmusic import YoutubeMusicProvider
8
9
10def _make_provider() -> MagicMock:
11 """Create a mock YoutubeMusicProvider with the fields used by the parsers."""
12 prov = MagicMock()
13 prov.instance_id = "ytmusic_test"
14 prov.domain = "ytmusic"
15 prov._parse_thumbnails = MagicMock(return_value=[])
16 prov._parse_podcast = lambda obj: YoutubeMusicProvider._parse_podcast(prov, obj)
17 return prov
18
19
20def test_browse_podcast_with_mpsp_browse_id_is_parsed() -> None:
21 """A home/search item with an MPSP browseId must parse into a Podcast."""
22 prov = _make_provider()
23 item = {
24 "title": "Couple Of",
25 "browseId": "MPSPPLtest123",
26 "podcastId": None,
27 "channel": {"id": "UC123", "name": "Some Channel"},
28 }
29
30 podcast = YoutubeMusicProvider._parse_browse_podcast(prov, item)
31
32 assert isinstance(podcast, Podcast)
33 assert podcast.item_id == "PLtest123"
34 assert podcast.name == "Couple Of"
35 assert podcast.publisher == "Some Channel"
36
37
38def test_browse_podcast_prefers_explicit_podcast_id() -> None:
39 """The item's podcastId must be preferred over the derived browseId."""
40 prov = _make_provider()
41 item = {
42 "title": "Couple Of",
43 "browseId": "MPSPPLtest123",
44 "podcastId": "PLexplicit456",
45 }
46
47 podcast = YoutubeMusicProvider._parse_browse_podcast(prov, item)
48
49 assert isinstance(podcast, Podcast)
50 assert podcast.item_id == "PLexplicit456"
51
52
53def test_browse_album_is_not_parsed_as_podcast() -> None:
54 """An album item (MPRE browseId) must not be parsed as a podcast."""
55 prov = _make_provider()
56 item = {"title": "Some Album", "browseId": "MPREb_test123"}
57
58 assert YoutubeMusicProvider._parse_browse_podcast(prov, item) is None
59
60
61def test_browse_item_without_browse_id_is_not_parsed_as_podcast() -> None:
62 """An item without browseId must not be parsed as a podcast."""
63 prov = _make_provider()
64
65 assert YoutubeMusicProvider._parse_browse_podcast(prov, {"title": "X"}) is None
66