openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #27901
[Merge] lp:~trb143/openlp/bug-1518634 into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/bug-1518634 into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Related bugs:
Bug #1518634 in OpenLP: "Saved Service with Unavailable player crashes"
https://bugs.launchpad.net/openlp/+bug/1518634
For more details, see:
https://code.launchpad.net/~trb143/openlp/bug-1518634/+merge/278894
Fix missing players
lp:~trb143/openlp/bug-1518634 (revision 2572)
[SUCCESS] https//ci.openlp.io/job/Branch-01-Pull/1185/
[SUCCESS] https//ci.openlp.io/job/Branch-02-Functional-Tests/1108/
[SUCCESS] https//ci.openlp.io/job/Branch-03-Interface-Tests/1049/
[SUCCESS] https//ci.openlp.io/job/Branch-04a-Windows_Functional_Tests/896/
[SUCCESS] https//ci.openlp.io/job/Branch-04b-Windows_Interface_Tests/492/
[SUCCESS] https//ci.openlp.io/job/Branch-05a-Code_Analysis/608/
[SUCCESS] https//ci.openlp.io/job/Branch-05b-Test_Coverage/479/
--
Your team OpenLP Core is requested to review the proposed merge of lp:~trb143/openlp/bug-1518634 into lp:openlp.
=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py 2015-06-15 20:29:34 +0000
+++ openlp/core/ui/media/mediacontroller.py 2015-11-28 20:17:51 +0000
@@ -514,9 +514,14 @@
:param display: Which display to use
:param service_item: The ServiceItem containing the details to be played.
"""
- used_players = get_media_players()[0]
+ used_players = get_media_players()
+ default_player = used_players[0]
if service_item.processor and service_item.processor != UiStrings().Automatic:
- used_players = [service_item.processor.lower()]
+ # check to see if the player is usable else use the default one.
+ if not service_item.processor.lower() in used_players:
+ used_players = default_player
+ else:
+ used_players = [service_item.processor.lower()]
# If no player, we can't play
if not used_players:
return False
=== modified file 'openlp/plugins/presentations/lib/messagelistener.py'
--- openlp/plugins/presentations/lib/messagelistener.py 2015-06-05 21:22:16 +0000
+++ openlp/plugins/presentations/lib/messagelistener.py 2015-11-28 20:17:51 +0000
@@ -290,6 +290,13 @@
log.info('Message Listener loaded')
def __init__(self, media_item):
+ self._setup(media_item)
+
+ def _setup(self, media_item):
+ """
+ Start up code moved out to make mocking easier
+ :param media_item: The plugin media item handing Presentations
+ """
self.controllers = media_item.controllers
self.media_item = media_item
self.preview_handler = Controller(False)
@@ -346,6 +353,12 @@
self.handler = self.media_item.find_controller_by_type(file)
if not self.handler:
return
+ else:
+ # the saved handler is not present so need to use one based on file suffix.
+ if not self.controllers[self.handler].available:
+ self.handler = self.media_item.find_controller_by_type(file)
+ if not self.handler:
+ return
if is_live:
controller = self.live_handler
else:
=== added file 'tests/functional/openlp_plugins/presentations/test_messagelistener.py'
--- tests/functional/openlp_plugins/presentations/test_messagelistener.py 1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_plugins/presentations/test_messagelistener.py 2015-11-28 20:17:51 +0000
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2015 OpenLP Developers #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it #
+# under the terms of the GNU General Public License as published by the Free #
+# Software Foundation; version 2 of the License. #
+# #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
+# more details. #
+# #
+# You should have received a copy of the GNU General Public License along #
+# with this program; if not, write to the Free Software Foundation, Inc., 59 #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
+###############################################################################
+"""
+This module contains tests for the lib submodule of the Presentations plugin.
+"""
+from unittest import TestCase
+
+from openlp.core.common import Registry
+from openlp.plugins.presentations.lib.mediaitem import MessageListener, PresentationMediaItem
+from tests.functional import patch, MagicMock
+from tests.helpers.testmixin import TestMixin
+
+
+class TestMessageListener(TestCase, TestMixin):
+ """
+ Test the Presentation Message Listener.
+ """
+ def setUp(self):
+ """
+ Set up the components need for all tests.
+ """
+ Registry.create()
+ Registry().register('service_manager', MagicMock())
+ Registry().register('main_window', MagicMock())
+ with patch('openlp.plugins.presentations.lib.mediaitem.MediaManagerItem._setup'), \
+ patch('openlp.plugins.presentations.lib.mediaitem.PresentationMediaItem.setup_item'):
+ self.media_item = PresentationMediaItem(None, MagicMock, MagicMock())
+
+ @patch('openlp.plugins.presentations.lib.mediaitem.MessageListener._setup')
+ def start_presentation_test(self, media_mock):
+ """
+ Find and chose a controller to play a presentations.
+ """
+ # GIVEN: A single controller and service item wanting to use the controller
+ mock_item = MagicMock()
+ mock_item.processor = 'Powerpoint'
+ mock_item.get_frame_path.return_value = "test.ppt"
+ self.media_item.automatic = False
+ mocked_controller = MagicMock()
+ mocked_controller.available = True
+ mocked_controller.supports = ['ppt']
+ controllers = {
+ 'Powerpoint': mocked_controller
+ }
+ ml = MessageListener(self.media_item)
+ ml.media_item = self.media_item
+ ml.controllers = controllers
+ ml.preview_handler = MagicMock()
+ ml.timer = MagicMock()
+
+ # WHEN: request the presentation to start
+ ml.startup([mock_item, False, False, False])
+
+ # THEN: The controllers will be setup.
+ self.assertTrue(len(controllers), 'We have loaded a controller')
+
+ @patch('openlp.plugins.presentations.lib.mediaitem.MessageListener._setup')
+ def start_presentation_with_no_player_test(self, media_mock):
+ """
+ Find and chose a controller to play a presentations when the player is not available.
+ """
+ # GIVEN: A single controller and service item wanting to use the controller
+ mock_item = MagicMock()
+ mock_item.processor = 'Powerpoint'
+ mock_item.get_frame_path.return_value = "test.ppt"
+ self.media_item.automatic = False
+ mocked_controller = MagicMock()
+ mocked_controller.available = True
+ mocked_controller.supports = ['ppt']
+ mocked_controller1 = MagicMock()
+ mocked_controller1.available = False
+ mocked_controller1.supports = ['ppt']
+ controllers = {
+ 'Impress': mocked_controller,
+ 'Powerpoint': mocked_controller1
+ }
+ ml = MessageListener(self.media_item)
+ ml.media_item = self.media_item
+ ml.controllers = controllers
+ ml.preview_handler = MagicMock()
+ ml.timer = MagicMock()
+
+ # WHEN: request the presentation to start
+ ml.startup([mock_item, False, False, False])
+
+ # THEN: The controllers will be setup.
+ self.assertTrue(len(controllers), 'We have loaded a controller')
Follow ups