← Back to team overview

openlp-core team mailing list archive

[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