From fbf3d23fd86ac0fbbdd269a00b4e8bfc0ca3910b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 5 Jun 2011 01:11:30 +0200 Subject: [PATCH] Some initial simple unit testing of the MPRIS frontend, without real D-Bus or real backend --- mopidy/frontends/mpris.py | 31 +++++++++++-------- .../frontends/mpris/player_interface_test.py | 31 +++++++++++++++++++ tests/frontends/mpris/root_interface_test.py | 22 +++++++++++++ 3 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 tests/frontends/mpris/player_interface_test.py create mode 100644 tests/frontends/mpris/root_interface_test.py diff --git a/mopidy/frontends/mpris.py b/mopidy/frontends/mpris.py index 4f02267a..d2f982e3 100644 --- a/mopidy/frontends/mpris.py +++ b/mopidy/frontends/mpris.py @@ -131,17 +131,26 @@ class MprisObject(dbus.service.Object): } def __init__(self): - backend_refs = ActorRegistry.get_by_class(Backend) - assert len(backend_refs) == 1, 'Expected exactly one running backend.' - self.backend = backend_refs[0].proxy() + self._backend = None + bus_name = self._connect_to_dbus() + super(MprisObject, self).__init__(bus_name, OBJECT_PATH) + def _connect_to_dbus(self): logger.debug(u'Connecting to D-Bus...') bus_name = dbus.service.BusName(BUS_NAME, dbus.SessionBus()) - super(MprisObject, self).__init__(bus_name, OBJECT_PATH) logger.info(u'Connected to D-Bus') + return bus_name + + @property + def backend(self): + if self._backend is None: + backend_refs = ActorRegistry.get_by_class(Backend) + assert len(backend_refs) == 1, 'Expected exactly one running backend.' + self._backend = backend_refs[0].proxy() + return self._backend - ### Property interface + ### Properties interface @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @@ -214,8 +223,7 @@ class MprisObject(dbus.service.Object): @dbus.service.method(dbus_interface=PLAYER_IFACE) def Next(self): logger.debug(u'%s.Next called', PLAYER_IFACE) - # TODO call playback.next(), keep playback.state unchanged - # XXX Proof of concept only. Throw away, write tests. + # TODO keep playback.state unchanged self.backend.playback.next().get() @dbus.service.method(dbus_interface=PLAYER_IFACE) @@ -232,7 +240,6 @@ class MprisObject(dbus.service.Object): @dbus.service.method(dbus_interface=PLAYER_IFACE) def Pause(self): logger.debug(u'%s.Pause called', PLAYER_IFACE) - # XXX Proof of concept only. Throw away, write tests. self.backend.playback.pause().get() @dbus.service.method(dbus_interface=PLAYER_IFACE) @@ -258,9 +265,7 @@ class MprisObject(dbus.service.Object): @dbus.service.method(dbus_interface=PLAYER_IFACE) def Previous(self): logger.debug(u'%s.Previous called', PLAYER_IFACE) - - # TODO call playback.previous(), keep playback.state unchanged - # XXX Proof of concept only. Throw away, write tests, reimplement: + # TODO keep playback.state unchanged self.backend.playback.previous().get() @dbus.service.method(dbus_interface=PLAYER_IFACE) @@ -287,10 +292,10 @@ class MprisObject(dbus.service.Object): @dbus.service.method(dbus_interface=PLAYER_IFACE) def Stop(self): logger.debug(u'%s.Stop called', PLAYER_IFACE) - # TODO call playback.stop() - pass + self.backend.playback.stop().get() @dbus.service.signal(dbus_interface=PLAYER_IFACE, signature='x') def Seeked(self, position): logger.debug(u'%s.Seeked signaled', PLAYER_IFACE) + # TODO What should we do here? pass diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py new file mode 100644 index 00000000..d44196a0 --- /dev/null +++ b/tests/frontends/mpris/player_interface_test.py @@ -0,0 +1,31 @@ +import mock +import unittest + +from pykka.registry import ActorRegistry + +from mopidy.backends.base import Backend +from mopidy.frontends import mpris + +class PlayerInterfaceTest(unittest.TestCase): + def setUp(self): + mpris.ActorRegistry = mock.Mock(spec=ActorRegistry) + mpris.MprisObject._connect_to_dbus = mock.Mock() + self.backend = mock.Mock(spec=Backend) + self.mpris_object = mpris.MprisObject() + self.mpris_object._backend = self.backend + + def test_next_should_call_next_on_backend(self): + self.mpris_object.Next() + self.assert_(self.backend.playback.next.called) + + def test_pause_should_call_pause_on_backend(self): + self.mpris_object.Pause() + self.assert_(self.backend.playback.pause.called) + + def test_previous_should_call_previous_on_backend(self): + self.mpris_object.Previous() + self.assert_(self.backend.playback.previous.called) + + def test_stop_should_call_stop_on_backend(self): + self.mpris_object.Stop() + self.assert_(self.backend.playback.stop.called) diff --git a/tests/frontends/mpris/root_interface_test.py b/tests/frontends/mpris/root_interface_test.py new file mode 100644 index 00000000..864fdf4e --- /dev/null +++ b/tests/frontends/mpris/root_interface_test.py @@ -0,0 +1,22 @@ +import mock +import unittest + +from pykka.registry import ActorRegistry + +from mopidy.frontends import mpris + +class RootInterfaceTest(unittest.TestCase): + def setUp(self): + mpris.ActorRegistry = mock.Mock(spec=ActorRegistry) + mpris.MprisObject._connect_to_dbus = mock.Mock() + self.mpris_object = mpris.MprisObject() + + def test_constructor_connects_to_dbus(self): + self.assert_(self.mpris_object._connect_to_dbus.called) + + def test_raise_does_nothing(self): + self.mpris_object.Raise() + + def test_quit_should_stop_all_actors(self): + self.mpris_object.Quit() + self.assert_(mpris.ActorRegistry.stop_all.called)