diff --git a/mopidy/core/tracklist.py b/mopidy/core/tracklist.py index 54206881..182cffba 100644 --- a/mopidy/core/tracklist.py +++ b/mopidy/core/tracklist.py @@ -333,6 +333,12 @@ class TracklistController(object): assert tracks is not None or uri is not None or uris is not None, \ 'tracks, uri or uris must be provided' + # TODO: assert that tracks are track instances + + if tracks: + warnings.warn('tracklist.add() "tracks" argument is deprecated.', + DeprecationWarning) + if uri: warnings.warn('tracklist.add() "uri" argument is deprecated.', DeprecationWarning) diff --git a/tests/core/test_events.py b/tests/core/test_events.py index a197972b..09244b0d 100644 --- a/tests/core/test_events.py +++ b/tests/core/test_events.py @@ -17,6 +17,8 @@ from tests import dummy_backend class BackendEventsTest(unittest.TestCase): def setUp(self): # noqa: N802 self.backend = dummy_backend.create_proxy() + self.backend.library.dummy_library = [ + Track(uri='dummy:a'), Track(uri='dummy:b')] with warnings.catch_warnings(): warnings.simplefilter('ignore') @@ -45,12 +47,12 @@ class BackendEventsTest(unittest.TestCase): def test_tracklist_add_sends_tracklist_changed_event(self, send): send.reset_mock() - self.core.tracklist.add([Track(uri='dummy:a')]).get() + self.core.tracklist.add(uris=['dummy:a']).get() self.assertEqual(send.call_args[0][0], 'tracklist_changed') def test_tracklist_clear_sends_tracklist_changed_event(self, send): - self.core.tracklist.add([Track(uri='dummy:a')]).get() + self.core.tracklist.add(uris=['dummy:a']).get() send.reset_mock() self.core.tracklist.clear().get() @@ -58,8 +60,7 @@ class BackendEventsTest(unittest.TestCase): self.assertEqual(send.call_args[0][0], 'tracklist_changed') def test_tracklist_move_sends_tracklist_changed_event(self, send): - self.core.tracklist.add( - [Track(uri='dummy:a'), Track(uri='dummy:b')]).get() + self.core.tracklist.add(uris=['dummy:a', 'dummy:b']).get() send.reset_mock() self.core.tracklist.move(0, 1, 1).get() @@ -67,7 +68,7 @@ class BackendEventsTest(unittest.TestCase): self.assertEqual(send.call_args[0][0], 'tracklist_changed') def test_tracklist_remove_sends_tracklist_changed_event(self, send): - self.core.tracklist.add([Track(uri='dummy:a')]).get() + self.core.tracklist.add(uris=['dummy:a']).get() send.reset_mock() self.core.tracklist.remove(uri=['dummy:a']).get() @@ -75,8 +76,7 @@ class BackendEventsTest(unittest.TestCase): self.assertEqual(send.call_args[0][0], 'tracklist_changed') def test_tracklist_shuffle_sends_tracklist_changed_event(self, send): - self.core.tracklist.add( - [Track(uri='dummy:a'), Track(uri='dummy:b')]).get() + self.core.tracklist.add(uris=['dummy:a', 'dummy:b']).get() send.reset_mock() self.core.tracklist.shuffle().get() diff --git a/tests/core/test_playback.py b/tests/core/test_playback.py index 7c4db0d6..d09950b2 100644 --- a/tests/core/test_playback.py +++ b/tests/core/test_playback.py @@ -13,6 +13,7 @@ from tests import dummy_audio as audio # TODO: split into smaller easier to follow tests. setup is way to complex. +# TODO: just mock tracklist? class CorePlaybackTest(unittest.TestCase): def setUp(self): # noqa: N802 self.backend1 = mock.Mock() @@ -42,14 +43,32 @@ class CorePlaybackTest(unittest.TestCase): Track(uri='dummy1:c', length=None), # No duration ] + self.uris = [ + 'dummy1:a', 'dummy2:a', 'dummy3:a', 'dummy1:b', 'dummy1:c'] + self.core = core.Core(mixer=None, backends=[ self.backend1, self.backend2, self.backend3]) - self.core.tracklist.add(self.tracks) + + def lookup(uris): + result = {uri: [] for uri in uris} + for track in self.tracks: + if track.uri in result: + result[track.uri].append(track) + return result + + self.lookup_patcher = mock.patch.object(self.core.library, 'lookup') + self.lookup_mock = self.lookup_patcher.start() + self.lookup_mock.side_effect = lookup + + self.core.tracklist.add(uris=self.uris) self.tl_tracks = self.core.tracklist.tl_tracks self.unplayable_tl_track = self.tl_tracks[2] self.duration_less_tl_track = self.tl_tracks[4] + def tearDown(self): # noqa: N802 + self.lookup_patcher.stop() + def trigger_end_of_track(self): self.core.playback._on_end_of_track() @@ -136,7 +155,7 @@ class CorePlaybackTest(unittest.TestCase): self.playback2.change_track.return_value.get.return_value = False self.core.tracklist.clear() - self.core.tracklist.add(self.tracks[:2]) + self.core.tracklist.add(uris=self.uris[:2]) tl_tracks = self.core.tracklist.tl_tracks self.core.playback.play(tl_tracks[0]) @@ -591,11 +610,16 @@ class TestStream(unittest.TestCase): self.tracks = [Track(uri='dummy:a', length=1234), Track(uri='dummy:b', length=1234)] - self.core.tracklist.add(self.tracks) + self.lookup_patcher = mock.patch.object(self.core.library, 'lookup') + self.lookup_mock = self.lookup_patcher.start() + self.lookup_mock.return_value = {t.uri: [t] for t in self.tracks} + + self.core.tracklist.add(uris=[t.uri for t in self.tracks]) self.events = [] - self.patcher = mock.patch('mopidy.audio.listener.AudioListener.send') - self.send_mock = self.patcher.start() + self.send_patcher = mock.patch( + 'mopidy.audio.listener.AudioListener.send') + self.send_mock = self.send_patcher.start() def send(event, **kwargs): self.events.append((event, kwargs)) @@ -604,7 +628,8 @@ class TestStream(unittest.TestCase): def tearDown(self): # noqa: N802 pykka.ActorRegistry.stop_all() - self.patcher.stop() + self.lookup_patcher.stop() + self.send_patcher.stop() def replay_audio_events(self): while self.events: @@ -664,7 +689,9 @@ class CorePlaybackWithOldBackendTest(unittest.TestCase): b.uri_schemes.get.return_value = ['dummy1'] b.playback = mock.Mock(spec=backend.PlaybackProvider) b.playback.play.side_effect = TypeError + b.library.lookup.return_value.get.return_value = [ + Track(uri='dummy1:a', length=40000)] c = core.Core(mixer=None, backends=[b]) - c.tracklist.add([Track(uri='dummy1:a', length=40000)]) + c.tracklist.add(uris=['dummy1:a']) c.playback.play() # No TypeError == test passed. diff --git a/tests/core/test_tracklist.py b/tests/core/test_tracklist.py index c8cbf97f..60d70547 100644 --- a/tests/core/test_tracklist.py +++ b/tests/core/test_tracklist.py @@ -17,44 +17,49 @@ class TracklistTest(unittest.TestCase): Track(uri='dummy1:c', name='bar'), ] + def lookup(uri): + future = mock.Mock() + future.get.return_value = [t for t in self.tracks if t.uri == uri] + return future + self.backend = mock.Mock() self.backend.uri_schemes.get.return_value = ['dummy1'] self.library = mock.Mock(spec=backend.LibraryProvider) + self.library.lookup.side_effect = lookup self.backend.library = self.library self.core = core.Core(mixer=None, backends=[self.backend]) - self.tl_tracks = self.core.tracklist.add(self.tracks) + self.tl_tracks = self.core.tracklist.add(uris=[ + t.uri for t in self.tracks]) def test_add_by_uri_looks_up_uri_in_library(self): - track = Track(uri='dummy1:x', name='x') - self.library.lookup.return_value.get.return_value = [track] + self.library.lookup.reset_mock() + self.core.tracklist.clear() with warnings.catch_warnings(): warnings.filterwarnings('ignore', r'tracklist.add.*"uri".*') - tl_tracks = self.core.tracklist.add(uri='dummy1:x') + tl_tracks = self.core.tracklist.add(uris=['dummy1:a']) - self.library.lookup.assert_called_once_with('dummy1:x') + self.library.lookup.assert_called_once_with('dummy1:a') self.assertEqual(1, len(tl_tracks)) - self.assertEqual(track, tl_tracks[0].track) + self.assertEqual(self.tracks[0], tl_tracks[0].track) self.assertEqual(tl_tracks, self.core.tracklist.tl_tracks[-1:]) def test_add_by_uris_looks_up_uris_in_library(self): - track1 = Track(uri='dummy1:x', name='x') - track2 = Track(uri='dummy1:y1', name='y1') - track3 = Track(uri='dummy1:y2', name='y2') - self.library.lookup.return_value.get.side_effect = [ - [track1], [track2, track3]] + self.library.lookup.reset_mock() + self.core.tracklist.clear() - tl_tracks = self.core.tracklist.add(uris=['dummy1:x', 'dummy1:y']) + tl_tracks = self.core.tracklist.add(uris=[t.uri for t in self.tracks]) self.library.lookup.assert_has_calls([ - mock.call('dummy1:x'), - mock.call('dummy1:y'), + mock.call('dummy1:a'), + mock.call('dummy1:b'), + mock.call('dummy1:c'), ]) self.assertEqual(3, len(tl_tracks)) - self.assertEqual(track1, tl_tracks[0].track) - self.assertEqual(track2, tl_tracks[1].track) - self.assertEqual(track3, tl_tracks[2].track) + self.assertEqual(self.tracks[0], tl_tracks[0].track) + self.assertEqual(self.tracks[1], tl_tracks[1].track) + self.assertEqual(self.tracks[2], tl_tracks[2].track) self.assertEqual( tl_tracks, self.core.tracklist.tl_tracks[-len(tl_tracks):])