diff --git a/docs/development/contributing.rst b/docs/development/contributing.rst index fbc7baee..9ea3533f 100644 --- a/docs/development/contributing.rst +++ b/docs/development/contributing.rst @@ -74,11 +74,11 @@ Running tests To run tests, you need a couple of dependencies. They can be installed through Debian/Ubuntu package management:: - sudo aptitude install python-coverage python-nose + sudo aptitude install python-coverage python-mock python-nose Or, they can be installed using ``pip``:: - sudo pip install -r requirements-tests.txt + sudo pip install -r requirements/tests.txt Then, to run all tests, go to the project directory and run:: diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index db2eab37..80762c89 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -5,6 +5,7 @@ import os import shutil from pykka.actor import ThreadingActor +from pykka.registry import ActorRegistry from mopidy import settings from mopidy.backends.base import (Backend, CurrentPlaylistController, @@ -12,6 +13,7 @@ from mopidy.backends.base import (Backend, CurrentPlaylistController, BasePlaybackProvider, StoredPlaylistsController, BaseStoredPlaylistsProvider) from mopidy.models import Playlist, Track, Album +from mopidy.outputs.base import BaseOutput from .translator import parse_m3u, parse_mpd_tag_cache @@ -49,6 +51,13 @@ class LocalBackend(ThreadingActor, Backend): self.uri_handlers = [u'file://'] + self.output = None + + def post_start(self): + output_refs = ActorRegistry.get_by_class(BaseOutput) + assert len(output_refs) == 1, 'Expected exactly one running output.' + self.output = output_refs[0].proxy() + class LocalPlaybackController(PlaybackController): def __init__(self, *args, **kwargs): diff --git a/mopidy/outputs/dummy.py b/mopidy/outputs/dummy.py index 738575f3..f09965f7 100644 --- a/mopidy/outputs/dummy.py +++ b/mopidy/outputs/dummy.py @@ -1,6 +1,8 @@ +from pykka.actor import ThreadingActor + from mopidy.outputs.base import BaseOutput -class DummyOutput(BaseOutput): +class DummyOutput(ThreadingActor, BaseOutput): """ Audio output used for testing. """ diff --git a/requirements/tests.txt b/requirements/tests.txt index 33f49451..fb54268f 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,2 +1,3 @@ coverage +mock nose diff --git a/tests/backends/base/current_playlist.py b/tests/backends/base/current_playlist.py index c2a9df6f..ee5e1111 100644 --- a/tests/backends/base/current_playlist.py +++ b/tests/backends/base/current_playlist.py @@ -1,9 +1,9 @@ +import mock import multiprocessing import random -from mopidy.mixers.dummy import DummyMixer from mopidy.models import Playlist, Track -from mopidy.outputs.dummy import DummyOutput +from mopidy.outputs.base import BaseOutput from tests.backends.base import populate_playlist @@ -11,19 +11,13 @@ class CurrentPlaylistControllerTest(object): tracks = [] def setUp(self): - self.core_queue = multiprocessing.Queue() - self.output = DummyOutput(self.core_queue) - self.backend = self.backend_class( - self.core_queue, self.output, DummyMixer) + self.backend = self.backend_class() + self.backend.output = mock.Mock(spec=BaseOutput) self.controller = self.backend.current_playlist self.playback = self.backend.playback assert len(self.tracks) == 3, 'Need three tracks to run tests.' - def tearDown(self): - self.backend.destroy() - self.output.destroy() - def test_add(self): for track in self.tracks: cp_track = self.controller.add(track) diff --git a/tests/backends/base/library.py b/tests/backends/base/library.py index 71f62147..bff26c4c 100644 --- a/tests/backends/base/library.py +++ b/tests/backends/base/library.py @@ -1,4 +1,3 @@ -from mopidy.mixers.dummy import DummyMixer from mopidy.models import Playlist, Track, Album, Artist from tests import SkipTest, data_folder @@ -15,12 +14,9 @@ class LibraryControllerTest(object): Track()] def setUp(self): - self.backend = self.backend_class(mixer_class=DummyMixer) + self.backend = self.backend_class() self.library = self.backend.library - def tearDown(self): - self.backend.destroy() - def test_refresh(self): self.library.refresh() diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index 77eb012d..aa200047 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -1,10 +1,10 @@ +import mock import multiprocessing import random import time -from mopidy.mixers.dummy import DummyMixer from mopidy.models import Track -from mopidy.outputs.dummy import DummyOutput +from mopidy.outputs.base import BaseOutput from tests import SkipTest from tests.backends.base import populate_playlist @@ -15,10 +15,8 @@ class PlaybackControllerTest(object): tracks = [] def setUp(self): - self.core_queue = multiprocessing.Queue() - self.output = DummyOutput(self.core_queue) - self.backend = self.backend_class( - self.core_queue, self.output, DummyMixer) + self.backend = self.backend_class() + self.backend.output = mock.Mock(spec=BaseOutput) self.playback = self.backend.playback self.current_playlist = self.backend.current_playlist @@ -27,10 +25,6 @@ class PlaybackControllerTest(object): assert self.tracks[0].length >= 2000, \ 'First song needs to be at least 2000 miliseconds' - def tearDown(self): - self.backend.destroy() - self.output.destroy() - def test_initial_state_is_stopped(self): self.assertEqual(self.playback.state, self.playback.STOPPED) @@ -733,10 +727,12 @@ class PlaybackControllerTest(object): self.assertEqual(self.playback.stop(), None) def test_time_position_when_stopped(self): + self.backend.output.get_position = mock.Mock(return_value=0) self.assertEqual(self.playback.time_position, 0) @populate_playlist def test_time_position_when_stopped_with_playlist(self): + self.backend.output.get_position = mock.Mock(return_value=0) self.assertEqual(self.playback.time_position, 0) @SkipTest # Uses sleep and does not work with LocalBackend+DummyOutput diff --git a/tests/backends/base/stored_playlists.py b/tests/backends/base/stored_playlists.py index 0ac0b167..12e48256 100644 --- a/tests/backends/base/stored_playlists.py +++ b/tests/backends/base/stored_playlists.py @@ -3,7 +3,6 @@ import shutil import tempfile from mopidy import settings -from mopidy.mixers.dummy import DummyMixer from mopidy.models import Playlist from tests import SkipTest, data_folder @@ -14,12 +13,10 @@ class StoredPlaylistsControllerTest(object): settings.LOCAL_TAG_CACHE_FILE = data_folder('library_tag_cache') settings.LOCAL_MUSIC_PATH = data_folder('') - self.backend = self.backend_class(mixer_class=DummyMixer) + self.backend = self.backend_class() self.stored = self.backend.stored_playlists def tearDown(self): - self.backend.destroy() - if os.path.exists(settings.LOCAL_PLAYLIST_PATH): shutil.rmtree(settings.LOCAL_PLAYLIST_PATH) diff --git a/tests/backends/local/stored_playlists_test.py b/tests/backends/local/stored_playlists_test.py index a7d9043f..5bc16d1c 100644 --- a/tests/backends/local/stored_playlists_test.py +++ b/tests/backends/local/stored_playlists_test.py @@ -70,8 +70,7 @@ class LocalStoredPlaylistsControllerTest(StoredPlaylistsControllerTest, self.stored.save(playlist) - self.backend.destroy() - self.backend = self.backend_class(mixer_class=DummyMixer) + self.backend = self.backend_class() self.stored = self.backend.stored_playlists self.assert_(self.stored.playlists)