import pytest from am_http_client.client import Client from am_http_client.entities import (Album, Artist, Curator, Relationship, ResourceType, Storefront, Storefronts, Track, TrackAttributes) from httpretty import httpretty from smelog.factory import SmeBoundLogger # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_album.json']) def test_get_album_ok(credentials, api_raw_response, logger: SmeBoundLogger): album_id = '1460462589' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/albums/{album_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) album = client.get_album(album_id, storefront) assert album.id == album_id assert album.href == '/v1/catalog/us/albums/1460462589' assert album.type == 'albums' assert album.attributes.artistName == 'Nightwish' assert album.attributes.name == 'Once' assert album.attributes.genreNames == [ 'Hard Rock', 'Music', 'Rock', 'Metal', 'Death Metal/Black Metal' ] assert album.attributes.releaseDate == '2004-06-07' assert not album.attributes.isSingle assert not album.attributes.isMasteredForItunes assert not album.attributes.isCompilation assert album.attributes.isComplete assert album.attributes.trackCount == 11 # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_album.json']) def test_get_album_relationsips_ok(credentials, api_raw_response, logger: SmeBoundLogger): album_id = '1460462589' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/albums/{album_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) album = client.get_album(album_id, storefront) tracks = album.relationships[ResourceType.TRACKS] artists = album.relationships[ResourceType.ARTISTS] assert len(album.relationships) == 2 assert isinstance(tracks, Relationship) assert isinstance(tracks.data[0], Track) assert isinstance(tracks.data[0].attributes, TrackAttributes) assert tracks.data[0].attributes.name == 'Dark Chest of Wonders' assert tracks.data[0].attributes.isrc == 'DED830471901' assert tracks.data[0].attributes.trackNumber == 1 assert tracks.data[0].attributes.durationInMillis == 268720 assert isinstance(artists.data[0], Artist) # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_playlist.json']) def test_get_playlist_ok(credentials, api_raw_response, logger: SmeBoundLogger): playlist_id = 'pl.2a0b1ea7704842f4b956e959067b8389' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/playlists/{playlist_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) playlist = client.get_playlist(playlist_id, storefront) assert playlist.id == playlist_id assert playlist.href == '/v1/catalog/us/playlists/pl.2a0b1ea7704842f4b956e959067b8389' assert playlist.attributes.name == 'In My Room' assert playlist.attributes.curatorName == 'Apple Music Pop' assert playlist.attributes.description.short.startswith( 'Rising LA singer-songwriter Gracie Abrams' ) assert not playlist.attributes.isChart assert playlist.attributes.lastModifiedDate == '2020-07-24T04:46:18Z' assert playlist.attributes.playParams.id == playlist_id assert playlist.attributes.playParams.kind == 'playlist' assert playlist.attributes.playlistType == 'editorial' # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_playlist.json']) def test_get_playlist_ok_raw(credentials, api_raw_response, logger: SmeBoundLogger): playlist_id = 'pl.2a0b1ea7704842f4b956e959067b8389' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/playlists/{playlist_id}' httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) httpretty.enable(allow_net_connect=False) client = Client(credentials, max_retries=0, logger=logger) playlist = client.get_playlist(playlist_id, storefront, raw=True) assert playlist['data'][0]['id'] == playlist_id assert playlist['data'][0]['href' ] == '/v1/catalog/us/playlists/pl.2a0b1ea7704842f4b956e959067b8389' assert playlist['data'][0]['attributes']['name'] == 'In My Room' assert playlist['data'][0]['attributes']['curatorName'] == 'Apple Music Pop' assert playlist['data'][0]['attributes']['description']['short'].startswith( 'Rising LA singer-songwriter Gracie Abrams' ) assert not playlist['data'][0]['attributes']['isChart'] assert playlist['data'][0]['attributes']['lastModifiedDate'] == '2020-07-24T04:46:18Z' assert playlist['data'][0]['attributes']['playParams']['id'] == playlist_id assert playlist['data'][0]['attributes']['playParams']['kind'] == 'playlist' assert playlist['data'][0]['attributes']['playlistType'] == 'editorial' # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_playlist.json']) def test_get_playlist_relationsips_ok(credentials, api_raw_response, logger: SmeBoundLogger): playlist_id = 'pl.2a0b1ea7704842f4b956e959067b8389' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/playlists/{playlist_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) album = client.get_playlist(playlist_id, storefront) tracks = album.relationships[ResourceType.TRACKS] curator = album.relationships[ResourceType.CURATOR] assert len(album.relationships) == 2 assert isinstance(tracks, Relationship) assert isinstance(tracks.data[0], Track) assert isinstance(tracks.data[0].attributes, TrackAttributes) assert tracks.data[0].attributes.name == 'Friend' assert tracks.data[0].attributes.isrc == 'USUG11903593' assert tracks.data[0].attributes.trackNumber == 1 assert isinstance(curator.data[0], Curator) # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_song.json']) def test_get_song_ok(credentials, api_raw_response, logger: SmeBoundLogger): song_id = '1460462590' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/songs/{song_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) song = client.get_song(song_id, storefront) assert song.id == song_id assert song.attributes.artwork.bgColor == '5a5d77' assert song.attributes.name == 'Dark Chest of Wonders' assert song.attributes.isrc == 'DED830471901' assert song.attributes.artistName == 'Nightwish' # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_song.json']) def test_get_song_relationships(credentials, api_raw_response, logger: SmeBoundLogger): song_id = '1460462590' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/songs/{song_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) song = client.get_song(song_id, storefront) artists = song.relationships['artists'] albums = song.relationships['albums'] assert song.id == song_id assert len(song.relationships) == 2 assert isinstance(artists, Relationship) assert isinstance(artists.data[0], Artist) assert artists.data[0].id == '2898807' assert isinstance(albums, Relationship) assert isinstance(albums.data[0], Album) assert albums.data[0].id == '1460462589' # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_artist.json']) def test_get_artist_ok(credentials, api_raw_response, logger: SmeBoundLogger): artist_id = '2898807' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/artists/{artist_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) artist = client.get_artist(artist_id, storefront) assert artist.id == artist_id assert artist.attributes.name == 'Nightwish' assert artist.attributes.url == 'https://music.apple.com/us/artist/nightwish/2898807' # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_artist.json']) def test_get_artist_relationships(credentials, api_raw_response, logger: SmeBoundLogger): artist_id = '2898807' storefront = 'foo' url = f'https://api.music.apple.com/v1/catalog/{storefront}/artists/{artist_id}' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) artist = client.get_artist(artist_id, storefront) albums = artist.relationships['albums'] assert len(artist.relationships) == 1 assert isinstance(albums, Relationship) assert isinstance(albums.data[0], Album) # noinspection PyTestParametrized @pytest.mark.parametrize('api_raw_response__file_name', ['get_storefronts.json']) def test_get_storefronts(credentials, api_raw_response, logger: SmeBoundLogger): url = f'https://api.music.apple.com/v1/storefronts' httpretty.enable(allow_net_connect=False) httpretty.register_uri(httpretty.GET, url, responses=[api_raw_response]) client = Client(credentials, max_retries=0, logger=logger) storefronts = client.get_storefronts() assert len(storefronts.data) == 167 assert isinstance(storefronts, Storefronts) assert isinstance(storefronts.data[0], Storefront)