From 333bc69777e5e97c98072c7cd5522643726c8d7b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 13 Feb 2015 00:58:09 +0100 Subject: [PATCH 1/4] jsonrpc: Don't use mixer in tests --- tests/utils/test_jsonrpc.py | 42 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/tests/utils/test_jsonrpc.py b/tests/utils/test_jsonrpc.py index 6e309c7c..535df175 100644 --- a/tests/utils/test_jsonrpc.py +++ b/tests/utils/test_jsonrpc.py @@ -13,6 +13,9 @@ from mopidy.utils import jsonrpc class Calculator(object): + def __init__(self): + self._mem = None + def model(self): return 'TI83' @@ -23,6 +26,12 @@ class Calculator(object): def sub(self, a, b): return a - b + def set_mem(self, value): + self._mem = value + + def get_mem(self): + return self._mem + def describe(self): return { 'add': 'Returns the sum of the terms', @@ -43,13 +52,14 @@ class JsonRpcTestBase(unittest.TestCase): def setUp(self): # noqa: N802 self.backend = dummy.create_dummy_backend_proxy() self.core = core.Core.start(backends=[self.backend]).proxy() + self.calc = Calculator() self.jrw = jsonrpc.JsonRpcWrapper( objects={ 'hello': lambda: 'Hello, world!', - 'calc': Calculator(), + 'calc': self.calc, 'core': self.core, - 'core.mixer': self.core.mixer, + 'core.playback': self.core.playback, 'core.tracklist': self.core.tracklist, 'get_uri_schemes': self.core.get_uri_schemes, }, @@ -188,12 +198,12 @@ class JsonRpcSingleCommandTest(JsonRpcTestBase): def test_call_method_on_actor_member(self): request = { 'jsonrpc': '2.0', - 'method': 'core.mixer.get_volume', + 'method': 'core.playback.get_time_position', 'id': 1, } response = self.jrw.handle_data(request) - self.assertEqual(response['result'], None) + self.assertEqual(response['result'], 0) def test_call_method_which_is_a_directly_mounted_actor_member(self): # 'get_uri_schemes' isn't a regular callable, but a Pykka @@ -215,26 +225,24 @@ class JsonRpcSingleCommandTest(JsonRpcTestBase): def test_call_method_with_positional_params(self): request = { 'jsonrpc': '2.0', - 'method': 'core.mixer.set_volume', - 'params': [37], + 'method': 'calc.add', + 'params': [3, 4], 'id': 1, } response = self.jrw.handle_data(request) - self.assertEqual(response['result'], None) - self.assertEqual(self.core.mixer.get_volume().get(), 37) + self.assertEqual(response['result'], 7) def test_call_methods_with_named_params(self): request = { 'jsonrpc': '2.0', - 'method': 'core.mixer.set_volume', - 'params': {'volume': 37}, + 'method': 'calc.add', + 'params': {'a': 3, 'b': 4}, 'id': 1, } response = self.jrw.handle_data(request) - self.assertEqual(response['result'], None) - self.assertEqual(self.core.mixer.get_volume().get(), 37) + self.assertEqual(response['result'], 7) class JsonRpcSingleNotificationTest(JsonRpcTestBase): @@ -248,17 +256,17 @@ class JsonRpcSingleNotificationTest(JsonRpcTestBase): self.assertIsNone(response) def test_notification_makes_an_observable_change(self): - self.assertEqual(self.core.mixer.get_volume().get(), None) + self.assertEqual(self.calc.get_mem(), None) request = { 'jsonrpc': '2.0', - 'method': 'core.mixer.set_volume', + 'method': 'calc.set_mem', 'params': [37], } response = self.jrw.handle_data(request) self.assertIsNone(response) - self.assertEqual(self.core.mixer.get_volume().get(), 37) + self.assertEqual(self.calc.get_mem(), 37) def test_notification_unknown_method_returns_nothing(self): request = { @@ -526,7 +534,7 @@ class JsonRpcBatchErrorTest(JsonRpcTestBase): def test_batch_of_both_successfull_and_failing_requests(self): request = [ # Call with positional params - {'jsonrpc': '2.0', 'method': 'core.mixer.set_volume', + {'jsonrpc': '2.0', 'method': 'core.playback.seek', 'params': [47], 'id': '1'}, # Notification {'jsonrpc': '2.0', 'method': 'core.tracklist.set_consume', @@ -547,7 +555,7 @@ class JsonRpcBatchErrorTest(JsonRpcTestBase): self.assertEqual(len(response), 5) response = dict((row['id'], row) for row in response) - self.assertEqual(response['1']['result'], None) + self.assertEqual(response['1']['result'], False) self.assertEqual(response['2']['result'], None) self.assertEqual(response[None]['error']['code'], -32600) self.assertEqual(response['5']['error']['code'], -32601) From 886c2b92d8dcc40577341245f7973d4a2d31aa90 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 13 Feb 2015 00:58:37 +0100 Subject: [PATCH 2/4] core: Use a mixer mock in tests --- tests/core/test_mixer.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tests/core/test_mixer.py b/tests/core/test_mixer.py index e3fa6be6..80e6f7ef 100644 --- a/tests/core/test_mixer.py +++ b/tests/core/test_mixer.py @@ -2,27 +2,34 @@ from __future__ import absolute_import, unicode_literals import unittest -from mopidy import core +import mock + +from mopidy import core, mixer class CoreMixerTest(unittest.TestCase): def setUp(self): # noqa: N802 - self.core = core.Core(mixer=None, backends=[]) + self.mixer = mock.Mock(spec=mixer.Mixer) + self.core = core.Core(mixer=self.mixer, backends=[]) - def test_volume(self): - self.assertEqual(self.core.mixer.get_volume(), None) - - self.core.mixer.set_volume(30) + def test_get_volume(self): + self.mixer.get_volume.return_value.get.return_value = 30 self.assertEqual(self.core.mixer.get_volume(), 30) + self.mixer.get_volume.assert_called_once_with() - self.core.mixer.set_volume(70) + def test_set_volume(self): + self.core.mixer.set_volume(30) - self.assertEqual(self.core.mixer.get_volume(), 70) + self.mixer.set_volume.assert_called_once_with(30) - def test_mute(self): - self.assertEqual(self.core.mixer.get_mute(), False) - - self.core.mixer.set_mute(True) + def test_get_mute(self): + self.mixer.get_mute.return_value.get.return_value = True self.assertEqual(self.core.mixer.get_mute(), True) + self.mixer.get_mute.assert_called_once_with() + + def test_set_mute(self): + self.core.mixer.set_mute(True) + + self.mixer.set_mute.assert_called_once_with(True) From 160afbcd265cfc0602213f7b07c6e4fa92f82cf2 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 13 Feb 2015 01:14:36 +0100 Subject: [PATCH 3/4] mpd: Use DummyMixer in tests --- mopidy/mixer.py | 22 ++++++++++++++++++++++ tests/mpd/protocol/__init__.py | 6 ++++-- tests/mpd/test_status.py | 6 ++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/mopidy/mixer.py b/mopidy/mixer.py index e277fe55..b9fc41ca 100644 --- a/mopidy/mixer.py +++ b/mopidy/mixer.py @@ -2,6 +2,8 @@ from __future__ import absolute_import, unicode_literals import logging +import pykka + from mopidy import listener @@ -147,3 +149,23 @@ class MixerListener(listener.Listener): :type mute: bool """ pass + + +class DummyMixer(pykka.ThreadingActor, Mixer): + + def __init__(self): + super(DummyMixer, self).__init__() + self._volume = None + self._mute = None + + def get_volume(self): + return self._volume + + def set_volume(self, volume): + self._volume = volume + + def get_mute(self): + return self._mute + + def set_mute(self, mute): + self._mute = mute diff --git a/tests/mpd/protocol/__init__.py b/tests/mpd/protocol/__init__.py index 8c7b60f1..ba446cb0 100644 --- a/tests/mpd/protocol/__init__.py +++ b/tests/mpd/protocol/__init__.py @@ -6,7 +6,7 @@ import mock import pykka -from mopidy import core +from mopidy import core, mixer from mopidy.backend import dummy from mopidy.mpd import session, uri_mapper @@ -32,8 +32,10 @@ class BaseTestCase(unittest.TestCase): } def setUp(self): # noqa: N802 + self.mixer = mixer.DummyMixer.start().proxy() self.backend = dummy.create_dummy_backend_proxy() - self.core = core.Core.start(backends=[self.backend]).proxy() + self.core = core.Core.start( + mixer=self.mixer, backends=[self.backend]).proxy() self.uri_map = uri_mapper.MpdUriMapper(self.core) self.connection = MockConnection() diff --git a/tests/mpd/test_status.py b/tests/mpd/test_status.py index 75c10c94..8dbfb1e4 100644 --- a/tests/mpd/test_status.py +++ b/tests/mpd/test_status.py @@ -4,7 +4,7 @@ import unittest import pykka -from mopidy import core +from mopidy import core, mixer from mopidy.backend import dummy from mopidy.core import PlaybackState from mopidy.models import Track @@ -21,8 +21,10 @@ STOPPED = PlaybackState.STOPPED class StatusHandlerTest(unittest.TestCase): def setUp(self): # noqa: N802 + self.mixer = mixer.DummyMixer.start().proxy() self.backend = dummy.create_dummy_backend_proxy() - self.core = core.Core.start(backends=[self.backend]).proxy() + self.core = core.Core.start( + mixer=self.mixer, backends=[self.backend]).proxy() self.dispatcher = dispatcher.MpdDispatcher(core=self.core) self.context = self.dispatcher.context From f7e218b72a09615259b4d77e9169f5237a4cae32 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 13 Feb 2015 00:58:52 +0100 Subject: [PATCH 4/4] core: Remove test-only code paths in MixerController --- mopidy/core/mixer.py | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/mopidy/core/mixer.py b/mopidy/core/mixer.py index e6856f17..4d77f8bc 100644 --- a/mopidy/core/mixer.py +++ b/mopidy/core/mixer.py @@ -21,11 +21,8 @@ class MixerController(object): The volume scale is linear. """ - if self._mixer: + if self._mixer is not None: return self._mixer.get_volume().get() - else: - # For testing - return self._volume def set_volume(self, volume): """Set the volume. @@ -34,31 +31,22 @@ class MixerController(object): The volume scale is linear. """ - if self._mixer: + if self._mixer is not None: self._mixer.set_volume(volume) - else: - # For testing - self._volume = volume def get_mute(self): """Get mute state. - :class:`True` if muted, :class:`False` otherwise. + :class:`True` if muted, :class:`False` unmuted, :class:`None` if + unknown. """ - if self._mixer: + if self._mixer is not None: return self._mixer.get_mute().get() - else: - # For testing - return self._mute def set_mute(self, mute): """Set mute state. :class:`True` to mute, :class:`False` to unmute. """ - mute = bool(mute) - if self._mixer: - self._mixer.set_mute(mute) - else: - # For testing - self._mute = mute + if self._mixer is not None: + self._mixer.set_mute(bool(mute))