Skip to content

Commit

Permalink
Add new test cases for Artist; ensure id is set when we are using it
Browse files Browse the repository at this point in the history
  • Loading branch information
es3n1n committed Jan 17, 2025
1 parent 596ca60 commit 04cae3b
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 11 deletions.
19 changes: 16 additions & 3 deletions tests/test_artist.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import pytest

from yandex_music import Artist


Expand Down Expand Up @@ -70,10 +72,14 @@ def test_de_list_none(self, client):
assert Artist.de_list([], client) == []

def test_de_json_required(self, client, cover):
json_dict = {'id': self.id}
artist = Artist.de_json(json_dict, client)
# We don't have any required fields anymore,
# so just make sure we don't throw any errors.
Artist.de_json({}, client)

assert artist.id == self.id
def test_de_json_ugc(self, client):
# An example of UGC artist from #663
artist = Artist.de_json({'name': self.name}, client)
assert artist.name == self.name

def test_de_json_all(
self, client, cover, counts, ratings, link, track_without_artists, description, artist_decomposed
Expand Down Expand Up @@ -154,3 +160,10 @@ def test_equality(self, cover):
assert a is not b

assert a == c

def test_id_required(self, client):
artist = Artist.de_json({'name': self.name}, client)

# Make sure we throw an error if we try to access the id_required property when id is None
with pytest.raises(ValueError):
_ = artist.id_required
32 changes: 24 additions & 8 deletions yandex_music/artist/artist.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,22 @@ class Artist(YandexMusicModel):
def __post_init__(self) -> None:
self._id_attrs = (self.id, self.name, self.cover)

@property
def id_required(self) -> int:
"""Возвращает ID исполнителя, удостоверяясь, что он указан.
Raises:
ValueError: Если ID исполнителя не установлен.
Returns:
:obj:`int`: Уникальный идентификатор исполнителя.
"""
if self.id is None:
msg = 'Artist.id is required'
raise ValueError(msg)

return self.id

def get_op_image_url(self, size: str = '200x200') -> str:
"""Возвращает URL OP обложки.
Expand Down Expand Up @@ -222,39 +238,39 @@ def like(self, *args: Any, **kwargs: Any) -> bool:
client.users_likes_artists_add(artist.id, user.id *args, **kwargs)
"""
assert self.valid_client(self.client)
return self.client.users_likes_artists_add(self.id, self.client.account_uid, *args, **kwargs)
return self.client.users_likes_artists_add(self.id_required, self.client.account_uid, *args, **kwargs)

async def like_async(self, *args: Any, **kwargs: Any) -> bool:
"""Сокращение для::
await client.users_likes_artists_add(artist.id, user.id *args, **kwargs)
"""
assert self.valid_async_client(self.client)
return await self.client.users_likes_artists_add(self.id, self.client.account_uid, *args, **kwargs)
return await self.client.users_likes_artists_add(self.id_required, self.client.account_uid, *args, **kwargs)

def dislike(self, *args: Any, **kwargs: Any) -> bool:
"""Сокращение для::
client.users_likes_artists_remove(artist.id, user.id *args, **kwargs)
"""
assert self.valid_client(self.client)
return self.client.users_likes_artists_remove(self.id, self.client.account_uid, *args, **kwargs)
return self.client.users_likes_artists_remove(self.id_required, self.client.account_uid, *args, **kwargs)

async def dislike_async(self, *args: Any, **kwargs: Any) -> bool:
"""Сокращение для::
await client.users_likes_artists_remove(artist.id, user.id *args, **kwargs)
"""
assert self.valid_async_client(self.client)
return await self.client.users_likes_artists_remove(self.id, self.client.account_uid, *args, **kwargs)
return await self.client.users_likes_artists_remove(self.id_required, self.client.account_uid, *args, **kwargs)

def get_tracks(self, page: int = 0, page_size: int = 20, *args: Any, **kwargs: Any) -> Optional['ArtistTracks']:
"""Сокращение для::
client.artists_tracks(artist.id, page, page_size, *args, **kwargs)
"""
assert self.valid_client(self.client)
return self.client.artists_tracks(self.id, page, page_size, *args, **kwargs)
return self.client.artists_tracks(self.id_required, page, page_size, *args, **kwargs)

async def get_tracks_async(
self, page: int = 0, page_size: int = 20, *args: Any, **kwargs: Any
Expand All @@ -264,7 +280,7 @@ async def get_tracks_async(
await client.artists_tracks(artist.id, page, page_size, *args, **kwargs)
"""
assert self.valid_async_client(self.client)
return await self.client.artists_tracks(self.id, page, page_size, *args, **kwargs)
return await self.client.artists_tracks(self.id_required, page, page_size, *args, **kwargs)

def get_albums(
self, page: int = 0, page_size: int = 20, sort_by: str = 'year', *args: Any, **kwargs: Any
Expand All @@ -274,7 +290,7 @@ def get_albums(
client.artists_direct_albums(artist.id, page, page_size, sort_by, *args, **kwargs)
"""
assert self.valid_client(self.client)
return self.client.artists_direct_albums(self.id, page, page_size, sort_by, *args, **kwargs)
return self.client.artists_direct_albums(self.id_required, page, page_size, sort_by, *args, **kwargs)

async def get_albums_async(
self, page: int = 0, page_size: int = 20, sort_by: str = 'year', *args: Any, **kwargs: Any
Expand All @@ -284,7 +300,7 @@ async def get_albums_async(
await client.artists_direct_albums(artist.id, page, page_size, sort_by, *args, **kwargs)
"""
assert self.valid_async_client(self.client)
return await self.client.artists_direct_albums(self.id, page, page_size, sort_by, *args, **kwargs)
return await self.client.artists_direct_albums(self.id_required, page, page_size, sort_by, *args, **kwargs)

@classmethod
def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Artist']:
Expand Down

0 comments on commit 04cae3b

Please sign in to comment.