diff --git a/tests/conftest.py b/tests/conftest.py index 1269ed3..4658d37 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -108,13 +108,16 @@ def album_without_tracks(album_factory, artist_without_tracks): @pytest.fixture(scope='session') def playlist_factory(user, cover, made_for, track_short, play_counter, playlist_absence): class PlaylistFactory: - def get(self): + def get(self, similar_playlists, last_owner_playlists): return Playlist(user, cover, made_for, play_counter, playlist_absence, TestPlaylist.uid, TestPlaylist.kind, TestPlaylist.title, TestPlaylist.track_count, TestPlaylist.tags, TestPlaylist.revision, TestPlaylist.snapshot, TestPlaylist.visibility, TestPlaylist.collective, - TestPlaylist.created, TestPlaylist.modified, TestPlaylist.available, TestPlaylist.is_banner, - TestPlaylist.is_premiere, TestPlaylist.duration_ms, TestPlaylist.og_image, [track_short], - TestPlaylist.prerolls, TestPlaylist.likes_count, TestPlaylist.generated_playlist_type, + TestPlaylist.url_part, TestPlaylist.created, TestPlaylist.modified, + TestPlaylist.available, TestPlaylist.is_banner, TestPlaylist.is_premiere, + TestPlaylist.duration_ms, TestPlaylist.og_image, TestPlaylist.og_title, + TestPlaylist.image, cover, TestPlaylist.background_color, TestPlaylist.text_color, + TestPlaylist.id_for_from, [track_short], TestPlaylist.prerolls, TestPlaylist.likes_count, + similar_playlists, last_owner_playlists, TestPlaylist.generated_playlist_type, TestPlaylist.animated_cover_uri, TestPlaylist.ever_played, TestPlaylist.description, TestPlaylist.description_formatted, TestPlaylist.is_for_from, TestPlaylist.regions) @@ -122,8 +125,13 @@ def playlist_factory(user, cover, made_for, track_short, play_counter, playlist_ @pytest.fixture(scope='session') -def playlist(playlist_factory): - return playlist_factory.get() +def playlist(playlist_factory, playlist_without_nested_playlists): + return playlist_factory.get([playlist_without_nested_playlists], [playlist_without_nested_playlists]) + + +@pytest.fixture(scope='session') +def playlist_without_nested_playlists(playlist_factory): + return playlist_factory.get([], []) @pytest.fixture(scope='session') diff --git a/tests/test_playlist.py b/tests/test_playlist.py index 1887ed6..5222cd4 100644 --- a/tests/test_playlist.py +++ b/tests/test_playlist.py @@ -11,6 +11,7 @@ class TestPlaylist: snapshot = 1 visibility = 'public' collective = False + url_part = 'daily' created = '2018-04-29T21:00:00+00:00' modified = '2019-11-09T03:00:00+00:00' available = True @@ -18,6 +19,11 @@ class TestPlaylist: is_premiere = False duration_ms = 12402690 og_image = 'avatars.yandex.net/get-music-user-playlist/38125/q0ahkhfQE3neTk/%%?1572609906461' + og_title = 'Плейлист дня' + image = '' + background_color = '' + text_color = '' + id_for_from = 'playlist_of_the_day' prerolls = [] likes_count = 1 generated_playlist_type = 'playlistOfTheDay' @@ -28,7 +34,8 @@ class TestPlaylist: is_for_from = None regions = None - def test_expected_values(self, playlist, user, cover, made_for, track_short, play_counter, playlist_absence): + def test_expected_values(self, playlist, user, cover, made_for, track_short, play_counter, playlist_absence, + playlist_without_nested_playlists): assert playlist.owner == user assert playlist.uid == self.uid assert playlist.kind == self.kind @@ -43,6 +50,7 @@ class TestPlaylist: assert playlist.snapshot == self.snapshot assert playlist.visibility == self.visibility assert playlist.collective == self.collective + assert playlist.url_part == self.url_part assert playlist.created == self.created assert playlist.modified == self.modified assert playlist.available == self.available @@ -50,9 +58,17 @@ class TestPlaylist: assert playlist.is_premiere == self.is_premiere assert playlist.duration_ms == self.duration_ms assert playlist.og_image == self.og_image + assert playlist.og_title == self.og_title + assert playlist.image == self.image + assert playlist.cover_without_text == cover + assert playlist.background_color == self.background_color + assert playlist.text_color == self.text_color + assert playlist.id_for_from == self.id_for_from assert playlist.tracks == [track_short] assert playlist.prerolls == self.prerolls assert playlist.likes_count == self.likes_count + assert playlist.similar_playlists == [playlist_without_nested_playlists] + assert playlist.last_owner_playlists == [playlist_without_nested_playlists] assert playlist.generated_playlist_type == self.generated_playlist_type assert playlist.animated_cover_uri == self.animated_cover_uri assert playlist.ever_played == self.ever_played @@ -68,21 +84,18 @@ class TestPlaylist: assert Playlist.de_list({}, client) == [] def test_de_json_required(self, client, user, cover, made_for, play_counter, playlist_absence): - json_dict = {'owner': user.to_dict(), 'uid': self.uid, 'kind': self.kind, 'title': self.title, - 'track_count': self.track_count, 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), + json_dict = {'owner': user.to_dict(), 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), 'play_counter': play_counter.to_dict(), 'playlist_absence': playlist_absence.to_dict()} playlist = Playlist.de_json(json_dict, client) assert playlist.owner == user - assert playlist.uid == self.uid - assert playlist.kind == self.kind - assert playlist.title == self.title - assert playlist.track_count == self.track_count assert playlist.cover == cover assert playlist.made_for == made_for assert playlist.play_counter == play_counter + assert playlist.playlist_absence == playlist_absence - def test_de_json_all(self, client, user, cover, made_for, track_short, play_counter, playlist_absence): + def test_de_json_all(self, client, user, cover, made_for, track_short, play_counter, playlist_absence, + playlist_without_nested_playlists): json_dict = {'owner': user.to_dict(), 'uid': self.uid, 'kind': self.kind, 'title': self.title, 'track_count': self.track_count, 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), 'play_counter': play_counter.to_dict(), 'playlist_absence': playlist_absence.to_dict(), @@ -91,10 +104,14 @@ class TestPlaylist: 'modified': self.modified, 'available': self.available, 'is_banner': self.is_banner, 'is_premiere': self.is_premiere, 'duration_ms': self.duration_ms, 'og_image': self.og_image, 'tracks': [track_short.to_dict()], 'prerolls': self.prerolls, 'likes_count': self.likes_count, - 'generated_playlist_type': self.generated_playlist_type, + 'generated_playlist_type': self.generated_playlist_type, 'url_part': self.url_part, 'animated_cover_uri': self.animated_cover_uri, 'ever_played': self.ever_played, 'description': self.description, 'description_formatted': self.description_formatted, - 'is_for_from': self.is_for_from, 'regions': self.regions} + 'is_for_from': self.is_for_from, 'regions': self.regions, 'og_title': self.og_title, + 'image': self.image, 'id_for_from': self.id_for_from, 'background_color': self.background_color, + 'text_color': self.text_color, 'cover_without_text': cover.to_dict(), + 'similar_playlists': [playlist_without_nested_playlists.to_dict()], + 'last_owner_playlists': [playlist_without_nested_playlists.to_dict()]} playlist = Playlist.de_json(json_dict, client) assert playlist.owner == user @@ -111,6 +128,7 @@ class TestPlaylist: assert playlist.snapshot == self.snapshot assert playlist.visibility == self.visibility assert playlist.collective == self.collective + assert playlist.url_part == self.url_part assert playlist.created == self.created assert playlist.modified == self.modified assert playlist.available == self.available @@ -118,9 +136,17 @@ class TestPlaylist: assert playlist.is_premiere == self.is_premiere assert playlist.duration_ms == self.duration_ms assert playlist.og_image == self.og_image + assert playlist.og_title == self.og_title + assert playlist.image == self.image + assert playlist.cover_without_text == cover + assert playlist.background_color == self.background_color + assert playlist.text_color == self.text_color + assert playlist.id_for_from == self.id_for_from assert playlist.tracks == [track_short] assert playlist.prerolls == self.prerolls assert playlist.likes_count == self.likes_count + assert playlist.similar_playlists == [playlist_without_nested_playlists] + assert playlist.last_owner_playlists == [playlist_without_nested_playlists] assert playlist.generated_playlist_type == self.generated_playlist_type assert playlist.animated_cover_uri == self.animated_cover_uri assert playlist.ever_played == self.ever_played diff --git a/yandex_music/playlist/playlist.py b/yandex_music/playlist/playlist.py index 3eed27a..4cb0c73 100644 --- a/yandex_music/playlist/playlist.py +++ b/yandex_music/playlist/playlist.py @@ -21,7 +21,7 @@ class Playlist(YandexMusicObject): cover (:obj:`yandex_music.Cover`): Обложка альбома. made_for (:obj:`yandex_music.MadeFor`): Пользователь для которого был создан плейлист. Присутствует только у персональных плейлистов. - play_counter (:obj:`yandex_music.PlayCounter`): Счетчик дней. Присутствует только у плейлиста дня. + play_counter (:obj:`yandex_music.PlayCounter`): Счётчик дней. Присутствует только у плейлиста дня. playlist_absence (:obj:`yandex_music.PlaylistAbsence`): Причина отсутствия плейлиста. uid (:obj:`int`): Идентификатор владельца плейлиста. kind (:obj:`int`): Идентификатор плейлиста. @@ -32,6 +32,7 @@ class Playlist(YandexMusicObject): snapshot (:obj:`int`): Версия плейлиста. Увеличивается на 1 при каждом изменении. visibility (:obj:`str`): Видимость плейлиста. collective (:obj:`bool`): Есть ли у плейлиста соавторы. + url_part (:obj:`str`): Часть ссылки на плейлист ('daily`). created (:obj:`str`): Дата создания в формате ISO 8601. modified (:obj:`str`): Дата последнего изменения в формате ISO 8601. available (:obj:`bool`): Доступен TODO. @@ -39,9 +40,17 @@ class Playlist(YandexMusicObject): is_premiere (:obj:`bool`): Является ли премьерой TODO. duration_ms (:obj:`int`): Длительность в миллисекундах. og_image (:obj:`str`): Ссылка на превью Open Graph. + og_title (:obj:`str`): Заголовок Open Graph. + image (:obj:`str`): Изображение TODO. + cover_without_text (:obj:`yandex_music.Cover`): Обложка без текста. + background_color (:obj:`str`): Цвет заднего фона TODO. + text_color (:obj:`str`): Цвет текста TODO. + id_for_from (:obj:`str`): Откуда пришло событие (уникальный идентификатор объекта) TODO. tracks (:obj:`list` из :obj:`yandex_music.TrackShort`): Список треков. prerolls (:obj:`list`): Прерол, проигрываемый перед плейлистом. Присутствует только у персональных плейлистов. likes_count (:obj:`int`): Количество лайков. + similar_playlists (:obj:`list` из :obj:`yandex_music.Playlist`): Похожие плейлисты. + last_owner_playlists (:obj:`list` из :obj:`yandex_music.Playlist`): Последние плейлисты владельца. generated_playlist_type (:obj:`str`): Тип генерируемого плейлиста. animated_cover_uri (:obj:`str`): Ссылка на анимированную обложку. ever_played (:obj:`str`): Играл ли этот плейлист. Присутствует только у персональных плейлистов. TODO @@ -54,9 +63,9 @@ class Playlist(YandexMusicObject): Args: owner (:obj:`yandex_music.User`, optional): Владелец плейлиста. cover (:obj:`yandex_music.Cover`, optional): Обложка альбома. - made_for (:obj:`yandex_music.MadeFor`, optional): Пользователь для которого был создан плейлист. Присутствует только у - персональных плейлистов. - play_counter (:obj:`yandex_music.PlayCounter`, optional): Счетчик дней. Присутствует только у плейлиста дня. + made_for (:obj:`yandex_music.MadeFor`, optional): Пользователь для которого был создан плейлист. Присутствует + только у персональных плейлистов. + play_counter (:obj:`yandex_music.PlayCounter`, optional): Счётчик дней. Присутствует только у плейлиста дня. playlist_absence (:obj:`yandex_music.PlaylistAbsence`, optional): Причина отсутствия плейлиста. uid (:obj:`int`, optional): Идентификатор владельца плейлиста. kind (:obj:`int`, optional): Идентификатор плейлиста. @@ -67,6 +76,7 @@ class Playlist(YandexMusicObject): snapshot (:obj:`int`, optional): Версия плейлиста. Увеличивается на 1 при каждом изменении. visibility (:obj:`str`, optional): Видимость плейлиста. collective (:obj:`bool`, optional): Есть ли у плейлиста соавторы. + url_part (:obj:`str`, optional): Часть ссылки на плейлист ('daily`). created (:obj:`str`, optional): Дата создания в формате ISO 8601. modified (:obj:`str`, optional): Дата последнего изменения в формате ISO 8601. available (:obj:`bool`, optional): Доступен TODO. @@ -74,10 +84,18 @@ class Playlist(YandexMusicObject): is_premiere (:obj:`bool`, optional): Является ли премьерой TODO. duration_ms (:obj:`int`, optional): Длительность в миллисекундах. og_image (:obj:`str`, optional): Ссылка на превью Open Graph. + og_title (:obj:`str`, optional): Заголовок Open Graph. + image (:obj:`str`, optional): Изображение TODO. + cover_without_text (:obj:`yandex_music.Cover`, optional): Обложка без текста. + background_color (:obj:`str`, optional): Цвет заднего фона TODO. + text_color (:obj:`str`, optional): Цвет текста TODO. + id_for_from (:obj:`str`, optional): Откуда пришло событие (уникальный идентификатор объекта) TODO. tracks (:obj:`list` из :obj:`yandex_music.TrackShort`, optional): Список треков. prerolls (:obj:`list`, optional): Прерол, проигрываемый перед плейлистом. Присутствует только у персональных плейлистов. likes_count (:obj:`int`, optional): Количество лайков. + similar_playlists (:obj:`list` из :obj:`yandex_music.Playlist`, optional): Похожие плейлисты. + last_owner_playlists (:obj:`list` из :obj:`yandex_music.Playlist`, optional): Последние плейлисты владельца. generated_playlist_type (:obj:`str`, optional): Тип генерируемого плейлиста. animated_cover_uri (:obj:`str`, optional): Ссылка на анимированную обложку. ever_played (:obj:`str`, optional): Играл ли этот плейлист. Присутствует только у персональных плейлистов. TODO @@ -121,8 +139,8 @@ class Playlist(YandexMusicObject): tracks: List['TrackShort'] = None, prerolls: Optional[list] = None, likes_count: Optional[int] = None, - similar_playlists: Optional[dict] = None, - last_owner_playlists: Optional[dict] = None, + similar_playlists: List['Playlist'] = None, + last_owner_playlists: List['Playlist'] = None, generated_playlist_type: Optional[str] = None, animated_cover_uri: Optional[str] = None, ever_played: Optional[bool] = None,