diff --git a/pylast.py b/pylast.py index ee0c760..3a9d2fc 100644 --- a/pylast.py +++ b/pylast.py @@ -1040,6 +1040,12 @@ class _BaseObject(object): return hash(self.network) + \ hash(str(type(self)) + "".join(list(self._get_params().keys()) + list(values)).lower()) + def _get_events_from_doc(self, doc): + events = [] + for node in doc.getElementsByTagName("event"): + events.append(Event(_extract(node, "id"), self.network)) + return events + class _Taggable(object): """Common functions for classes with tags.""" @@ -1508,13 +1514,7 @@ class Artist(_BaseObject, _Taggable): doc = self._request('artist.getEvents', True) - ids = _extract_all(doc, 'id') - - events = [] - for e_id in ids: - events.append(Event(e_id, self.network)) - - return events + return self._get_events_from_doc(doc) def get_similar(self, limit = None): """Returns the similar artists on the network.""" @@ -2955,17 +2955,11 @@ class User(_BaseObject): return self.name def get_upcoming_events(self): - """Returns all the upcoming events for this user. """ + """Returns all the upcoming events for this user.""" doc = self._request('user.getEvents', True) - ids = _extract_all(doc, 'id') - events = [] - - for e_id in ids: - events.append(Event(e_id, self.network)) - - return events + return self._get_events_from_doc(doc) def get_artist_tracks(self, artist): """Get a list of tracks by a given artist scrobbled by this user, including scrobble time.""" @@ -3677,22 +3671,14 @@ class Venue(_BaseObject): doc = self._request("venue.getEvents", True) - seq = [] - for node in doc.getElementsByTagName("event"): - seq.append(Event(_extract(node, "id"), self.network)) - - return seq + return self._get_events_from_doc(doc) def get_past_events(self): """Returns the past events held in this venue.""" doc = self._request("venue.getEvents", True) - seq = [] - for node in doc.getElementsByTagName("event"): - seq.append(Event(_extract(node, "id"), self.network)) - - return seq + return self._get_events_from_doc(doc) def md5(text): """Returns the md5 hash of a string.""" diff --git a/test_pylast.py b/test_pylast.py index 188680f..bbb133d 100755 --- a/test_pylast.py +++ b/test_pylast.py @@ -159,7 +159,7 @@ class TestPyLast(unittest.TestCase): def test_get_venue(self): # Arrange venue_name = "Last.fm Office" - country_name = "United Kingom" + country_name = "United Kingdom" # Act venue_search = self.network.search_for_venue(venue_name, country_name) @@ -571,6 +571,97 @@ class TestPyLast(unittest.TestCase): self.assertFalse(self.network.is_rate_limited()) + # Commented out because (a) it'll take a long time and + # (b) it strangely fails due Last.fm's complaining of hitting the rate limit, + # even when limited to one call per second. The ToS allows 5 calls per second. + # def test_get_all_scrobbles(self): + # # Arrange + # lastfm_user = self.network.get_user("RJ") + # self.network.enable_rate_limit() # this is going to be slow... + + # # Act + # tracks = lastfm_user.get_recent_tracks(limit = None) + + # # Assert + # self.assertGreaterEqual(len(tracks), 0) + + + def helper_past_events_have_valid_ids(self, thing): + # Act + events = thing.get_past_events() + + # Assert + self.helper_assert_events_have_valid_ids(events) + + + def helper_upcoming_events_have_valid_ids(self, thing): + # Act + events = thing.get_upcoming_events() + + # Assert + self.helper_assert_events_have_valid_ids(events) + + + def helper_assert_events_have_valid_ids(self, events): + # Assert + self.assertGreaterEqual(len(events), 1) # if fails, add past/future event for user/Test Artist + for event in events[:2]: # checking first two should be enough + self.assertIsInstance(event.get_headliner(), pylast.Artist) + + + def test_artist_upcoming_events_returns_valid_ids(self): + # Arrange + artist = pylast.Artist("Test Artist", self.network) + + # Act/Assert + self.helper_upcoming_events_have_valid_ids(artist) + + + def test_user_past_events_returns_valid_ids(self): + # Arrange + lastfm_user = self.network.get_user(self.username) + + # Act/Assert + self.helper_past_events_have_valid_ids(lastfm_user) + + + def test_user_recommended_events_returns_valid_ids(self): + # Arrange + lastfm_user = self.network.get_user(self.username) + + # Act + events = lastfm_user.get_upcoming_events() + + # Assert + self.helper_assert_events_have_valid_ids(events) + + + def test_user_upcoming_events_returns_valid_ids(self): + # Arrange + lastfm_user = self.network.get_user(self.username) + + # Act/Assert + self.helper_upcoming_events_have_valid_ids(lastfm_user) + + + def test_venue_past_events_returns_valid_ids(self): + # Arrange + venue_id = "8778225" # Last.fm office + venue = pylast.Venue(venue_id, self.network) + + # Act/Assert + self.helper_past_events_have_valid_ids(venue) + + + def test_venue_upcoming_events_returns_valid_ids(self): + # Arrange + venue_id = "8778225" # Last.fm office + venue = pylast.Venue(venue_id, self.network) + + # Act/Assert + self.helper_upcoming_events_have_valid_ids(venue) + + if __name__ == '__main__': # For quick testing of a single case (eg. test = "test_scrobble")