From 3cdd42bfe0180504c7971f596af98e9adb0a88ce Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 17 Jul 2016 00:20:56 +0200 Subject: [PATCH 1/4] Catch the PermissionError too --- openlp/core/ui/servicemanager.py | 9 +- .../openlp_core_ui/test_servicemanager.py | 310 ++++++++++-------- 2 files changed, 176 insertions(+), 143 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 907cb49a6..7c01b4191 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -480,9 +480,10 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ServiceMa :return: service array """ service = [] - core = {'lite-service': self._save_lite, - 'service-theme': self.service_theme - } + core = { + 'lite-service': self._save_lite, + 'service-theme': self.service_theme + } service.append({'openlp_core': core}) return service @@ -658,7 +659,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ServiceMa if success: try: shutil.copy(temp_file_name, path_file_name) - except shutil.Error: + except (shutil.Error, PermissionError): return self.save_file_as() self.main_window.add_recent_file(path_file_name) self.set_modified(False) diff --git a/tests/functional/openlp_core_ui/test_servicemanager.py b/tests/functional/openlp_core_ui/test_servicemanager.py index 7882d8a24..1697eb1f6 100644 --- a/tests/functional/openlp_core_ui/test_servicemanager.py +++ b/tests/functional/openlp_core_ui/test_servicemanager.py @@ -22,10 +22,12 @@ """ Package to test the openlp.core.ui.slidecontroller package. """ -import PyQt5 +import os from unittest import TestCase -from openlp.core.common import Registry, ThemeLevel, Settings +import PyQt5 + +from openlp.core.common import Registry, ThemeLevel from openlp.core.lib import ServiceItem, ServiceItemType, ItemCapabilities from openlp.core.ui import ServiceManager @@ -33,6 +35,9 @@ from tests.functional import MagicMock, patch class TestServiceManager(TestCase): + """ + Test the service manager + """ def setUp(self): """ @@ -108,20 +113,20 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have been called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have been called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, - 'Should have been called once') + self.assertEqual(service_manager.edit_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have been called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + 'Should have been called once') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, + 'Should have been called once') def test_build_song_context_menu(self): """ @@ -139,12 +144,10 @@ class TestServiceManager(TestCase): 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.OnLoadUpdate) - service_item.add_capability(ItemCapabilities.AddIfNewItem) - service_item.add_capability(ItemCapabilities.CanSoftBreak) + for capability in [ItemCapabilities.CanEdit, ItemCapabilities.CanPreview, ItemCapabilities.CanLoop, + ItemCapabilities.OnLoadUpdate, ItemCapabilities.AddIfNewItem, + ItemCapabilities.CanSoftBreak]: + service_item.add_capability(capability) service_item.service_item_type = ServiceItemType.Text service_item.edit_id = 1 service_item._display_frames.append(MagicMock()) @@ -165,29 +168,29 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') + self.assertEqual(service_manager.edit_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 2, + 'Should have be called twice') # THEN we add a 2nd display frame service_item._display_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, + 'Should have be called twice') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') def test_build_bible_context_menu(self): """ @@ -205,11 +208,10 @@ class TestServiceManager(TestCase): service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) - service_item.add_capability(ItemCapabilities.NoLineBreaks) - service_item.add_capability(ItemCapabilities.CanPreview) - service_item.add_capability(ItemCapabilities.CanLoop) - service_item.add_capability(ItemCapabilities.CanWordSplit) - service_item.add_capability(ItemCapabilities.CanEditTitle) + for capability in [ItemCapabilities.NoLineBreaks, ItemCapabilities.CanPreview, + ItemCapabilities.CanLoop, ItemCapabilities.CanWordSplit, + ItemCapabilities.CanEditTitle]: + service_item.add_capability(capability) service_item.service_item_type = ServiceItemType.Text service_item.edit_id = 1 service_item._display_frames.append(MagicMock()) @@ -230,29 +232,29 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') + self.assertEqual(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 2, + 'Should have be called twice') # THEN we add a 2nd display frame service_item._display_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, + 'Should have be called twice') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') def test_build_custom_context_menu(self): """ @@ -295,29 +297,29 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.edit_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 2, + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 2, 'Should have be called twice') # THEN we add a 2nd display frame service_item._display_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') def test_build_image_context_menu(self): """ @@ -358,29 +360,29 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') # THEN we add a 2nd display frame and regenerate the menu. service_item._raw_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') def test_build_media_context_menu(self): """ @@ -419,25 +421,25 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(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. - self.assertEquals(service_manager.time_action.setVisible.call_count, 3, 'Should have be called three times') + self.assertEqual(service_manager.time_action.setVisible.call_count, 3, 'Should have be called three times') def test_build_presentation_pdf_context_menu(self): """ @@ -477,19 +479,19 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 2, 'Should have be called twice') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 2, 'Should have be called twice') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') def test_build_presentation_non_pdf_context_menu(self): @@ -527,19 +529,19 @@ class TestServiceManager(TestCase): # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. - self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') + self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') - self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') - self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, + self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') + self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') @patch(u'openlp.core.ui.servicemanager.Settings') @@ -573,7 +575,7 @@ class TestServiceManager(TestCase): # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview() # THEN: timer should not be started - self.assertEquals(mocked_singleShot.call_count, 0, 'Should not be called') + self.assertEqual(mocked_singleShot.call_count, 0, 'Should not be called') @patch(u'openlp.core.ui.servicemanager.Settings') @patch(u'PyQt5.QtCore.QTimer.singleShot') @@ -591,7 +593,8 @@ class TestServiceManager(TestCase): service_manager.on_double_click_live() service_manager.on_single_click_preview() # THEN: timer should not be started - self.assertEquals(mocked_singleShot.call_count, 0, 'Should not be called') + mocked_make_live.assert_called_with() + self.assertEqual(mocked_singleShot.call_count, 0, 'Should not be called') @patch(u'openlp.core.ui.servicemanager.ServiceManager.make_preview') def test_single_click_timeout_single(self, mocked_make_preview): @@ -603,7 +606,7 @@ class TestServiceManager(TestCase): # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview_timeout() # THEN: make_preview() should have been called - self.assertEquals(mocked_make_preview.call_count, 1, 'Should have been called once') + self.assertEqual(mocked_make_preview.call_count, 1, 'ServiceManager.make_preview() should have been called once') @patch(u'openlp.core.ui.servicemanager.ServiceManager.make_preview') @patch(u'openlp.core.ui.servicemanager.ServiceManager.make_live') @@ -616,5 +619,34 @@ class TestServiceManager(TestCase): # 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 have been called - self.assertEquals(mocked_make_preview.call_count, 0, 'Should not be called') + # THEN: make_preview() should not have been called + self.assertEqual(mocked_make_preview.call_count, 0, 'ServiceManager.make_preview() should not be called') + + @patch(u'openlp.core.ui.servicemanager.shutil.copy') + @patch(u'openlp.core.ui.servicemanager.zipfile') + @patch(u'openlp.core.ui.servicemanager.ServiceManager.save_file_as') + def test_save_raises_permission_error(self, mocked_save_file_as, mocked_zipfile, mocked_shutil_copy): + """ + 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._file_name = os.path.join('temp', 'filename.osz') + service_manager._save_lite = False + service_manager.service_items = [] + service_manager.service_theme = 'Default' + mocked_save_file_as.return_value = True + mocked_zipfile.ZipFile.return_value = MagicMock() + mocked_shutil_copy.side_effect = PermissionError + + # WHEN: The service is saved and a PermissionError is thrown + result = service_manager.save_local_file() + + # THEN: The "save_as" method is called to save the service + self.assertTrue(result) + mocked_save_file_as.assert_called_with() + From 97d65864623b308021d9a1a628e962e8d1403998 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 17 Jul 2016 21:12:00 +0200 Subject: [PATCH 2/4] Fixed another part of the permission denied error --- openlp/core/ui/servicemanager.py | 2 +- .../openlp_core_ui/test_servicemanager.py | 31 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 7c01b4191..578217ea6 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -598,7 +598,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ServiceMa if success: try: shutil.copy(temp_file_name, path_file_name) - except shutil.Error: + except (shutil.Error, PermissionError): return self.save_file_as() except OSError as ose: QtWidgets.QMessageBox.critical(self, translate('OpenLP.ServiceManager', 'Error Saving File'), diff --git a/tests/functional/openlp_core_ui/test_servicemanager.py b/tests/functional/openlp_core_ui/test_servicemanager.py index 1697eb1f6..5a337d786 100644 --- a/tests/functional/openlp_core_ui/test_servicemanager.py +++ b/tests/functional/openlp_core_ui/test_servicemanager.py @@ -625,7 +625,7 @@ class TestServiceManager(TestCase): @patch(u'openlp.core.ui.servicemanager.shutil.copy') @patch(u'openlp.core.ui.servicemanager.zipfile') @patch(u'openlp.core.ui.servicemanager.ServiceManager.save_file_as') - def test_save_raises_permission_error(self, mocked_save_file_as, mocked_zipfile, mocked_shutil_copy): + def test_save_file_raises_permission_error(self, mocked_save_file_as, mocked_zipfile, mocked_shutil_copy): """ Test that when a PermissionError is raised when trying to save a file, it is handled correctly """ @@ -639,6 +639,35 @@ class TestServiceManager(TestCase): 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_shutil_copy.side_effect = PermissionError + + # WHEN: The service is saved and a PermissionError is thrown + result = service_manager.save_file() + + # THEN: The "save_as" method is called to save the service + self.assertTrue(result) + mocked_save_file_as.assert_called_with() + + @patch(u'openlp.core.ui.servicemanager.shutil.copy') + @patch(u'openlp.core.ui.servicemanager.zipfile') + @patch(u'openlp.core.ui.servicemanager.ServiceManager.save_file_as') + def test_save_local_file_raises_permission_error(self, mocked_save_file_as, mocked_zipfile, mocked_shutil_copy): + """ + Test that when a PermissionError is raised when trying to save a local 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._file_name = os.path.join('temp', 'filename.osz') + service_manager._save_lite = False + service_manager.service_items = [] + service_manager.service_theme = 'Default' mocked_save_file_as.return_value = True mocked_zipfile.ZipFile.return_value = MagicMock() mocked_shutil_copy.side_effect = PermissionError From 65fe62d69f1ae10ffc3c11676bbccc34106caa5b Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 17 Jul 2016 21:33:10 +0200 Subject: [PATCH 3/4] Fix some linting issues --- .../openlp_core_ui/test_servicemanager.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tests/functional/openlp_core_ui/test_servicemanager.py b/tests/functional/openlp_core_ui/test_servicemanager.py index 5a337d786..853baf1f0 100644 --- a/tests/functional/openlp_core_ui/test_servicemanager.py +++ b/tests/functional/openlp_core_ui/test_servicemanager.py @@ -305,18 +305,18 @@ class TestServiceManager(TestCase): self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') + 'Should have be called twice') # THEN we add a 2nd display frame service_item._display_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') + 'Should have be called twice') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') @@ -368,18 +368,18 @@ class TestServiceManager(TestCase): self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') # THEN we add a 2nd display frame and regenerate the menu. service_item._raw_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, - 'Should have be called twice') + 'Should have be called twice') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once') @@ -429,12 +429,12 @@ class TestServiceManager(TestCase): self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 2, 'Should have be called twice') self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + '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) @@ -487,12 +487,12 @@ class TestServiceManager(TestCase): self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') def test_build_presentation_non_pdf_context_menu(self): """ @@ -537,12 +537,12 @@ class TestServiceManager(TestCase): self.assertEqual(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') self.assertEqual(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEqual(service_manager.theme_menu.menuAction().setVisible.call_count, 1, - 'Should have be called once') + 'Should have be called once') @patch(u'openlp.core.ui.servicemanager.Settings') @patch(u'PyQt5.QtCore.QTimer.singleShot') @@ -606,7 +606,8 @@ class TestServiceManager(TestCase): # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview_timeout() # THEN: make_preview() should have been called - self.assertEqual(mocked_make_preview.call_count, 1, 'ServiceManager.make_preview() should have been called once') + self.assertEqual(mocked_make_preview.call_count, 1, + 'ServiceManager.make_preview() should have been called once') @patch(u'openlp.core.ui.servicemanager.ServiceManager.make_preview') @patch(u'openlp.core.ui.servicemanager.ServiceManager.make_live') From 785257020dc6fd24e00b119640b132e62058cd78 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 17 Jul 2016 21:46:06 +0200 Subject: [PATCH 4/4] Fix some linting issues --- tests/functional/openlp_core_ui/test_servicemanager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/functional/openlp_core_ui/test_servicemanager.py b/tests/functional/openlp_core_ui/test_servicemanager.py index 853baf1f0..3e4af8c97 100644 --- a/tests/functional/openlp_core_ui/test_servicemanager.py +++ b/tests/functional/openlp_core_ui/test_servicemanager.py @@ -679,4 +679,3 @@ class TestServiceManager(TestCase): # THEN: The "save_as" method is called to save the service self.assertTrue(result) mocked_save_file_as.assert_called_with() -