/
/
/
1"""Test Bandcamp converters."""
2
3from unittest.mock import Mock
4
5import pytest
6from bandcamp_async_api.models import BCAlbum, BCArtist, BCTrack
7
8from music_assistant.providers.bandcamp.converters import BandcampConverters
9
10
11@pytest.fixture
12def converters() -> BandcampConverters:
13 """Return a BandcampConverters instance."""
14 return BandcampConverters("bandcamp", "bandcamp_test")
15
16
17def test_track_from_search(converters: BandcampConverters) -> None:
18 """Test converting SearchResultTrack to MA Track."""
19 # Create a mock SearchResultTrack
20 search_result = Mock()
21 search_result.artist_id = 123
22 search_result.album_id = 456
23 search_result.id = 789
24 search_result.name = "Test Track"
25 search_result.artist_name = "Test Artist"
26 search_result.album_name = "Test Album"
27 search_result.url = "https://test.bandcamp.com/track/test-track"
28
29 result = converters.track_from_search(search_result)
30
31 assert result.item_id == "123-456-789"
32 assert result.name == "Test Track"
33 assert result.provider == "bandcamp_test"
34
35
36def test_album_from_search(converters: BandcampConverters) -> None:
37 """Test converting SearchResultAlbum to MA Album."""
38 # Create a mock SearchResultAlbum
39 search_result = Mock()
40 search_result.artist_id = 123
41 search_result.id = 456
42 search_result.name = "Test Album"
43 search_result.artist_name = "Test Artist"
44 search_result.image_url = "https://f4.bcbits.com/img/a1234567890_16.jpg"
45 search_result.url = "https://test.bandcamp.com/album/test-album"
46 search_result.artist_url = "https://test.bandcamp.com"
47
48 result = converters.album_from_search(search_result)
49
50 assert result.item_id == "123-456"
51 assert result.name == "Test Album"
52 assert result.provider == "bandcamp_test"
53
54
55def test_artist_from_search(converters: BandcampConverters) -> None:
56 """Test converting SearchResultArtist to MA Artist."""
57 # Create a mock SearchResultArtist
58 search_result = Mock()
59 search_result.id = 123
60 search_result.name = "Test Artist"
61 search_result.url = "https://test.bandcamp.com"
62 search_result.image_url = "https://f4.bcbits.com/img/a1234567890_16.jpg"
63 search_result.tags = ["rock", "indie"]
64
65 result = converters.artist_from_search(search_result)
66
67 assert result.item_id == "123"
68 assert result.name == "Test Artist"
69 assert result.provider == "bandcamp_test"
70
71
72def test_track_from_api(converters: BandcampConverters) -> None:
73 """Test converting API Track to MA Track."""
74 # Create mock API models
75 mock_artist = Mock()
76 mock_artist.id = 123
77 mock_artist.name = "Test Artist"
78 mock_artist.url = "https://test.bandcamp.com"
79
80 mock_track = Mock()
81 mock_track.id = 789
82 mock_track.title = "Test Track"
83 mock_track.artist = mock_artist
84 mock_track.url = "https://test.bandcamp.com/track/test-track"
85 mock_track.duration = 300
86 mock_track.lyrics = "Test lyrics"
87 mock_track.track_number = 1
88 mock_track.streaming_url = {"mp3-320": "https://example.com/track.mp3"}
89
90 result = converters.track_from_api(
91 track=mock_track,
92 album_id=456,
93 album_name="Test Album",
94 album_image_url="https://f4.bcbits.com/img/a1234567890_16.jpg",
95 )
96
97 assert result.item_id == "123-456-789"
98 assert result.name == "Test Track"
99 assert result.provider == "bandcamp_test"
100
101
102def test_artist_from_api(converters: BandcampConverters) -> None:
103 """Test converting API Artist to MA Artist."""
104 # Create mock API artist
105 mock_artist = Mock()
106 mock_artist.id = 123
107 mock_artist.name = "Test Artist"
108 mock_artist.url = "https://test.bandcamp.com"
109 mock_artist.image_url = "https://f4.bcbits.com/img/a1234567890_16.jpg"
110 mock_artist.bio = "Test bio"
111
112 result = converters.artist_from_api(mock_artist)
113
114 assert result.item_id == "123"
115 assert result.name == "Test Artist"
116 assert result.provider == "bandcamp_test"
117
118
119def test_album_from_api(converters: BandcampConverters) -> None:
120 """Test converting API Album to MA Album."""
121 # Create mock API models
122 mock_artist = Mock()
123 mock_artist.id = 123
124 mock_artist.name = "Test Artist"
125 mock_artist.url = "https://test.bandcamp.com"
126
127 mock_album = Mock()
128 mock_album.id = 456
129 mock_album.title = "Test Album"
130 mock_album.artist = mock_artist
131 mock_album.url = "https://test.bandcamp.com/album/test-album"
132 mock_album.art_url = "https://f4.bcbits.com/img/a1234567890_16.jpg"
133 mock_album.release_date = 1609459200
134 mock_album.about = "Test album description"
135
136 result = converters.album_from_api(mock_album)
137
138 assert result.item_id == "123-456"
139 assert result.name == "Test Album"
140 assert result.provider == "bandcamp_test"
141
142
143def test_track_from_api_without_album_info(converters: BandcampConverters) -> None:
144 """Test converting API Track without album info."""
145 # Create mock API models
146 mock_artist = BCArtist(id=123, name="Test Artist", url="https://test.bandcamp.com")
147 mock_track = BCTrack(
148 id=789,
149 title="Test Track",
150 artist=mock_artist,
151 url="https://test.bandcamp.com/track/test-track",
152 duration=300,
153 lyrics="Test lyrics",
154 track_number=1,
155 streaming_url={"mp3-320": "https://example.com/track.mp3"},
156 )
157
158 result = converters.track_from_api(track=mock_track)
159
160 assert result.item_id == "123-0-789"
161 assert result.album is None
162 assert result.metadata.lyrics == "Test lyrics"
163
164
165def test_track_from_api_with_album(converters: BandcampConverters) -> None:
166 """Test converting API Track with album information."""
167 # Create mock API models
168 mock_artist = BCArtist(id=123, name="Test Artist", url="https://test.bandcamp.com")
169 mock_album = BCAlbum(
170 id=456,
171 title="Test Album",
172 artist=mock_artist,
173 url="https://test.bandcamp.com/album/test-album",
174 art_url="https://f4.bcbits.com/img/a1234567890_16.jpg",
175 release_date=1609459200,
176 about="Test album description",
177 )
178 mock_track = BCTrack(
179 id=789,
180 title="Test Track",
181 artist=mock_artist,
182 album=mock_album,
183 url="https://test.bandcamp.com/track/test-track",
184 duration=300,
185 lyrics="Test lyrics",
186 track_number=1,
187 streaming_url={"mp3-320": "https://example.com/track.mp3"},
188 )
189
190 result = converters.track_from_api(track=mock_track)
191
192 assert result.item_id == "123-0-789"
193 assert result.album is not None
194 assert result.album.item_id == "123-456"
195 assert result.album.name == "Test Album"
196