From 7773e8eba334702802b327c9d3ceb76675e9e48a Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 30 Apr 2010 22:25:19 +0200 Subject: [PATCH] Test and impl. search in library --- mopidy/backends/gstreamer.py | 29 +++++++++++++ tests/backends/base.py | 80 ++++++++++++++++++++++++++++++------ 2 files changed, 97 insertions(+), 12 deletions(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 63a4829b..a7cff297 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -215,3 +215,32 @@ class GStreamerLibraryController(BaseLibraryController): tracks = filter(filter_func, self._uri_mapping.values()) return Playlist(tracks=tracks) + + def search(self, type, query): + if not query: + raise LookupError('Missing query') + + q = query.strip().lower() + library_tracks = self._uri_mapping.values() + + track_filter = lambda t: q in t.name.lower() + album_filter = lambda t: q in getattr(t, 'album', Album()).name.lower() + artist_filter = lambda t: filter(lambda a: q in a.name.lower(), t.artists) + uri_filter = lambda t: q in t.uri.lower() + any_filter = lambda t: track_filter(t) or album_filter(t) or \ + artist_filter(t) or uri_filter(t) + + if type == 'track': + tracks = filter(track_filter, library_tracks) + elif type == 'album': + tracks = filter(album_filter, library_tracks) + elif type == 'artist': + tracks = filter(artist_filter, library_tracks) + elif type == 'uri': + tracks = filter(uri_filter, library_tracks) + elif type == 'any': + tracks = filter(any_filter, library_tracks) + else: + raise LookupError('Invalid lookup type: %s' % type) + + return Playlist(tracks=tracks) diff --git a/tests/backends/base.py b/tests/backends/base.py index 8e8ee638..5a9c9846 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -1056,20 +1056,76 @@ class BaseLibraryControllerTest(object): test = lambda: self.library.find_exact('album', '') self.assertRaises(LookupError, test) - def test_find_search_no_hits(self): - raise SkipTest + def test_search_no_hits(self): + result = self.library.search('track', 'unknown track') + self.assertEqual(result, Playlist()) - def test_find_search_artist(self): - raise SkipTest + result = self.library.search('artist', 'unknown artist') + self.assertEqual(result, Playlist()) - def test_find_search_track(self): - raise SkipTest + result = self.library.search('album', 'unknown artist') + self.assertEqual(result, Playlist()) - def test_find_search_album(self): - raise SkipTest + result = self.library.search('uri', 'unknown') + self.assertEqual(result, Playlist()) - def test_find_search_uri(self): - raise SkipTest + result = self.library.search('any', 'unknown') + self.assertEqual(result, Playlist()) - def test_find_search_any(self): - raise SkipTest + def test_search_artist(self): + result = self.library.search('artist', 'Tist1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.search('artist', 'Tist2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) + + def test_search_track(self): + result = self.library.search('track', 'Rack1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.search('track', 'Rack2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) + + def test_search_album(self): + result = self.library.search('album', 'Bum1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.search('album', 'Bum2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) + + def test_search_uri(self): + result = self.library.search('uri', 'RI1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.search('uri', 'RI2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) + + def test_search_any(self): + result = self.library.search('any', 'Tist1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + result = self.library.search('any', 'Rack1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + result = self.library.search('any', 'Bum1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + result = self.library.search('any', 'RI1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + def test_search_wrong_type(self): + test = lambda: self.library.search('wrong', 'test') + self.assertRaises(LookupError, test) + + def test_search_with_empty_query(self): + test = lambda: self.library.search('artist', '') + self.assertRaises(LookupError, test) + + test = lambda: self.library.search('track', '') + self.assertRaises(LookupError, test) + + test = lambda: self.library.search('album', '') + self.assertRaises(LookupError, test) + + test = lambda: self.library.search('uri', '') + self.assertRaises(LookupError, test) + + test = lambda: self.library.search('any', '') + self.assertRaises(LookupError, test)