Esempio n. 1
0
 def test_single_click_timeout_single(self, mocked_make_preview):
     """
     Test that when a single click has been registered, the item is sent to preview
     """
     # GIVEN: A service manager.
     service_manager = ServiceManager(None)
     # WHEN: on_single_click_preview() is called
     service_manager.on_single_click_preview_timeout()
     # THEN: make_preview() should have been called
     assert mocked_make_preview.call_count == 1, 'ServiceManager.make_preview() should have been called once'
Esempio n. 2
0
 def setUp(self):
     """
     Create the UI
     """
     Registry.create()
     self.setup_application()
     Registry().register('application', MagicMock())
     Registry().register('main_window', MagicMock(service_manager_settings_section='servicemanager'))
     self.service_manager = ServiceManager()
     self.add_toolbar_action_patcher = patch('openlp.core.ui.servicemanager.OpenLPToolbar.add_toolbar_action')
     self.mocked_add_toolbar_action = self.add_toolbar_action_patcher.start()
     self.mocked_add_toolbar_action.side_effect = self._create_mock_action
Esempio n. 3
0
    def test_save_file_raises_permission_error(self, mocked_os,
                                               mocked_save_file_as,
                                               mocked_zipfile):
        """
        Test that when a PermissionError is raised when trying to save a file, it is handled correctly
        """
        # GIVEN: A service manager, a service to save
        mocked_main_window = MagicMock()
        mocked_main_window.service_manager_settings_section = 'servicemanager'
        Registry().register('main_window', mocked_main_window)
        Registry().register('application', MagicMock())
        service_manager = ServiceManager(None)
        service_manager._service_path = MagicMock()
        service_manager._save_lite = False
        service_manager.service_items = []
        service_manager.service_theme = 'Default'
        service_manager.service_manager_list = MagicMock()
        mocked_save_file_as.return_value = True
        mocked_zipfile.ZipFile.return_value = MagicMock()
        mocked_os.link.side_effect = PermissionError

        # WHEN: The service is saved and a PermissionError is raised
        result = service_manager.save_file()

        # THEN: The "save_as" method is called to save the service
        assert result is True
        mocked_save_file_as.assert_called_with()
Esempio n. 4
0
 def test_single_click_preview_false(self, mocked_singleShot,
                                     MockedSettings):
     """
     Test that when "Preview items when clicked in Service Manager" disabled the preview timer doesn't start
     """
     # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager.
     mocked_settings = MagicMock()
     mocked_settings.value.return_value = False
     MockedSettings.return_value = mocked_settings
     service_manager = ServiceManager(None)
     # WHEN: on_single_click_preview() is called
     service_manager.on_single_click_preview()
     # THEN: timer should not be started
     assert mocked_singleShot.call_count == 0, 'Should not be called'
Esempio n. 5
0
 def test_create_basic_service(self):
     """
     Test the create basic service array
     """
     # GIVEN: A new service manager instance.
     service_manager = ServiceManager(None)
     # WHEN: when the basic service array is created.
     service_manager._save_lite = False
     service_manager.service_theme = 'test_theme'
     service = service_manager.create_basic_service()[0]
     # THEN: The controller should be registered in the registry.
     assert service is not None, 'The base service should be created'
     assert service['openlp_core'][
         'service-theme'] == 'test_theme', 'The test theme should be saved'
     assert service['openlp_core'][
         'lite-service'] is False, 'The lite service should be saved'
Esempio n. 6
0
 def test_single_click_preview_true(self, mocked_singleShot,
                                    MockedSettings):
     """
     Test that when "Preview items when clicked in Service Manager" enabled the preview timer starts
     """
     # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager.
     mocked_settings = MagicMock()
     mocked_settings.value.return_value = True
     MockedSettings.return_value = mocked_settings
     service_manager = ServiceManager(None)
     # WHEN: on_single_click_preview() is called
     service_manager.on_single_click_preview()
     # THEN: timer should have been started
     mocked_singleShot.assert_called_with(
         PyQt5.QtWidgets.QApplication.instance().doubleClickInterval(),
         service_manager.on_single_click_preview_timeout)
Esempio n. 7
0
 def test_initial_service_manager(self):
     """
     Test the initial of service manager.
     """
     # GIVEN: A new service manager instance.
     ServiceManager(None)
     # WHEN: the default service manager is built.
     # THEN: The the controller should be registered in the registry.
     assert Registry().get(
         'service_manager'
     ) is not None, 'The base service manager should be registered'
Esempio n. 8
0
    def test_theme_change_song(self, mocked_regenerate_service_items):
        """
        Test that when a Toolbar theme combobox displays correctly when the theme is set to Song
        """
        # GIVEN: A service manager, a service to display with a theme level in the renderer
        mocked_renderer = MagicMock()
        service_manager = ServiceManager(None)
        Registry().register('renderer', mocked_renderer)
        service_manager.toolbar = OpenLPToolbar(None)
        service_manager.toolbar.add_toolbar_action('theme_combo_box',
                                                   triggers=MagicMock())
        service_manager.toolbar.add_toolbar_action('theme_label',
                                                   triggers=MagicMock())

        # WHEN: The service manager has a Song theme
        mocked_renderer.theme_level = ThemeLevel.Song
        service_manager.theme_change()

        # THEN: The the theme toolbar should  be visible
        assert service_manager.toolbar.actions['theme_combo_box'].isVisible() is True, \
            'The visibility should be True'
Esempio n. 9
0
 def test_single_click_timeout_double(self, mocked_make_live,
                                      mocked_make_preview):
     """
     Test that when a double click has been registered, the item does not goes to preview
     """
     # GIVEN: A service manager.
     service_manager = ServiceManager(None)
     # WHEN: on_single_click_preview() is called after a double click
     service_manager.on_double_click_live()
     service_manager.on_single_click_preview_timeout()
     # THEN: make_preview() should not have been called
     assert mocked_make_preview.call_count == 0, 'ServiceManager.make_preview() should not be called'
Esempio n. 10
0
 def test_supported_suffixes(self):
     """
     Test the create basic service array
     """
     # GIVEN: A new service manager instance.
     service_manager = ServiceManager(None)
     # WHEN: a suffix is added as an individual or a list.
     service_manager.supported_suffixes('txt')
     service_manager.supported_suffixes(['pptx', 'ppt'])
     # THEN: The suffixes should be available to test.
     assert 'txt' in service_manager.suffixes, 'The suffix txt should be in the list'
     assert 'ppt' in service_manager.suffixes, 'The suffix ppt should be in the list'
     assert 'pptx' in service_manager.suffixes, 'The suffix pptx should be in the list'
