/
/
/
1"""Test we can parse Tidal models into Music Assistant models."""
2
3import json
4import pathlib
5from unittest.mock import Mock
6
7import pytest
8from music_assistant_models.enums import MediaType
9from music_assistant_models.media_items import ItemMapping
10from syrupy.assertion import SnapshotAssertion
11
12from music_assistant.providers.tidal.parsers import (
13 parse_album,
14 parse_artist,
15 parse_playlist,
16 parse_track,
17)
18
19FIXTURES_DIR = pathlib.Path(__file__).parent / "fixtures"
20ARTIST_FIXTURES = list(FIXTURES_DIR.glob("artists/*.json"))
21ALBUM_FIXTURES = list(FIXTURES_DIR.glob("albums/*.json"))
22TRACK_FIXTURES = list(FIXTURES_DIR.glob("tracks/*.json"))
23PLAYLIST_FIXTURES = list(FIXTURES_DIR.glob("playlists/*.json"))
24
25
26@pytest.fixture
27def provider_mock() -> Mock:
28 """Return a mock provider."""
29 provider = Mock()
30 provider.domain = "tidal"
31 provider.instance_id = "tidal_instance"
32 provider.auth.user_id = "12345"
33 provider.auth.user.profile_name = "Test User"
34 provider.auth.user.user_name = "Test User"
35
36 def get_item_mapping(media_type: MediaType, key: str, name: str) -> ItemMapping:
37 return ItemMapping(
38 media_type=media_type,
39 item_id=key,
40 provider=provider.instance_id,
41 name=name,
42 )
43
44 provider.get_item_mapping.side_effect = get_item_mapping
45
46 return provider
47
48
49@pytest.mark.parametrize("example", ARTIST_FIXTURES, ids=lambda val: str(val.stem))
50def test_parse_artist(
51 example: pathlib.Path, provider_mock: Mock, snapshot: SnapshotAssertion
52) -> None:
53 """Test we can parse artists."""
54 with open(example) as f:
55 data = json.load(f)
56 parsed = parse_artist(provider_mock, data).to_dict()
57 assert snapshot == parsed
58
59
60@pytest.mark.parametrize("example", ALBUM_FIXTURES, ids=lambda val: str(val.stem))
61def test_parse_album(
62 example: pathlib.Path, provider_mock: Mock, snapshot: SnapshotAssertion
63) -> None:
64 """Test we can parse albums."""
65 with open(example) as f:
66 data = json.load(f)
67 parsed = parse_album(provider_mock, data).to_dict()
68 assert snapshot == parsed
69
70
71@pytest.mark.parametrize("example", TRACK_FIXTURES, ids=lambda val: str(val.stem))
72def test_parse_track(
73 example: pathlib.Path, provider_mock: Mock, snapshot: SnapshotAssertion
74) -> None:
75 """Test we can parse tracks."""
76 with open(example) as f:
77 data = json.load(f)
78 parsed = parse_track(provider_mock, data).to_dict()
79 assert snapshot == parsed
80
81
82@pytest.mark.parametrize("example", PLAYLIST_FIXTURES, ids=lambda val: str(val.stem))
83def test_parse_playlist(
84 example: pathlib.Path, provider_mock: Mock, snapshot: SnapshotAssertion
85) -> None:
86 """Test we can parse playlists."""
87 with open(example) as f:
88 data = json.load(f)
89
90 is_mix = "mix" in example.name
91 parsed = parse_playlist(provider_mock, data, is_mix=is_mix).to_dict()
92 assert snapshot == parsed
93