From d5b80c7885769589572deccdd327a4f59d27bb8b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 30 Apr 2010 21:52:47 +0200 Subject: [PATCH] Test and implement library.find_exact --- mopidy/backends/gstreamer.py | 17 +++++++++++-- tests/backends/base.py | 47 ++++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 5ea00e94..53895e63 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -14,7 +14,7 @@ import shutil import threading from mopidy.backends import * -from mopidy.models import Playlist, Track +from mopidy.models import Playlist, Track, Album from mopidy import settings from mopidy.utils import parse_m3u, parse_mpd_tag_cache @@ -201,4 +201,17 @@ class GStreamerLibraryController(BaseLibraryController): raise LookupError def find_exact(self, type, query): - return Playlist() + if not query: + raise LookupError('Missing query') + + if type == 'track': + filter_func = lambda t: t.name == query + elif type == 'album': + filter_func = lambda t: getattr(t, 'album', Album()).name == query + elif type == 'artist': + filter_func = lambda t: filter(lambda a: a.name == query, t.artists) + else: + raise LookupError('Invalid lookup type') + + tracks = filter(filter_func, self._uri_mapping.values()) + return Playlist(tracks=tracks) diff --git a/tests/backends/base.py b/tests/backends/base.py index 06a9b021..8e8ee638 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -979,12 +979,13 @@ class BaseStoredPlaylistsControllerTest(object): class BaseLibraryControllerTest(object): tracks = [] - artists = [Artist(name='artist1'), Artist(name='artist2')] + artists = [Artist(name='artist1'), Artist(name='artist2'), Artist()] albums = [Album(name='album1', artists=artists[:1]), - Album(name='album2', artists=artists[1:])] + Album(name='album2', artists=artists[1:2]), + Album()] tracks = [Track(name='track1', length=4000, artists=artists[:1], album=albums[0], uri='file://' + data_folder('uri1')), - Track(name='track2', length=4000, artists=artists[1:], album=albums[1], uri='file://' + data_folder('uri2'))] - # FIXME add tracks with partial info + Track(name='track2', length=4000, artists=artists[1:2], album=albums[1], uri='file://' + data_folder('uri2')), + Track()] def setUp(self): self.backend = self.backend_class(mixer=DummyMixer()) @@ -1014,14 +1015,46 @@ class BaseLibraryControllerTest(object): result = self.library.find_exact('track', 'unknown track') self.assertEqual(result, Playlist()) + result = self.library.find_exact('artist', 'unknown artist') + self.assertEqual(result, Playlist()) + + result = self.library.find_exact('album', 'unknown artist') + self.assertEqual(result, Playlist()) + def test_find_exact_artist(self): - raise SkipTest + result = self.library.find_exact('artist', 'artist1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.find_exact('artist', 'artist2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) def test_find_exact_track(self): - raise SkipTest + result = self.library.find_exact('track', 'track1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.find_exact('track', 'track2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) def test_find_exact_album(self): - raise SkipTest + result = self.library.find_exact('album', 'album1') + self.assertEqual(result, Playlist(tracks=self.tracks[:1])) + + result = self.library.find_exact('album', 'album2') + self.assertEqual(result, Playlist(tracks=self.tracks[1:2])) + + def test_find_exact_wrong_type(self): + test = lambda: self.library.find_exact('wrong', 'test') + self.assertRaises(LookupError, test) + + def test_find_exact_with_empty_query(self): + test = lambda: self.library.find_exact('artist', '') + self.assertRaises(LookupError, test) + + test = lambda: self.library.find_exact('track', '') + self.assertRaises(LookupError, test) + + test = lambda: self.library.find_exact('album', '') + self.assertRaises(LookupError, test) def test_find_search_no_hits(self): raise SkipTest