Esempio n. 11
0
 def test_single_click_preview_double(self, mocked_make_live,
                                      mocked_singleShot, MockedSettings):
     """
     Test that when a double click has registered the preview timer doesn't start
     """
     # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager.
     mocked_settings = MagicMock()
     mocked_settings.value.return_value = True
     MockedSettings.return_value = mocked_settings
     service_manager = ServiceManager(None)
     # WHEN: on_single_click_preview() is called following a double click
     service_manager.on_double_click_live()
     service_manager.on_single_click_preview()
     # THEN: timer should not be started
     mocked_make_live.assert_called_with()
     assert mocked_singleShot.call_count == 0, 'Should not be called'
Esempio n. 12
0
class TestServiceManager(TestCase, TestMixin):
    """
    Test the service manager
    """
    def _create_mock_action(self, name, **kwargs):
        """
        Create a fake action with some "real" attributes
        """
        action = QtWidgets.QAction(self.service_manager)
        action.setObjectName(name)
        if kwargs.get('triggers'):
            action.triggered.connect(kwargs.pop('triggers'))
        self.service_manager.toolbar.actions[name] = action
        return action

    def setUp(self):
        """
        Create the UI
        """
        Registry.create()
        self.setup_application()
        Registry().register('application', MagicMock())
        Registry().register(
            'main_window',
            MagicMock(service_manager_settings_section='servicemanager'))
        self.service_manager = ServiceManager()
        self.add_toolbar_action_patcher = patch(
            'openlp.core.ui.servicemanager.OpenLPToolbar.add_toolbar_action')
        self.mocked_add_toolbar_action = self.add_toolbar_action_patcher.start(
        )
        self.mocked_add_toolbar_action.side_effect = self._create_mock_action

    def tearDown(self):
        """
        Delete all the C++ objects at the end so that we don't have a segfault
        """
        self.add_toolbar_action_patcher.stop()
        del self.service_manager

    def test_basic_service_manager(self):
        """
        Test the Service Manager UI Functionality
        """
        # GIVEN: A New Service Manager instance
        # WHEN I have set up the display
        self.service_manager.setup_ui(self.service_manager)

        # THEN the count of items should be zero
        assert self.service_manager.service_manager_list.topLevelItemCount() == 0, \
            'The service manager list should be empty '

    @patch('openlp.core.ui.servicemanager.QtWidgets.QTreeWidget.itemAt')
    @patch('openlp.core.ui.servicemanager.QtWidgets.QWidget.mapToGlobal')
    @patch('openlp.core.ui.servicemanager.QtWidgets.QMenu.exec')
    def test_default_context_menu(self, mocked_exec, mocked_mapToGlobal,
                                  mocked_item_at_method):
        """
        Test the context_menu() method with a default service item
        """
        # GIVEN: A service item added
        mocked_item = MagicMock()
        mocked_item.parent.return_value = None
        mocked_item_at_method.return_value = mocked_item
        mocked_item.data.return_value = 1
        self.service_manager.setup_ui(self.service_manager)
        # A service item without capabilities.
        service_item = ServiceItem()
        self.service_manager.service_items = [{'service_item': service_item}]
        q_point = None
        # Mocked actions.
        self.service_manager.edit_action.setVisible = MagicMock()
        self.service_manager.create_custom_action.setVisible = MagicMock()
        self.service_manager.maintain_action.setVisible = MagicMock()
        self.service_manager.notes_action.setVisible = MagicMock()
        self.service_manager.time_action.setVisible = MagicMock()
        self.service_manager.auto_start_action.setVisible = MagicMock()

        # WHEN: Show the context menu.
        self.service_manager.context_menu(q_point)

        # THEN: The following actions should be not visible.
        self.service_manager.edit_action.setVisible.assert_called_once_with(False), \
            'The action should be set invisible.'
        self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \
            'The action should be set invisible.'
        self.service_manager.maintain_action.setVisible.assert_called_once_with(False), \
            'The action should be set invisible.'
        self.service_manager.notes_action.setVisible.assert_called_with(
            True), 'The action should be set visible.'
        self.service_manager.time_action.setVisible.assert_called_once_with(False), \
            'The action should be set invisible.'
        self.service_manager.auto_start_action.setVisible.assert_called_once_with(False), \
            'The action should be set invisible.'

    def test_edit_context_menu(self):
        """
        Test the context_menu() method with a edit service item
        """
        # GIVEN: A service item added
        self.service_manager.setup_ui(self.service_manager)
        with patch('PyQt5.QtWidgets.QTreeWidget.itemAt') as mocked_item_at_method, \
                patch('PyQt5.QtWidgets.QWidget.mapToGlobal'), \
                patch('PyQt5.QtWidgets.QMenu.exec'):
            mocked_item = MagicMock()
            mocked_item.parent.return_value = None
            mocked_item_at_method.return_value = mocked_item
            # We want 1 to be returned for the position
            mocked_item.data.return_value = 1
            # A service item without capabilities.
            service_item = ServiceItem()
            service_item.add_capability(ItemCapabilities.CanEdit)
            service_item.edit_id = 1
            self.service_manager.service_items = [{
                'service_item': service_item
            }]
            q_point = None
            # Mocked actions.
            self.service_manager.edit_action.setVisible = MagicMock()
            self.service_manager.create_custom_action.setVisible = MagicMock()
            self.service_manager.maintain_action.setVisible = MagicMock()
            self.service_manager.notes_action.setVisible = MagicMock()
            self.service_manager.time_action.setVisible = MagicMock()
            self.service_manager.auto_start_action.setVisible = MagicMock()

            # WHEN: Show the context menu.
            self.service_manager.context_menu(q_point)

            # THEN: The following actions should be not visible.
            self.service_manager.edit_action.setVisible.assert_called_with(True), \
                'The action should be set visible.'
            self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.maintain_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.notes_action.setVisible.assert_called_with(
                True), 'The action should be set visible.'
            self.service_manager.time_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.auto_start_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'

    def test_maintain_context_menu(self):
        """
        Test the context_menu() method with a maintain
        """
        # GIVEN: A service item added
        self.service_manager.setup_ui(self.service_manager)
        with patch('PyQt5.QtWidgets.QTreeWidget.itemAt') as mocked_item_at_method, \
                patch('PyQt5.QtWidgets.QWidget.mapToGlobal'), \
                patch('PyQt5.QtWidgets.QMenu.exec'):
            mocked_item = MagicMock()
            mocked_item.parent.return_value = None
            mocked_item_at_method.return_value = mocked_item
            # We want 1 to be returned for the position
            mocked_item.data.return_value = 1
            # A service item without capabilities.
            service_item = ServiceItem()
            service_item.add_capability(ItemCapabilities.CanMaintain)
            self.service_manager.service_items = [{
                'service_item': service_item
            }]
            q_point = None
            # Mocked actions.
            self.service_manager.edit_action.setVisible = MagicMock()
            self.service_manager.create_custom_action.setVisible = MagicMock()
            self.service_manager.maintain_action.setVisible = MagicMock()
            self.service_manager.notes_action.setVisible = MagicMock()
            self.service_manager.time_action.setVisible = MagicMock()
            self.service_manager.auto_start_action.setVisible = MagicMock()

            # WHEN: Show the context menu.
            self.service_manager.context_menu(q_point)

            # THEN: The following actions should be not visible.
            self.service_manager.edit_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.maintain_action.setVisible.assert_called_with(True), \
                'The action should be set visible.'
            self.service_manager.notes_action.setVisible.assert_called_with(
                True), 'The action should be set visible.'
            self.service_manager.time_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.auto_start_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'

    def test_loopy_context_menu(self):
        """
        Test the context_menu() method with a loop
        """
        # GIVEN: A service item added
        self.service_manager.setup_ui(self.service_manager)
        with patch('PyQt5.QtWidgets.QTreeWidget.itemAt') as mocked_item_at_method, \
                patch('PyQt5.QtWidgets.QWidget.mapToGlobal'), \
                patch('PyQt5.QtWidgets.QMenu.exec'):
            mocked_item = MagicMock()
            mocked_item.parent.return_value = None
            mocked_item_at_method.return_value = mocked_item
            # We want 1 to be returned for the position
            mocked_item.data.return_value = 1
            # A service item without capabilities.
            service_item = ServiceItem()
            service_item.add_capability(ItemCapabilities.CanLoop)
            service_item.slides.append("One")
            service_item.slides.append("Two")
            self.service_manager.service_items = [{
                'service_item': service_item
            }]
            q_point = None
            # Mocked actions.
            self.service_manager.edit_action.setVisible = MagicMock()
            self.service_manager.create_custom_action.setVisible = MagicMock()
            self.service_manager.maintain_action.setVisible = MagicMock()
            self.service_manager.notes_action.setVisible = MagicMock()
            self.service_manager.time_action.setVisible = MagicMock()
            self.service_manager.auto_start_action.setVisible = MagicMock()

            # WHEN: Show the context menu.
            self.service_manager.context_menu(q_point)

            # THEN: The following actions should be not visible.
            self.service_manager.edit_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.maintain_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.notes_action.setVisible.assert_called_with(
                True), 'The action should be set visible.'
            self.service_manager.time_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.auto_start_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'

    def test_start_time_context_menu(self):
        """
        Test the context_menu() method with a start time
        """
        # GIVEN: A service item added
        self.service_manager.setup_ui(self.service_manager)
        with patch('PyQt5.QtWidgets.QTreeWidget.itemAt') as mocked_item_at_method, \
                patch('PyQt5.QtWidgets.QWidget.mapToGlobal'), \
                patch('PyQt5.QtWidgets.QMenu.exec'):
            mocked_item = MagicMock()
            mocked_item.parent.return_value = None
            mocked_item_at_method.return_value = mocked_item
            # We want 1 to be returned for the position
            mocked_item.data.return_value = 1
            # A service item without capabilities.
            service_item = ServiceItem()
            service_item.add_capability(ItemCapabilities.HasVariableStartTime)
            self.service_manager.service_items = [{
                'service_item': service_item
            }]
            q_point = None
            # Mocked actions.
            self.service_manager.edit_action.setVisible = MagicMock()
            self.service_manager.create_custom_action.setVisible = MagicMock()
            self.service_manager.maintain_action.setVisible = MagicMock()
            self.service_manager.notes_action.setVisible = MagicMock()
            self.service_manager.time_action.setVisible = MagicMock()
            self.service_manager.auto_start_action.setVisible = MagicMock()

            # WHEN: Show the context menu.
            self.service_manager.context_menu(q_point)

            # THEN: The following actions should be not visible.
            self.service_manager.edit_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.maintain_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.notes_action.setVisible.assert_called_with(
                True), 'The action should be set visible.'
            self.service_manager.time_action.setVisible.assert_called_with(True), \
                'The action should be set visible.'
            self.service_manager.auto_start_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'

    def test_auto_start_context_menu(self):
        """
        Test the context_menu() method with can auto start
        """
        # GIVEN: A service item added
        self.service_manager.setup_ui(self.service_manager)
        with patch('PyQt5.QtWidgets.QTreeWidget.itemAt') as mocked_item_at_method, \
                patch('PyQt5.QtWidgets.QWidget.mapToGlobal'), \
                patch('PyQt5.QtWidgets.QMenu.exec'):
            mocked_item = MagicMock()
            mocked_item.parent.return_value = None
            mocked_item_at_method.return_value = mocked_item
            # We want 1 to be returned for the position
            mocked_item.data.return_value = 1
            # A service item without capabilities.
            service_item = ServiceItem()
            service_item.add_capability(ItemCapabilities.CanAutoStartForLive)
            self.service_manager.service_items = [{
                'service_item': service_item
            }]
            q_point = None
            # Mocked actions.
            self.service_manager.edit_action.setVisible = MagicMock()
            self.service_manager.create_custom_action.setVisible = MagicMock()
            self.service_manager.maintain_action.setVisible = MagicMock()
            self.service_manager.notes_action.setVisible = MagicMock()
            self.service_manager.time_action.setVisible = MagicMock()
            self.service_manager.auto_start_action.setVisible = MagicMock()
            self.service_manager.rename_action.setVisible = MagicMock()

            # WHEN: Show the context menu.
            self.service_manager.context_menu(q_point)

            # THEN: The following actions should be not visible.
            self.service_manager.edit_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.maintain_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.notes_action.setVisible.assert_called_with(
                True), 'The action should be set visible.'
            self.service_manager.time_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'
            self.service_manager.auto_start_action.setVisible.assert_called_with(True), \
                'The action should be set visible.'
            self.service_manager.rename_action.setVisible.assert_called_once_with(False), \
                'The action should be set invisible.'

    def test_click_on_new_service(self):
        """
        Test the on_new_service event handler is called by the UI
        """
        # GIVEN: An initial form
        mocked_event = MagicMock()
        self.service_manager.on_new_service_clicked = mocked_event
        self.service_manager.setup_ui(self.service_manager)

        # WHEN displaying the UI and pressing cancel
        new_service = self.service_manager.toolbar.actions['newService']
        new_service.trigger()

        assert mocked_event.call_count == 1, 'The on_new_service_clicked method should have been called once'

    def test_expand_selection_on_right_arrow(self):
        """
        Test that a right arrow key press event calls the on_expand_selection function
        """
        # GIVEN a mocked expand function
        self.service_manager.on_expand_selection = MagicMock()

        # WHEN the right arrow key event is called
        self.service_manager.setup_ui(self.service_manager)
        event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Right,
                                QtCore.Qt.NoModifier)
        self.service_manager.service_manager_list.keyPressEvent(event)

        # THEN the on_expand_selection function should have been called.
        self.service_manager.on_expand_selection.assert_called_once_with()

    def test_collapse_selection_on_left_arrow(self):
        """
        Test that a left arrow key press event calls the on_collapse_selection function
        """
        # GIVEN a mocked collapse function
        self.service_manager.on_collapse_selection = MagicMock()

        # WHEN the left arrow key event is called
        self.service_manager.setup_ui(self.service_manager)
        event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Left,
                                QtCore.Qt.NoModifier)
        self.service_manager.service_manager_list.keyPressEvent(event)

        # THEN the on_collapse_selection function should have been called.
        self.service_manager.on_collapse_selection.assert_called_once_with()

    def test_move_selection_down_on_down_arrow(self):
        """
        Test that a down arrow key press event calls the on_move_selection_down function
        """
        # GIVEN a mocked move down function
        self.service_manager.on_move_selection_down = MagicMock()

        # WHEN the down arrow key event is called
        self.service_manager.setup_ui(self.service_manager)
        event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Down,
                                QtCore.Qt.NoModifier)
        self.service_manager.service_manager_list.keyPressEvent(event)

        # THEN the on_move_selection_down function should have been called.
        self.service_manager.on_move_selection_down.assert_called_once_with()

    def test_move_selection_up_on_up_arrow(self):
        """
        Test that an up arrow key press event calls the on_move_selection_up function
        """
        # GIVEN a mocked move up function
        self.service_manager.on_move_selection_up = MagicMock()

        # WHEN the up arrow key event is called
        self.service_manager.setup_ui(self.service_manager)
        event = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Up,
                                QtCore.Qt.NoModifier)
        self.service_manager.service_manager_list.keyPressEvent(event)

        # THEN the on_move_selection_up function should have been called.
        self.service_manager.on_move_selection_up.assert_called_once_with()

    def _setup_service_manager_list(self):
        self.service_manager.expanded = MagicMock()
        self.service_manager.collapsed = MagicMock()
        verse_1 = QtWidgets.QTreeWidgetItem(0)
        verse_2 = QtWidgets.QTreeWidgetItem(0)
        song_item = QtWidgets.QTreeWidgetItem(0)
        song_item.addChild(verse_1)
        song_item.addChild(verse_2)
        self.service_manager.setup_ui(self.service_manager)
        self.service_manager.service_manager_list.addTopLevelItem(song_item)
        return verse_1, verse_2, song_item

    def test_on_expand_selection(self):
        """
        Test that the on_expand_selection function successfully expands an item and moves to its first child
        """
        # GIVEN a mocked servicemanager list
        verse_1, verse_2, song_item = self._setup_service_manager_list()
        self.service_manager.service_manager_list.setCurrentItem(song_item)
        # Reset expanded function in case it has been called and/or changed in initialisation of the service manager.
        self.service_manager.expanded = MagicMock()

        # WHEN on_expand_selection is called
        self.service_manager.on_expand_selection()

        # THEN selection should be expanded
        selected_index = self.service_manager.service_manager_list.currentIndex(
        )
        above_selected_index = self.service_manager.service_manager_list.indexAbove(
            selected_index)
        assert self.service_manager.service_manager_list.isExpanded(above_selected_index) is True, \
            'Item should have been expanded'
        self.service_manager.expanded.assert_called_once_with(song_item)

    def test_on_collapse_selection_with_parent_selected(self):
        """
        Test that the on_collapse_selection function successfully collapses an item
        """
        # GIVEN a mocked servicemanager list
        verse_1, verse_2, song_item = self._setup_service_manager_list()
        self.service_manager.service_manager_list.setCurrentItem(song_item)
        self.service_manager.service_manager_list.expandItem(song_item)

        # Reset collapsed function in case it has been called and/or changed in initialisation of the service manager.
        self.service_manager.collapsed = MagicMock()

        # WHEN on_expand_selection is called
        self.service_manager.on_collapse_selection()

        # THEN selection should be expanded
        selected_index = self.service_manager.service_manager_list.currentIndex(
        )
        assert self.service_manager.service_manager_list.isExpanded(selected_index) is False, \
            'Item should have been collapsed'
        assert self.service_manager.service_manager_list.currentItem() == song_item, \
            'Top item should have been selected'
        self.service_manager.collapsed.assert_called_once_with(song_item)

    def test_on_collapse_selection_with_child_selected(self):
        """
        Test that the on_collapse_selection function successfully collapses child's parent item
        and moves selection to its parent.
        """
        # GIVEN a mocked servicemanager list
        verse_1, verse_2, song_item = self._setup_service_manager_list()
        self.service_manager.service_manager_list.setCurrentItem(verse_2)
        self.service_manager.service_manager_list.expandItem(song_item)
        # Reset collapsed function in case it has been called and/or changed in initialisation of the service manager.
        self.service_manager.collapsed = MagicMock()

        # WHEN on_expand_selection is called
        self.service_manager.on_collapse_selection()

        # THEN selection should be expanded
        selected_index = self.service_manager.service_manager_list.currentIndex(
        )
        assert self.service_manager.service_manager_list.isExpanded(selected_index) is False, \
            'Item should have been collapsed'
        assert self.service_manager.service_manager_list.currentItem() == song_item, \
            'Top item should have been selected'
        self.service_manager.collapsed.assert_called_once_with(song_item)
