From ae7c86333370769591e5a9b1dbf5dcab3e52991a Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Oct 2014 21:02:06 +0200 Subject: [PATCH] [fix 1385979] Check if the item is valid first --- openlp/core/ui/settingsform.py | 3 +++ .../openlp_core_ui/test_settingsform.py | 25 ++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index e953da011..e2b51d4fb 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -143,6 +143,9 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog, RegistryProperties): """ # Get the item we clicked on list_item = self.setting_list_widget.item(item_index) + # Quick exit to the left if the item doesn't exist (maybe -1?) + if not list_item: + return # Loop through the list of tabs in the stacked layout for tab_index in range(self.stacked_layout.count()): # Get the widget diff --git a/tests/functional/openlp_core_ui/test_settingsform.py b/tests/functional/openlp_core_ui/test_settingsform.py index 5d9b413df..e01f0bde7 100644 --- a/tests/functional/openlp_core_ui/test_settingsform.py +++ b/tests/functional/openlp_core_ui/test_settingsform.py @@ -29,10 +29,10 @@ """ Package to test the openlp.core.ui.settingsform package. """ +from PyQt4 import QtGui from unittest import TestCase from openlp.core.common import Registry -from openlp.core.ui.generaltab import GeneralTab from openlp.core.ui.settingsform import SettingsForm from tests.functional import MagicMock, patch @@ -62,7 +62,7 @@ class TestSettingsForm(TestCase): patch.object(settings_form.setting_list_widget, 'addItem') as mocked_add_item: settings_form.insert_tab(general_tab, is_visible=True) - # THEN: Stuff should happen + # THEN: The general tab should have been inserted into the stacked layout and an item inserted into the list mocked_add_widget.assert_called_with(general_tab) self.assertEqual(1, mocked_add_item.call_count, 'addItem should have been called') @@ -80,6 +80,25 @@ class TestSettingsForm(TestCase): patch.object(settings_form.setting_list_widget, 'addItem') as mocked_add_item: settings_form.insert_tab(general_tab, is_visible=False) - # THEN: Stuff should happen + # THEN: The general tab should have been inserted, but no list item should have been inserted into the list mocked_add_widget.assert_called_with(general_tab) self.assertEqual(0, mocked_add_item.call_count, 'addItem should not have been called') + + def list_item_changed_invalid_item_test(self): + """ + Test that the list_item_changed() slot handles a non-existent item + """ + # GIVEN: A mocked tab inserted into a Settings Form + settings_form = SettingsForm(None) + general_tab = QtGui.QWidget(None) + general_tab.tab_title = 'mock' + general_tab.tab_title_visible = 'Mock' + general_tab.icon_path = ':/icon/openlp-logo-16x16.png' + settings_form.insert_tab(general_tab, is_visible=True) + + with patch.object(settings_form.stacked_layout, 'count') as mocked_count: + # WHEN: The list_item_changed() slot is called with an invalid item index + settings_form.list_item_changed(100) + + # THEN: The rest of the method should not have been called + self.assertEqual(0, mocked_count.call_count, 'The count method of the stacked layout should not be called')