From ac87cee29d461167af19e7261af7afd38273dd7f Mon Sep 17 00:00:00 2001 From: hugovk Date: Thu, 6 Mar 2014 18:11:39 +0200 Subject: [PATCH] Refactor shouts to duplicate code --- pylast.py | 313 +++++++++++++++++++++---------------------------- test_pylast.py | 83 ++++++++++--- 2 files changed, 201 insertions(+), 195 deletions(-) diff --git a/pylast.py b/pylast.py index 8f57442..0863fdd 100644 --- a/pylast.py +++ b/pylast.py @@ -1340,7 +1340,7 @@ class _BaseObject(object): tag_name)[0].firstChild.wholeText.strip() def _get_things( - self, method, thing, thing_type, params = None, cacheable=True): + self, method, thing, thing_type, params=None, cacheable=True): """Returns a list of the most played thing_types by this thing.""" doc = self._request( @@ -1368,55 +1368,14 @@ class _BaseObject(object): return seq - def get_weekly_artist_charts(self, from_date=None, to_date=None): - """ - Returns the weekly artist charts for the week starting from the - from_date value to the to_date value. - """ - params = self._get_params() - if from_date and to_date: - params["from"] = from_date - params["to"] = to_date - - doc = self._request( - self.ws_prefix + ".getWeeklyArtistChart", True, params) - - seq = [] - for node in doc.getElementsByTagName("artist"): - item = Artist(_extract(node, "name"), self.network) - weight = _number(_extract(node, "playcount")) - seq.append(TopItem(item, weight)) - - return seq - - def get_weekly_album_charts(self, from_date=None, to_date=None): - """ - Returns the weekly album charts for the week starting from the - from_date value to the to_date value. - """ - - params = self._get_params() - if from_date and to_date: - params["from"] = from_date - params["to"] = to_date - - doc = self._request( - self.ws_prefix + ".getWeeklyAlbumChart", True, params) - - seq = [] - for node in doc.getElementsByTagName("album"): - item = Album( - _extract(node, "artist"), _extract(node, "name"), self.network) - weight = _number(_extract(node, "playcount")) - seq.append(TopItem(item, weight)) - - return seq - - def get_weekly_track_charts(self, from_date=None, to_date=None): + def get_weekly_charts(self, chart_kind, from_date=None, to_date=None): """ Returns the weekly track charts for the week starting from the from_date value to the to_date value. + chart_kind should be one of "album", "track" """ + method = ".getWeekly" + chart_kind.title() + "Chart" + chart_type = eval(chart_kind.title()) params = self._get_params() if from_date and to_date: @@ -1424,11 +1383,11 @@ class _BaseObject(object): params["to"] = to_date doc = self._request( - self.ws_prefix + ".getWeeklyTrackChart", True, params) + self.ws_prefix + method, True, params) seq = [] - for node in doc.getElementsByTagName("track"): - item = Track( + for node in doc.getElementsByTagName(chart_kind.lower()): + item = chart_type( _extract(node, "artist"), _extract(node, "name"), self.network) weight = _number(_extract(node, "playcount")) seq.append(TopItem(item, weight)) @@ -1463,7 +1422,8 @@ class _BaseObject(object): """ Shares this (sends out recommendations). Parameters: - * users [User|str,]: A list that can contain usernames, emails, User objects, or all of them. + * users [User|str,]: A list that can contain usernames, emails, + User objects, or all of them. * message str: A message to include in the recommendation message. Only for Artist/Event/Track. """ @@ -1492,7 +1452,7 @@ class _BaseObject(object): def get_wiki_published_date(self): """ Returns the date of publishing this version of the wiki. - Only for Album/Track. + Only for Album/Tag/Track. """ doc = self._request(self.ws_prefix + ".getInfo", True) @@ -1534,12 +1494,32 @@ class _BaseObject(object): return _extract(node, "content") + def get_shouts(self, limit=50, cacheable=False): + """ + Returns a sequence of Shout objects + """ + + shouts = [] + for node in _collect_nodes( + limit, + self, + self.ws_prefix + ".getShouts", + cacheable): + shouts.append( + Shout( + _extract(node, "body"), + User(_extract(node, "author"), self.network), + _extract(node, "date") + ) + ) + return shouts + class _Taggable(object): """Common functions for classes with tags.""" def __init__(self, ws_prefix): - self.ws_prefix = ws_prefix # TODO move to _BaseObject + self.ws_prefix = ws_prefix # TODO move to _BaseObject def add_tags(self, tags): """Adds one or several tags. @@ -1712,8 +1692,8 @@ class NetworkError(Exception): class Album(_BaseObject, _Taggable): """An album.""" - title = None artist = None + title = None username = None __hash__ = _BaseObject.__hash__ @@ -1762,7 +1742,8 @@ class Album(_BaseObject, _Taggable): def _get_params(self): return { - 'artist': self.get_artist().get_name(), 'album': self.get_title(), + 'artist': self.get_artist().get_name(), + self.ws_prefix: self.get_title(), } def get_artist(self): @@ -1781,10 +1762,10 @@ class Album(_BaseObject, _Taggable): return self.get_title() def get_release_date(self): - """Retruns the release date of the album.""" + """Returns the release date of the album.""" - return _extract( - self._request("album.getInfo", cacheable=True), "releasedate") + return _extract(self._request( + self.ws_prefix + ".getInfo", cacheable=True), "releasedate") def get_cover_image(self, size=COVER_EXTRA_LARGE): """ @@ -1797,18 +1778,21 @@ class Album(_BaseObject, _Taggable): """ return _extract_all( - self._request("album.getInfo", cacheable=True), 'image')[size] + self._request( + self.ws_prefix + ".getInfo", cacheable=True), 'image')[size] def get_id(self): """Returns the ID""" - return _extract(self._request("album.getInfo", cacheable=True), "id") + return _extract( + self._request(self.ws_prefix + ".getInfo", cacheable=True), "id") def get_playcount(self): """Returns the number of plays on the network""" return _number(_extract( - self._request("album.getInfo", cacheable=True), "playcount")) + self._request( + self.ws_prefix + ".getInfo", cacheable=True), "playcount")) def get_userplaycount(self): """Returns the number of plays by a given username""" @@ -1819,13 +1803,15 @@ class Album(_BaseObject, _Taggable): params['username'] = self.username return _number(_extract( - self._request("album.getInfo", True, params), "userplaycount")) + self._request( + self.ws_prefix + ".getInfo", True, params), "userplaycount")) def get_listener_count(self): """Returns the number of listeners on the network""" return _number(_extract( - self._request("album.getInfo", cacheable=True), "listeners")) + self._request( + self.ws_prefix + ".getInfo", cacheable=True), "listeners")) def get_tracks(self): """Returns the list of Tracks on this album.""" @@ -1837,7 +1823,8 @@ class Album(_BaseObject, _Taggable): def get_mbid(self): """Returns the MusicBrainz id of the album.""" - return _extract(self._request("album.getInfo", cacheable=True), "mbid") + return _extract( + self._request(self.ws_prefix + ".getInfo", cacheable=True), "mbid") def get_url(self, domain_name=DOMAIN_ENGLISH): """Returns the url of the album page on the network. @@ -1861,7 +1848,7 @@ class Album(_BaseObject, _Taggable): album = _url_safe(self.get_title()) return self.network._get_url( - domain_name, "album") % {'artist': artist, 'album': album} + domain_name, "album") % {'artist': artist, self.ws_prefix: album} class Artist(_BaseObject, _Taggable): @@ -2094,22 +2081,6 @@ class Artist(_BaseObject, _Taggable): ) return images - def get_shouts(self, limit=50, cacheable=False): - """ - Returns a sequqence of Shout objects - """ - - shouts = [] - for node in _collect_nodes(limit, self, "artist.getShouts", cacheable): - shouts.append( - Shout( - _extract(node, "body"), - User(_extract(node, "author"), self.network), - _extract(node, "date") - ) - ) - return shouts - def shout(self, message): """ Post a shout @@ -2279,22 +2250,6 @@ class Event(_BaseObject): return self.network._get_url( domain_name, "event") % {'id': self.get_id()} - def get_shouts(self, limit=50, cacheable=False): - """ - Returns a sequqence of Shout objects - """ - - shouts = [] - for node in _collect_nodes(limit, self, "event.getShouts", cacheable): - shouts.append( - Shout( - _extract(node, "body"), - User(_extract(node, "author"), self.network), - _extract(node, "date") - ) - ) - return shouts - def shout(self, message): """ Post a shout @@ -2305,6 +2260,7 @@ class Event(_BaseObject): self._request("event.Shout", False, params) + class Country(_BaseObject): """A country at Last.fm.""" @@ -2330,7 +2286,7 @@ class Country(_BaseObject): def __ne__(self, other): return self.get_name() != other.get_name() - def _get_params(self): # TODO can move to _BaseObject + def _get_params(self): # TODO can move to _BaseObject return {'country': self.get_name()} def _get_name_from_code(self, alpha2code): @@ -2980,6 +2936,12 @@ class Track(_BaseObject, _Taggable): __hash__ = _BaseObject.__hash__ def __init__(self, artist, title, network, username=None): + """ + Create a track instance. + # Parameters: + * artist: An artist name or an Artist object. + * title: The artist title. + """ _BaseObject.__init__(self, network, 'track') _Taggable.__init__(self, 'track') @@ -2989,7 +2951,6 @@ class Track(_BaseObject, _Taggable): self.artist = Artist(artist, self.network) self.title = title - self.username = username def __repr__(self): @@ -3016,7 +2977,8 @@ class Track(_BaseObject, _Taggable): def _get_params(self): return { - 'artist': self.get_artist().get_name(), 'track': self.get_title()} + 'artist': self.get_artist().get_name(), + self.ws_prefix: self.get_title()} def get_artist(self): """Returns the associated Artist object.""" @@ -3027,7 +2989,8 @@ class Track(_BaseObject, _Taggable): """Returns the track title.""" if properly_capitalized: - self.title = _extract(self._request("track.getInfo", True), "name") + self.title = _extract( + self._request(self.ws_prefix + ".getInfo", True), "name") return self.title @@ -3039,21 +3002,21 @@ class Track(_BaseObject, _Taggable): def get_id(self): """Returns the track id on the network.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "id") def get_duration(self): """Returns the track duration.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _number(_extract(doc, "duration")) def get_mbid(self): """Returns the MusicBrainz ID of this track.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "mbid") @@ -3063,14 +3026,14 @@ class Track(_BaseObject, _Taggable): if hasattr(self, "listener_count"): return self.listener_count else: - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) self.listener_count = _number(_extract(doc, "listeners")) return self.listener_count def get_playcount(self): """Returns the play count.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _number(_extract(doc, "playcount")) def get_userplaycount(self): @@ -3081,7 +3044,7 @@ class Track(_BaseObject, _Taggable): params = self._get_params() params['username'] = self.username - doc = self._request("track.getInfo", True, params) + doc = self._request(self.ws_prefix + ".getInfo", True, params) return _number(_extract(doc, "userplaycount")) def get_userloved(self): @@ -3092,27 +3055,27 @@ class Track(_BaseObject, _Taggable): params = self._get_params() params['username'] = self.username - doc = self._request("track.getInfo", True, params) + doc = self._request(self.ws_prefix + ".getInfo", True, params) loved = _number(_extract(doc, "userloved")) return bool(loved) def is_streamable(self): """Returns True if the track is available at Last.fm.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "streamable") == "1" def is_fulltrack_available(self): """Returns True if the fulltrack is available for streaming.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return doc.getElementsByTagName( "streamable")[0].getAttribute("fulltrack") == "1" def get_album(self): """Returns the album object of this track.""" - doc = self._request("track.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) albums = doc.getElementsByTagName("album") @@ -3126,17 +3089,17 @@ class Track(_BaseObject, _Taggable): def love(self): """Adds the track to the user's loved tracks. """ - self._request('track.love') + self._request(self.ws_prefix + '.love') def unlove(self): """Remove the track to the user's loved tracks. """ - self._request('track.unlove') + self._request(self.ws_prefix + '.unlove') def ban(self): """Ban this track from ever playing on the radio. """ - self._request('track.ban') + self._request(self.ws_prefix + '.ban') def get_similar(self): """ @@ -3144,10 +3107,10 @@ class Track(_BaseObject, _Taggable): based on listening data. """ - doc = self._request('track.getSimilar', True) + doc = self._request(self.ws_prefix + '.getSimilar', True) seq = [] - for node in doc.getElementsByTagName("track"): + for node in doc.getElementsByTagName(self.ws_prefix): title = _extract(node, 'name') artist = _extract(node, 'name', 1) match = _number(_extract(node, "match")) @@ -3180,22 +3143,6 @@ class Track(_BaseObject, _Taggable): 'domain': self.network._get_language_domain(domain_name), 'artist': artist, 'title': title} - def get_shouts(self, limit=50, cacheable=False): - """ - Returns a sequqence of Shout objects - """ - - shouts = [] - for node in _collect_nodes(limit, self, "track.getShouts", cacheable): - shouts.append( - Shout( - _extract(node, "body"), - User(_extract(node, "author"), self.network), - _extract(node, "date") - ) - ) - return shouts - class Group(_BaseObject): """A Last.fm group.""" @@ -3223,7 +3170,7 @@ class Group(_BaseObject): return self.get_name() != other.get_name() def _get_params(self): - return {'group': self.get_name()} + return {self.ws_prefix: self.get_name()} def get_name(self): """Returns the group name. """ @@ -3256,7 +3203,8 @@ class Group(_BaseObject): if limit==None it will return all """ - nodes = _collect_nodes(limit, self, "group.getMembers", cacheable) + nodes = _collect_nodes( + limit, self, self.ws_prefix + ".getMembers", cacheable) users = [] @@ -3347,20 +3295,21 @@ class User(_BaseObject): return True def _get_params(self): - return {"user": self.get_name()} + return {self.ws_prefix: self.get_name()} def get_name(self, properly_capitalized=False): """Returns the user name.""" if properly_capitalized: - self.name = _extract(self._request("user.getInfo", True), "name") + self.name = _extract( + self._request(self.ws_prefix + ".getInfo", True), "name") return self.name def get_upcoming_events(self): """Returns all the upcoming events for this user.""" - doc = self._request('user.getEvents', True) + doc = self._request(self.ws_prefix + '.getEvents', True) return _extract_events_from_doc(doc, self.network) @@ -3377,7 +3326,11 @@ class User(_BaseObject): seq = [] for track in _collect_nodes( - None, self, "user.getArtistTracks", cacheable, params): + None, + self, + self.ws_prefix + ".getArtistTracks", + cacheable, + params): title = _extract(track, "name") artist = _extract(track, "artist") date = _extract(track, "date") @@ -3394,7 +3347,11 @@ class User(_BaseObject): """Returns a list of the user's friends. """ seq = [] - for node in _collect_nodes(limit, self, "user.getFriends", cacheable): + for node in _collect_nodes( + limit, + self, + self.ws_prefix + ".getFriends", + cacheable): seq.append(User(_extract(node, "name"), self.network)) return seq @@ -3419,8 +3376,11 @@ class User(_BaseObject): seq = [] for track in _collect_nodes( - limit, self, "user.getLovedTracks", cacheable, params): - + limit, + self, + self.ws_prefix + ".getLovedTracks", + cacheable, + params): title = _extract(track, "name") artist = _extract(track, "name", 1) date = _extract(track, "date") @@ -3439,7 +3399,7 @@ class User(_BaseObject): if limit: params['limit'] = limit - doc = self._request('user.getNeighbours', True, params) + doc = self._request(self.ws_prefix + '.getNeighbours', True, params) seq = [] names = _extract_all(doc, 'name') @@ -3456,7 +3416,11 @@ class User(_BaseObject): """ seq = [] - for n in _collect_nodes(limit, self, "user.getPastEvents", cacheable): + for n in _collect_nodes( + limit, + self, + self.ws_prefix + ".getPastEvents", + cacheable): seq.append(Event(_extract(n, "id"), self.network)) return seq @@ -3464,7 +3428,7 @@ class User(_BaseObject): def get_playlists(self): """Returns a list of Playlists that this user owns.""" - doc = self._request("user.getPlaylists", True) + doc = self._request(self.ws_prefix + ".getPlaylists", True) playlists = [] for playlist_id in _extract_all(doc, "id"): @@ -3481,7 +3445,7 @@ class User(_BaseObject): params = self._get_params() params['limit'] = '1' - doc = self._request('user.getRecentTracks', False, params) + doc = self._request(self.ws_prefix + '.getRecentTracks', False, params) tracks = doc.getElementsByTagName('track') @@ -3518,7 +3482,11 @@ class User(_BaseObject): seq = [] for track in _collect_nodes( - limit, self, "user.getRecentTracks", cacheable, params): + limit, + self, + self.ws_prefix + ".getRecentTracks", + cacheable, + params): if track.hasAttribute('nowplaying'): continue # to prevent the now playing track from sneaking in @@ -3536,23 +3504,23 @@ class User(_BaseObject): return seq def get_id(self): - """Returns the user id.""" + """Returns the user ID.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "id") def get_language(self): """Returns the language code of the language used by the user.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "lang") def get_country(self): """Returns the name of the country of the user.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) country = _extract(doc, "country") @@ -3564,14 +3532,14 @@ class User(_BaseObject): def get_age(self): """Returns the user's age.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _number(_extract(doc, "age")) def get_gender(self): """Returns the user's gender. Either USER_MALE or USER_FEMALE.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) value = _extract(doc, "gender") @@ -3585,28 +3553,28 @@ class User(_BaseObject): def is_subscriber(self): """Returns whether the user is a subscriber or not. True or False.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "subscriber") == "1" def get_playcount(self): """Returns the user's playcount so far.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _number(_extract(doc, "playcount")) def get_registered(self): """Returns the user's registration date.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "registered") def get_unixtime_registered(self): """Returns the user's registration date as a UNIX timestamp.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return doc.getElementsByTagName( "registered")[0].getAttribute("unixtime") @@ -3624,7 +3592,7 @@ class User(_BaseObject): params = self._get_params() params['period'] = period - doc = self._request('user.getTopAlbums', True, params) + doc = self._request(self.ws_prefix + '.getTopAlbums', True, params) seq = [] for album in doc.getElementsByTagName('album'): @@ -3649,7 +3617,7 @@ class User(_BaseObject): params = self._get_params() params['period'] = period - doc = self._request('user.getTopArtists', True, params) + doc = self._request(self.ws_prefix + '.getTopArtists', True, params) seq = [] for node in doc.getElementsByTagName('artist'): @@ -3671,7 +3639,7 @@ class User(_BaseObject): params = self._get_params() if limit: params["limit"] = limit - doc = self._request("user.getTopTags", cacheable, params) + doc = self._request(self.ws_prefix + ".getTopTags", cacheable, params) seq = [] for node in doc.getElementsByTagName("tag"): @@ -3681,7 +3649,8 @@ class User(_BaseObject): return seq - def get_top_tracks(self, period=PERIOD_OVERALL, limit=None, cacheable=True): + def get_top_tracks( + self, period=PERIOD_OVERALL, limit=None, cacheable=True): """Returns the top tracks played by a user. * period: The period of time. Possible values: o PERIOD_OVERALL @@ -3735,7 +3704,7 @@ class User(_BaseObject): def get_image(self): """Returns the user's avatar.""" - doc = self._request("user.getInfo", True) + doc = self._request(self.ws_prefix + ".getInfo", True) return _extract(doc, "image") @@ -3765,22 +3734,6 @@ class User(_BaseObject): return Library(self, self.network) - def get_shouts(self, limit=50, cacheable=False): - """ - Returns a sequence of Shout objects - """ - - shouts = [] - for node in _collect_nodes(limit, self, "user.getShouts", cacheable): - shouts.append( - Shout( - _extract(node, "body"), - User(_extract(node, "author"), self.network), - _extract(node, "date") - ) - ) - return shouts - def shout(self, message): """ Post a shout @@ -3789,7 +3742,7 @@ class User(_BaseObject): params = self._get_params() params["message"] = message - self._request("user.Shout", False, params) + self._request(self.ws_prefix + ".Shout", False, params) class AuthenticatedUser(User): @@ -4031,7 +3984,7 @@ class Venue(_BaseObject): return self.get_id() == other.get_id() def _get_params(self): - return {"venue": self.get_id()} + return {self.ws_prefix: self.get_id()} def get_id(self): """Returns the id of the venue.""" @@ -4056,14 +4009,14 @@ class Venue(_BaseObject): def get_upcoming_events(self): """Returns the upcoming events in this venue.""" - doc = self._request("venue.getEvents", True) + doc = self._request(self.ws_prefix + ".getEvents", True) return _extract_events_from_doc(doc, self.network) def get_past_events(self): """Returns the past events held in this venue.""" - doc = self._request("venue.getEvents", True) + doc = self._request(self.ws_prefix + ".getEvents", True) return _extract_events_from_doc(doc, self.network) diff --git a/test_pylast.py b/test_pylast.py index 7f7534c..3856746 100755 --- a/test_pylast.py +++ b/test_pylast.py @@ -1028,6 +1028,15 @@ class TestPyLast(unittest.TestCase): self.assertEqual(type(thing2.item), expected_type) self.assertNotEqual(thing1, thing2) + def helper_two_things_in_list(self, things, expected_type): + # Assert + self.assertEqual(len(things), 2) + self.assertEqual(type(things), list) + thing1 = things[0] + thing2 = things[1] + self.assertEqual(type(thing1), expected_type) + self.assertEqual(type(thing2), expected_type) + def test_user_get_top_tags_with_limit(self): # Arrange user = self.network.get_user("RJ") @@ -1145,10 +1154,10 @@ class TestPyLast(unittest.TestCase): (from_date, to_date) = date # Act - artist_chart = thing.get_weekly_artist_charts(from_date, to_date) + artist_chart = thing.get_weekly_charts("artist", from_date, to_date) if type(thing) is not pylast.Tag: - album_chart = thing.get_weekly_album_charts(from_date, to_date) - track_chart = thing.get_weekly_track_charts(from_date, to_date) + album_chart = thing.get_weekly_charts("album", from_date, to_date) + track_chart = thing.get_weekly_charts("track", from_date, to_date) # Assert self.helper_assert_chart(artist_chart, pylast.Artist) @@ -1174,7 +1183,6 @@ class TestPyLast(unittest.TestCase): # Act/Assert self.helper_get_assert_charts(tag, dates[-1]) - def test_user_charts(self): # Arrange lastfm_user = self.network.get_user("RJ") @@ -1184,17 +1192,6 @@ class TestPyLast(unittest.TestCase): # Act/Assert self.helper_get_assert_charts(lastfm_user, dates[-1]) - - def test_artist_top_fans(self): - # Arrange - artist = self.network.get_artist("Test Artist") - - # Act - fans = artist.get_top_fans() - - # Assert - self.helper_at_least_one_thing_in_top_list(fans, pylast.User) - def test_track_top_fans(self): # Arrange track = self.network.get_track("The Cinematic Orchestra", "Postlude") @@ -1222,6 +1219,62 @@ class TestPyLast(unittest.TestCase): # Assert # Check inbox for spam! + #album/artist/event/track/user + + def test_album_shouts(self): + # Arrange + # Pick an artist with plenty of plays + artist = self.network.get_top_artists(limit=1)[0].item + album = artist.get_top_albums(limit=1)[0].item + + # Act + shouts = album.get_shouts(limit=2) + + # Assert + self.helper_two_things_in_list(shouts, pylast.Shout) + + def test_artist_shouts(self): + # Arrange + # Pick an artist with plenty of plays + artist = self.network.get_top_artists(limit=1)[0].item + + # Act + shouts = artist.get_shouts(limit=2) + + # Assert + self.helper_two_things_in_list(shouts, pylast.Shout) + + def test_event_shouts(self): + # Arrange + event_id = 3478520 # Glasto 2014 + event = pylast.Event(event_id, self.network) + + # Act + shouts = event.get_shouts(limit=2) + + # Assert + self.helper_two_things_in_list(shouts, pylast.Shout) + + def test_track_shouts(self): + # Arrange + track = self.network.get_track("The Cinematic Orchestra", "Postlude") + + # Act + shouts = track.get_shouts(limit=2) + + # Assert + self.helper_two_things_in_list(shouts, pylast.Shout) + + def test_user_shouts(self): + # Arrange + user = self.network.get_user("RJ") + + # Act + shouts = user.get_shouts(limit=2) + + # Assert + self.helper_two_things_in_list(shouts, pylast.Shout) + if __name__ == '__main__':