Esempio n. 13
0
class TestSelectPlanForm(TestCase, TestMixin):
    """
    Test the SelectPlanForm class
    """
    def setUp(self):
        """
        Create the UI
        """
        self.registry = Registry()
        Registry.create()
        self.setup_application()
        self.build_settings()
        State().load_settings()
        Registry().register('settings', Settings())
        Registry().register(
            'main_window',
            MagicMock(service_manager_settings_section='servicemanager'))
        self.application_id = 'abc'
        self.secret = '123'
        Settings().setValue('planningcenter/application_id',
                            self.application_id)
        Settings().setValue('planningcenter/secret', self.secret)
        # init the planning center plugin so we have default values defined for Settings()
        self.planning_center_plugin = PlanningCenterPlugin()
        # setup our form
        self.form = SelectPlanForm()
        self.form.planning_center_api.airplane_mode = True
        self.form.planning_center_api.airplane_mode_directory = TEST_PATH
        self.theme_manager = ThemeManager(None)
        self.theme_manager.get_theme_names = MagicMock()
        self.theme_manager.get_theme_names.return_value = ['themeA', 'themeB']

    def tearDown(self):
        """
        Delete all the C++ objects at the end so that we don't have a segfault
        """
        del self.form
        del self.planning_center_plugin
        del self.theme_manager
        del self.registry
        self.destroy_settings()

    def test_initial_defaults(self):
        """
        Test that the SelectPlanForm displays with correct defaults
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        # a theme manager with mocked themes, and a fake date = Sunday (7/29/2018)
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
            # need to always return 9/29/2019 for date.today()
            mock_date.today.return_value = date(2019, 9, 29)
            mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
            # WHEN: The form is shown
            self.form.exec()
        # THEN: The correct count of service types show up in the combo box
        combo_box_count = self.form.service_type_combo_box.count()
        self.assertEqual(combo_box_count, 2,
                         'The service_type_combo_box contains 2 items')
        # The first service type is selected
        self.assertEqual(self.form.service_type_combo_box.currentText(), 'gbf',
                         'The service_type_combo_box defaults to "gbf"')
        # the selected plan is today (the mocked date is a Sunday)
        self.assertEqual(
            self.form.plan_selection_combo_box.currentText(),
            date.strftime(mock_date.today.return_value, '%B %d, %Y'),
            'Incorrect default date selected for Plan Date')
        # count the number of themes listed and make sure it matches expected value
        self.assertEqual(self.form.song_theme_selection_combo_box.count(), 2,
                         'Count of song themes is incorrect')
        self.assertEqual(self.form.slide_theme_selection_combo_box.count(), 2,
                         'Count of custom slide themes is incorrect')

    def test_warning_messagebox_shown_for_bad_credentials(self):
        """
        Test that if we don't have good credentials, then it will show a QMessageBox with a warning in it
        """
        # GIVEN: A SelectPlanForm instance with airplane mode enabled, resources, available,
        #        mocked check_credentials function to return ''
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
            patch.object(self.form.planning_center_api, 'check_credentials', return_value=''), \
                patch('PyQt5.QtWidgets.QMessageBox.warning') as mock_warning:
            # WHEN: form is displayed
            self.form.exec()
            # THEN: we should have called a warning messagebox
            mock_warning.assert_called_once()

    def test_disable_import_buttons(self):
        """
        Test that the import buttons are disabled when the "Select Plan Date" element in the
        Plan Selection List is selected.
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available, and the form
        with patch('PyQt5.QtWidgets.QDialog.exec'):
            self.form.exec()
            # WHEN: The Select Plan combo box is set to "Select Plan Date"
            index = self.form.plan_selection_combo_box.findText(
                'Select Plan Date')
            self.form.plan_selection_combo_box.setCurrentIndex(index)
        # THEN: "Import New" and "Refresh Service" buttons become inactive
        self.assertEqual(self.form.import_as_new_button.isEnabled(), False,
                         '"Import as New" button should be disabled')
        self.assertEqual(self.form.update_existing_button.isEnabled(), False,
                         '"Refresh Service" button should be disabled')

    def test_default_plan_date_is_next_sunday(self):
        """
        Test that the SelectPlanForm displays Next Sunday's Date by Default
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        # a theme manager with mocked themes, and a fake date =  (9/24/2019)
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
            # need to always return 9/24/2019 for date.today()
            mock_date.today.return_value = date(2019, 9, 24)
            mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
            self.form.exec()
            # WHEN: The second (index=1) service type is selected
            self.form.service_type_combo_box.setCurrentIndex(1)
        # THEN: The plan selection date is 9/29 (the following Sunday)
        self.assertEqual(
            self.form.plan_selection_combo_box.currentText(),
            'September 29, 2019',
            'The next Sunday\'s Date is not selected in the plan_selection_combo_box'
        )

    def test_service_type_changed_called_when_service_type_combo_changed(self):
        """
        Test that the "on_service_type_combobox_changed" function is executed when the
        service_type_combobox is changed
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available
        with patch('PyQt5.QtWidgets.QDialog.exec'):
            self.form.exec()
        # WHEN: The Service Type combo is set to index 1
        self.form.service_type_combo_box.setCurrentIndex(1)
        # THEN: The on_service_type_combobox_changed function is called
        assert self.form.plan_selection_combo_box.count(
        ) > 0, 'Plan Selection Combo Box is not empty'
        assert self.form.plan_selection_combo_box.itemText(
            0) == 'Select Plan Date', 'Plan Combo Box has default text'

    def test_plan_selection_changed_called_when_plan_selection_combo_changed(
            self):
        """
        Test that the "on_plan_selection_combobox_changed" function is executed when the
        plan_selection_combobox is changed
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        with patch('PyQt5.QtWidgets.QDialog.exec'):
            self.form.exec()
        # WHEN: The Service Type combo is set to index 1
        self.form.service_type_combo_box.setCurrentIndex(1)
        self.form.plan_selection_combo_box.setCurrentIndex(1)
        # THEN: The import and update buttons should be enabled
        assert self.form.import_as_new_button.isEnabled(
        ) is True, 'Import button should be enabled'
        assert self.form.update_existing_button.isEnabled(
        ) is True, 'Update button should be enabled'

    def test_settings_tab_displayed_when_edit_auth_button_clicked(self):
        """
        Test that the settings dialog is displayed when the edit_auth_button is clicked
        """
        # GIVEN: A SelectPlanForm instance with airplane mode enabled and resources available
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.core.ui.settingsform.SettingsForm.exec') as mock_settings_form:
            SettingsForm()
            self.form.exec()
            # WHEN: the edit_auth_button is clicked
            QtTest.QTest.mouseClick(self.form.edit_auth_button,
                                    QtCore.Qt.LeftButton)
        self.assertEqual(mock_settings_form.called, 1,
                         "Settings Form opened when edit_auth_button clicked")

    def test_import_function_called_when_import_button_clicked(self):
        """
        Test that the "on_import_as_new_button_clicked" function is executed when the
        "Import New" button is clicked
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.plugins.planningcenter.forms.selectplanform.SelectPlanForm._do_import') \
                as mock_do_import:
            self.form.exec()
            # WHEN: The Service Type combo is set to index 1 and the Select Plan combo box is set
            # to index 1 and the "Import New" button is clicked
            self.form.service_type_combo_box.setCurrentIndex(1)
            self.form.plan_selection_combo_box.setCurrentIndex(4)
            QtTest.QTest.mouseClick(self.form.import_as_new_button,
                                    QtCore.Qt.LeftButton)
        # THEN: The on_import_as_new_button_cliced function is called
        mock_do_import.assert_called_with(update=False)

    def test_service_imported_when_import_button_clicked(self):
        """
        Test that a service is imported when the "Import New" button is clicked
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        # mocked out "on_new_service_clicked"
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.core.common.registry.Registry.get'), \
                patch('openlp.plugins.planningcenter.lib.songimport.PlanningCenterSongImport.finish') \
                as mock_song_import, \
                patch('openlp.plugins.planningcenter.lib.customimport.CustomSlide') as mock_custom_slide_import, \
                patch('openlp.plugins.planningcenter.forms.selectplanform.parse_reference') as mock_bible_import, \
                patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
            # need to always return 9/29/2019 for date.today()
            mock_date.today.return_value = date(2019, 9, 29)
            mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
            self.form.exec()
            # WHEN: The Service Type combo is set to index 1 and the Select Plan combo box is set to
            # index 1 and the "Import New" button is clicked
            self.form.service_type_combo_box.setCurrentIndex(1)
            QtTest.QTest.mouseClick(self.form.import_as_new_button,
                                    QtCore.Qt.LeftButton)
        # THEN: There should be 5 service items added, 1 song, 3 custom slides (one is a bible
        # title slide), and 1 bible verse
        self.assertEqual(mock_song_import.call_count, 1,
                         '1 song added via song_media_item')
        self.assertEqual(mock_custom_slide_import.call_count, 4,
                         '4 custom slide added via custom_media_item')
        self.assertEqual(mock_bible_import.call_count, 2,
                         '2 bible verses submitted for parsing')

    def test_service_refreshed_when_refresh_button_clicked(self):
        """
        Test that a service is refreshed when the "Refresh Service" button is clicked
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        # mocked out "on_new_service_clicked"
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.core.common.registry.Registry.get'), \
                patch('openlp.plugins.planningcenter.lib.songimport.PlanningCenterSongImport.finish') \
                as mock_song_import, \
                patch('openlp.plugins.planningcenter.lib.customimport.CustomSlide') as mock_custom_slide_import, \
                patch('openlp.plugins.planningcenter.forms.selectplanform.parse_reference') as mock_bible_import, \
                patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
            # need to always return 9/29/2019 for date.today()
            mock_date.today.return_value = date(2019, 9, 29)
            mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
            self.form.exec()
            # WHEN: The Service Type combo is set to index 1 and the Select Plan combo box is
            # set to index 1 and the "Update" button is clicked
            self.form.service_type_combo_box.setCurrentIndex(1)
            QtTest.QTest.mouseClick(self.form.update_existing_button,
                                    QtCore.Qt.LeftButton)
        # THEN: There should be 5 service items added, 1 song, 3 custom slides (one is a bible
        # title slide), and 1 bible verse
        self.assertEqual(mock_song_import.call_count, 1,
                         '1 song added via song_media_item')
        self.assertEqual(mock_custom_slide_import.call_count, 4,
                         '4 custom slide added via custom_media_item')
        self.assertEqual(mock_bible_import.call_count, 2,
                         '2 bible verses submitted for parsing')

    def test_other_bible_is_used_when_bible_gui_form_is_blank(self):
        """
        Test that an other bible is used when the GUI has an empty string for current selected bible
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        # mocked out "on_new_service_clicked"
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.core.common.registry.Registry.get') as mock_get, \
                patch('openlp.plugins.planningcenter.lib.songimport.PlanningCenterSongImport.finish'), \
                patch('openlp.plugins.planningcenter.lib.customimport.CustomSlide'), \
                patch('openlp.plugins.planningcenter.forms.selectplanform.parse_reference') as mock_bible_import, \
                patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
            # need to always return 9/29/2019 for date.today()
            mock_date.today.return_value = date(2019, 9, 29)
            mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
            mock_bibles = {}
            mock_bibles['other_bible'] = MagicMock()
            mock_get.return_value.plugin.manager.get_bibles.return_value = mock_bibles
            mock_get.return_value.version_combo_box.currentText.return_value = ''
            self.form.exec()
            # WHEN: The Service Type combo is set to index 1 and the Select Plan combo box
            # is set to index 1 and the "Import New" button is clicked
            self.form.service_type_combo_box.setCurrentIndex(1)
            QtTest.QTest.mouseClick(self.form.import_as_new_button,
                                    QtCore.Qt.LeftButton)
        # THEN: There should be 2 bible verse parse attempts
        self.assertEqual(mock_bible_import.call_count, 2,
                         '2 bible verses submitted for parsing')

    def _create_mock_action(self, name, **kwargs):
        """
        Create a fake action with some "real" attributes for Service Manager
        """
        action = QtWidgets.QAction(self.service_manager)
        action.setObjectName(name)
        if kwargs.get('triggers'):
            action.triggered.connect(kwargs.pop('triggers'))
        self.service_manager.toolbar.actions[name] = action
        return action

    @skip(
        "fails to run when executed with all other openlp tests.  awaiting pytest fixtures to enable again"
    )
    def test_less_mocking_service_refreshed_when_refresh_button_clicked_test(
            self):
        """
        Test that a service is refreshed when the "Refresh Service" button is clicked
        """
        # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
        # mocked out "on_new_service_clicked"
        with patch('PyQt5.QtWidgets.QDialog.exec'), \
                patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
            # need to always return 9/29/2019 for date.today()
            mock_date.today.return_value = date(2019, 9, 29)
            mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
            # init ServiceManager
            Registry().register('plugin_manager', MagicMock())
            Registry().register('application', MagicMock())
            Registry().register('renderer', MagicMock())
            self.service_manager = ServiceManager()
            self.service_manager.setup_ui(self.service_manager)
            # init songs plugin
            with patch('openlp.plugins.songs.lib.mediaitem.EditSongForm'), \
                    patch('openlp.plugins.custom.lib.mediaitem.EditCustomForm'), \
                    patch('openlp.core.lib.mediamanageritem.create_widget_action'), \
                    patch('openlp.core.widgets.toolbar.create_widget_action'):
                # init songs plugin
                songs_plugin = SongsPlugin()
                song_media_item = SongMediaItem(None, songs_plugin)
                song_media_item.search_text_edit = MagicMock()
                song_media_item.settings_section = 'songs'
                song_media_item.initialise()
                # init custom plugin
                custom_plugin = CustomPlugin()
                CustomMediaItem(None, custom_plugin)
                # init bible plugin
                bible_plugin = BiblePlugin()
                bible_media_item = BibleMediaItem(None, bible_plugin)
                bible_media_item.build_display_results = MagicMock()
                self.form.exec()
            # WHEN:
            # The Service Type combo is set to index 1 and "Import New" button is clicked
            self.form.service_type_combo_box.setCurrentIndex(1)
            QtTest.QTest.mouseClick(self.form.import_as_new_button,
                                    QtCore.Qt.LeftButton)
            # make changes to the now imported service items
            # first, for serviceitem[0] update last_updated in xml_string and change "sweet" to "sublime"
            old_match = re.search(
                'modifiedDate="(.+?)Z*"', self.service_manager.service_items[0]
                ['service_item'].xml_version)
            old_string = old_match.group(1)
            now_string = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
            self.service_manager.service_items[0]['service_item'].xml_version = \
                self.service_manager.service_items[0]['service_item'].xml_version.replace(old_string, now_string)
            self.service_manager.service_items[0]['service_item'].xml_version = \
                self.service_manager.service_items[0]['service_item'].xml_version.replace("sweet", "sublime")
            # second, add the word modified to the slide text for serviceitem[1]
            self.service_manager.service_items[1]['service_item'].slides[0]['text'] = \
                self.service_manager.service_items[1]['service_item'].slides[0]['text'].replace("Test", "Modified Test")
            # third, delete serviceitems[2] and serviceitem[3]
            del self.service_manager.service_items[3]
            del self.service_manager.service_items[2]
            # last, draw the form again and request refresh
            self.form.exec()
            self.form.service_type_combo_box.setCurrentIndex(1)
            QtTest.QTest.mouseClick(self.form.update_existing_button,
                                    QtCore.Qt.LeftButton)
        # THEN:
        # There should be 4 service items added
        self.assertEqual(len(self.service_manager.service_items), 5,
                         '5 items should be in the ServiceManager')
        # Amazon Grace should still include sublime
        self.assertTrue('sublime' in self.service_manager.service_items[0]
                        ['service_item'].xml_version)
        # Slides in service_item[1] should still contain the word "Modified"
        self.assertTrue('Modified' in self.service_manager.service_items[1]
                        ['service_item'].slides[0]['text'])
Esempio n. 14
0
 def test_less_mocking_service_refreshed_when_refresh_button_clicked_test(
         self):
     """
     Test that a service is refreshed when the "Refresh Service" button is clicked
     """
     # GIVEN: An SelectPlanForm instance with airplane mode enabled, resources available,
     # mocked out "on_new_service_clicked"
     with patch('PyQt5.QtWidgets.QDialog.exec'), \
             patch('openlp.plugins.planningcenter.forms.selectplanform.date') as mock_date:
         # need to always return 9/29/2019 for date.today()
         mock_date.today.return_value = date(2019, 9, 29)
         mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
         # init ServiceManager
         Registry().register('plugin_manager', MagicMock())
         Registry().register('application', MagicMock())
         Registry().register('renderer', MagicMock())
         self.service_manager = ServiceManager()
         self.service_manager.setup_ui(self.service_manager)
         # init songs plugin
         with patch('openlp.plugins.songs.lib.mediaitem.EditSongForm'), \
                 patch('openlp.plugins.custom.lib.mediaitem.EditCustomForm'), \
                 patch('openlp.core.lib.mediamanageritem.create_widget_action'), \
                 patch('openlp.core.widgets.toolbar.create_widget_action'):
             # init songs plugin
             songs_plugin = SongsPlugin()
             song_media_item = SongMediaItem(None, songs_plugin)
             song_media_item.search_text_edit = MagicMock()
             song_media_item.settings_section = 'songs'
             song_media_item.initialise()
             # init custom plugin
             custom_plugin = CustomPlugin()
             CustomMediaItem(None, custom_plugin)
             # init bible plugin
             bible_plugin = BiblePlugin()
             bible_media_item = BibleMediaItem(None, bible_plugin)
             bible_media_item.build_display_results = MagicMock()
             self.form.exec()
         # WHEN:
         # The Service Type combo is set to index 1 and "Import New" button is clicked
         self.form.service_type_combo_box.setCurrentIndex(1)
         QtTest.QTest.mouseClick(self.form.import_as_new_button,
                                 QtCore.Qt.LeftButton)
         # make changes to the now imported service items
         # first, for serviceitem[0] update last_updated in xml_string and change "sweet" to "sublime"
         old_match = re.search(
             'modifiedDate="(.+?)Z*"', self.service_manager.service_items[0]
             ['service_item'].xml_version)
         old_string = old_match.group(1)
         now_string = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
         self.service_manager.service_items[0]['service_item'].xml_version = \
             self.service_manager.service_items[0]['service_item'].xml_version.replace(old_string, now_string)
         self.service_manager.service_items[0]['service_item'].xml_version = \
             self.service_manager.service_items[0]['service_item'].xml_version.replace("sweet", "sublime")
         # second, add the word modified to the slide text for serviceitem[1]
         self.service_manager.service_items[1]['service_item'].slides[0]['text'] = \
             self.service_manager.service_items[1]['service_item'].slides[0]['text'].replace("Test", "Modified Test")
         # third, delete serviceitems[2] and serviceitem[3]
         del self.service_manager.service_items[3]
         del self.service_manager.service_items[2]
         # last, draw the form again and request refresh
         self.form.exec()
         self.form.service_type_combo_box.setCurrentIndex(1)
         QtTest.QTest.mouseClick(self.form.update_existing_button,
                                 QtCore.Qt.LeftButton)
     # THEN:
     # There should be 4 service items added
     self.assertEqual(len(self.service_manager.service_items), 5,
                      '5 items should be in the ServiceManager')
     # Amazon Grace should still include sublime
     self.assertTrue('sublime' in self.service_manager.service_items[0]
                     ['service_item'].xml_version)
     # Slides in service_item[1] should still contain the word "Modified"
     self.assertTrue('Modified' in self.service_manager.service_items[1]
                     ['service_item'].slides[0]['text'])
Esempio n. 15
0
 def test_build_context_menu(self):
     """
     Test the creation of a context menu from a null service item.
     """
     # GIVEN: A new service manager instance and a default service item.
     service_manager = ServiceManager(None)
     item = MagicMock()
     item.parent.return_value = False
     item.data.return_value = 0
     service_manager.service_manager_list = MagicMock()
     service_manager.service_manager_list.itemAt.return_value = item
     service_item = ServiceItem(None)
     service_manager.service_items.insert(1, {'service_item': service_item})
     service_manager.edit_action = MagicMock()
     service_manager.rename_action = MagicMock()
     service_manager.create_custom_action = MagicMock()
     service_manager.maintain_action = MagicMock()
     service_manager.notes_action = MagicMock()
     service_manager.time_action = MagicMock()
     service_manager.auto_start_action = MagicMock()
     service_manager.auto_play_slides_menu = MagicMock()
     service_manager.auto_play_slides_once = MagicMock()
     service_manager.auto_play_slides_loop = MagicMock()
     service_manager.timed_slide_interval = MagicMock()
     service_manager.theme_menu = MagicMock()
     service_manager.menu = MagicMock()
     # WHEN I define a context menu
     service_manager.context_menu(1)
     # THEN the following calls should have occurred.
     assert service_manager.edit_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.rename_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.notes_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.time_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.auto_start_action.setVisible.call_count == 1, 'Should have been called once'
     assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \
         'Should have been called once'
     assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.theme_menu.menuAction().setVisible.call_count == 1, \
         'Should have been called once'
Esempio n. 16
0
 def test_build_custom_context_menu(self):
     """
     Test the creation of a context menu from service item of type text from Custom.
     """
     # GIVEN: A new service manager instance and a default service item.
     mocked_renderer = MagicMock()
     mocked_renderer.theme_level = ThemeLevel.Song
     Registry().register('plugin_manager', MagicMock())
     Registry().register('renderer', mocked_renderer)
     service_manager = ServiceManager(None)
     item = MagicMock()
     item.parent.return_value = False
     item.data.return_value = 0
     service_manager.service_manager_list = MagicMock()
     service_manager.service_manager_list.itemAt.return_value = item
     service_item = ServiceItem(None)
     service_item.add_capability(ItemCapabilities.CanEdit)
     service_item.add_capability(ItemCapabilities.CanPreview)
     service_item.add_capability(ItemCapabilities.CanLoop)
     service_item.add_capability(ItemCapabilities.CanSoftBreak)
     service_item.add_capability(ItemCapabilities.OnLoadUpdate)
     service_item.service_item_type = ServiceItemType.Text
     service_item.edit_id = 1
     service_item._display_slides = []
     service_item._display_slides.append(MagicMock())
     service_manager.service_items.insert(1, {'service_item': service_item})
     service_manager.edit_action = MagicMock()
     service_manager.rename_action = MagicMock()
     service_manager.create_custom_action = MagicMock()
     service_manager.maintain_action = MagicMock()
     service_manager.notes_action = MagicMock()
     service_manager.time_action = MagicMock()
     service_manager.auto_start_action = MagicMock()
     service_manager.auto_play_slides_menu = MagicMock()
     service_manager.auto_play_slides_once = MagicMock()
     service_manager.auto_play_slides_loop = MagicMock()
     service_manager.timed_slide_interval = MagicMock()
     service_manager.theme_menu = MagicMock()
     service_manager.menu = MagicMock()
     # WHEN I define a context menu
     service_manager.context_menu(1)
     # THEN the following calls should have occurred.
     assert service_manager.edit_action.setVisible.call_count == 2, 'Should have be called twice'
     assert service_manager.rename_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.notes_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.time_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.auto_start_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \
         'Should have be called once'
     assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.theme_menu.menuAction().setVisible.call_count == 2, \
         'Should have be called twice'
     # THEN we add a 2nd display frame
     service_item._display_slides.append(MagicMock())
     service_manager.context_menu(1)
     # THEN the following additional calls should have occurred.
     assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 2, \
         'Should have be called twice'
     assert service_manager.auto_play_slides_once.setChecked.call_count == 1, 'Should have be called once'
     assert service_manager.auto_play_slides_loop.setChecked.call_count == 1, 'Should have be called once'
     assert service_manager.timed_slide_interval.setChecked.call_count == 1, 'Should have be called once'
Esempio n. 17
0
 def test_build_presentation_non_pdf_context_menu(self):
     """
     Test the creation of a context menu from service item of type Command with Impress from Presentation.
     """
     # GIVEN: A new service manager instance and a default service item.
     Registry().register('plugin_manager', MagicMock())
     Registry().register('renderer', MagicMock())
     service_manager = ServiceManager(None)
     item = MagicMock()
     item.parent.return_value = False
     item.data.return_value = 0
     service_manager.service_manager_list = MagicMock()
     service_manager.service_manager_list.itemAt.return_value = item
     service_item = ServiceItem(None)
     service_item.add_capability(ItemCapabilities.ProvidesOwnDisplay)
     service_item.service_item_type = ServiceItemType.Command
     service_item.edit_id = 1
     service_item.slides.append(MagicMock())
     service_manager.service_items.insert(1, {'service_item': service_item})
     service_manager.edit_action = MagicMock()
     service_manager.rename_action = MagicMock()
     service_manager.create_custom_action = MagicMock()
     service_manager.maintain_action = MagicMock()
     service_manager.notes_action = MagicMock()
     service_manager.time_action = MagicMock()
     service_manager.auto_start_action = MagicMock()
     service_manager.auto_play_slides_menu = MagicMock()
     service_manager.auto_play_slides_once = MagicMock()
     service_manager.auto_play_slides_loop = MagicMock()
     service_manager.timed_slide_interval = MagicMock()
     service_manager.theme_menu = MagicMock()
     service_manager.menu = MagicMock()
     # WHEN I define a context menu
     service_manager.context_menu(1)
     # THEN the following calls should have occurred.
     assert service_manager.edit_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.rename_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.notes_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.time_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.auto_start_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \
         'Should have be called once'
     assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.theme_menu.menuAction().setVisible.call_count == 1, \
         'Should have be called once'
Esempio n. 18
0
 def test_build_media_context_menu(self):
     """
     Test the creation of a context menu from service item of type Command from Media.
     """
     # GIVEN: A new service manager instance and a default service item.
     Registry().register('plugin_manager', MagicMock())
     Registry().register('renderer', MagicMock())
     service_manager = ServiceManager(None)
     item = MagicMock()
     item.parent.return_value = False
     item.data.return_value = 0
     service_manager.service_manager_list = MagicMock()
     service_manager.service_manager_list.itemAt.return_value = item
     service_item = ServiceItem(None)
     service_item.add_capability(ItemCapabilities.CanAutoStartForLive)
     service_item.add_capability(ItemCapabilities.CanEditTitle)
     service_item.add_capability(ItemCapabilities.RequiresMedia)
     service_item.service_item_type = ServiceItemType.Command
     service_item.edit_id = 1
     service_item.slides.append(MagicMock())
     service_manager.service_items.insert(1, {'service_item': service_item})
     service_manager.edit_action = MagicMock()
     service_manager.rename_action = MagicMock()
     service_manager.create_custom_action = MagicMock()
     service_manager.maintain_action = MagicMock()
     service_manager.notes_action = MagicMock()
     service_manager.time_action = MagicMock()
     service_manager.auto_start_action = MagicMock()
     service_manager.auto_play_slides_menu = MagicMock()
     service_manager.auto_play_slides_once = MagicMock()
     service_manager.auto_play_slides_loop = MagicMock()
     service_manager.timed_slide_interval = MagicMock()
     service_manager.theme_menu = MagicMock()
     service_manager.menu = MagicMock()
     # WHEN I define a context menu
     service_manager.context_menu(1)
     # THEN the following calls should have occurred.
     assert service_manager.edit_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.rename_action.setVisible.call_count == 2, 'Should have be called twice'
     assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.notes_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.time_action.setVisible.call_count == 1, 'Should have be called once'
     assert service_manager.auto_start_action.setVisible.call_count == 2, 'Should have be called twice'
     assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \
         'Should have be called once'
     assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called'
     assert service_manager.theme_menu.menuAction().setVisible.call_count == 1, \
         'Should have be called once'
     # THEN I change the length of the media and regenerate the menu.
     service_item.set_media_length(5)
     service_manager.context_menu(1)
     # THEN the following additional calls should have occurred.
     assert service_manager.time_action.setVisible.call_count == 3, 'Should have be called three times'