Attempt to fix #878

This commit is contained in:
Raoul Snyman 2022-05-12 14:07:44 +00:00
parent 2e56c07639
commit fab9f8d7d8
2 changed files with 119 additions and 3 deletions

View File

@ -34,7 +34,6 @@ from tempfile import NamedTemporaryFile
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import ThemeLevel, delete_file, sha256_file_hash from openlp.core.common import ThemeLevel, delete_file, sha256_file_hash
from openlp.core.state import State
from openlp.core.common.actions import ActionList, CategoryOrder from openlp.core.common.actions import ActionList, CategoryOrder
from openlp.core.common.applocation import AppLocation from openlp.core.common.applocation import AppLocation
from openlp.core.common.enum import ServiceItemType from openlp.core.common.enum import ServiceItemType
@ -47,6 +46,7 @@ from openlp.core.lib.exceptions import ValidationError
from openlp.core.lib.plugin import PluginStatus from openlp.core.lib.plugin import PluginStatus
from openlp.core.lib.serviceitem import ServiceItem from openlp.core.lib.serviceitem import ServiceItem
from openlp.core.lib.ui import create_widget_action, critical_error_message_box, find_and_set_in_combo_box from openlp.core.lib.ui import create_widget_action, critical_error_message_box, find_and_set_in_combo_box
from openlp.core.state import State
from openlp.core.ui.icons import UiIcons from openlp.core.ui.icons import UiIcons
from openlp.core.ui.media import AUDIO_EXT, VIDEO_EXT from openlp.core.ui.media import AUDIO_EXT, VIDEO_EXT
from openlp.core.ui.serviceitemeditform import ServiceItemEditForm from openlp.core.ui.serviceitemeditform import ServiceItemEditForm
@ -331,6 +331,7 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi
self.service_has_all_original_files = True self.service_has_all_original_files = True
self.list_double_clicked = False self.list_double_clicked = False
self.servicefile_version = None self.servicefile_version = None
self.tree_widget_items = []
def bootstrap_initialise(self): def bootstrap_initialise(self):
""" """
@ -679,7 +680,10 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi
service_content_size = len(bytes(service_content, encoding='utf-8')) service_content_size = len(bytes(service_content, encoding='utf-8'))
total_size = service_content_size total_size = service_content_size
for local_file_item, zip_file_item in write_list: for local_file_item, zip_file_item in write_list:
total_size += local_file_item.stat().st_size try:
total_size += local_file_item.stat().st_size
except FileNotFoundError:
self.log_exception(f'Local file {local_file_item} not found')
self.log_debug('ServiceManager.save_file - ZIP contents size is %i bytes' % total_size) self.log_debug('ServiceManager.save_file - ZIP contents size is %i bytes' % total_size)
self.main_window.display_progress_bar(1000) self.main_window.display_progress_bar(1000)
try: try:
@ -1315,11 +1319,13 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi
if not item['service_item'].has_original_file_path: if not item['service_item'].has_original_file_path:
self.service_has_all_original_files = False self.service_has_all_original_files = False
# Repaint the screen # Repaint the screen
self.service_manager_list.clear() self.tree_widget_items = []
self.service_manager_list.clearSelection() self.service_manager_list.clearSelection()
self.service_manager_list.clear()
for item_index, item in enumerate(self.service_items): for item_index, item in enumerate(self.service_items):
service_item_from_item = item['service_item'] service_item_from_item = item['service_item']
tree_widget_item = QtWidgets.QTreeWidgetItem(self.service_manager_list) tree_widget_item = QtWidgets.QTreeWidgetItem(self.service_manager_list)
self.tree_widget_items.append(tree_widget_item)
if service_item_from_item.is_valid: if service_item_from_item.is_valid:
icon = service_item_from_item.icon.pixmap(80, 80).toImage() icon = service_item_from_item.icon.pixmap(80, 80).toImage()
icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)

View File

@ -1266,6 +1266,116 @@ def test_service_manager_load_file_str(MockPath, registry):
MockPath.return_value.exists.assert_called_once() MockPath.return_value.exists.assert_called_once()
@patch('openlp.core.ui.servicemanager.QtWidgets.QMessageBox')
def test_service_manager_delete_confirmation_dialog(MockMessageBox, registry):
"""Test the _delete_confirmation_dialog() method"""
# GIVEN: A service manager and a mocked QMessageBox class
service_manager = ServiceManager(None)
mocked_message_box = MagicMock()
MockMessageBox.return_value = mocked_message_box
# Restore a couple of items for a more realistic situation
MockMessageBox.Question = QtWidgets.QMessageBox.Question
MockMessageBox.Close = QtWidgets.QMessageBox.Close
MockMessageBox.Cancel = QtWidgets.QMessageBox.Cancel
MockMessageBox.StandardButtons = QtWidgets.QMessageBox.StandardButtons
# WHEN: _delete_confirmation_dialog() is called
service_manager._delete_confirmation_dialog()
# THEN: All the correct things should have been called
MockMessageBox.assert_called_once_with(QtWidgets.QMessageBox.Question, 'Delete item from service',
'Are you sure you want to delete this item from the service?',
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Close |
QtWidgets.QMessageBox.Cancel),
service_manager)
mocked_message_box.button.assert_called_once_with(QtWidgets.QMessageBox.Close)
mocked_message_box.setDefaultButton.assert_called_once_with(QtWidgets.QMessageBox.Close)
mocked_message_box.exec.assert_called_once()
@patch('openlp.core.ui.servicemanager.QtWidgets.QMessageBox.question')
def test_service_manager_save_modified_service(mocked_question, registry):
"""Test the save_modified_service() method"""
# GIVEN: A service manager and a mocked main window
mocked_main_window = MagicMock()
registry.register('main_window', mocked_main_window)
service_manager = ServiceManager(None)
# WHEN: save_modified_service() is called
service_manager.save_modified_service()
# THEN: All the correct things should have been called
mocked_question.assert_called_once_with(mocked_main_window, 'Modified Service',
'The current service has been modified. '
'Would you like to save this service?',
QtWidgets.QMessageBox.Save | QtWidgets.QMessageBox.Discard |
QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Save)
def test_service_manager_on_recent_service_clicked_cancel(registry):
"""Test the on_recent_service_clicked() method"""
# GIVEN: A service manager with some methods mocked out
service_manager = ServiceManager(None)
service_manager.is_modified = lambda: True
service_manager.save_modified_service = lambda: QtWidgets.QMessageBox.Cancel
# WHEN: on_recent_service_clicked() is called
result = service_manager.on_recent_service_clicked(True)
# THEN: The result should be False
assert result is False, 'on_recent_service_clicked() should have returned False'
def test_service_manager_on_recent_service_clicked_save(registry):
"""Test the on_recent_service_clicked() method"""
# GIVEN: A service manager with some methods mocked out
service_manager = ServiceManager(None)
service_manager.is_modified = lambda: True
service_manager.save_modified_service = lambda: QtWidgets.QMessageBox.Save
service_manager.decide_save_method = lambda: None
service_manager.sender = lambda: MagicMock(**{'data.return_value': '/path/to/service'})
service_manager.load_file = MagicMock()
# WHEN: on_recent_service_clicked() is called
result = service_manager.on_recent_service_clicked(True)
# THEN: The result should be None
assert result is None, 'on_recent_service_clicked() should have returned None'
service_manager.load_file.assert_called_once_with(Path('/path/to/service'))
def test_service_manager_decide_save_method_save(registry):
"""Test the decide_save_method() method"""
# GIVEN: A service manager with some methods mocked out
service_manager = ServiceManager(None)
service_manager.file_name = lambda: 'filename.osz'
service_manager.save_file = MagicMock()
service_manager.save_file_as = MagicMock()
# WHEN: decide_save_method() is called
service_manager.decide_save_method()
# THEN: The correct methods should have been called
service_manager.save_file.assert_called_once()
assert service_manager.save_file_as.call_count == 0, 'The save_file_as method should not have been called'
def test_service_manager_decide_save_method_save_as(registry):
"""Test the decide_save_method() method"""
# GIVEN: A service manager with some methods mocked out
service_manager = ServiceManager(None)
service_manager.file_name = lambda: None
service_manager.save_file = MagicMock()
service_manager.save_file_as = MagicMock()
# WHEN: decide_save_method() is called
service_manager.decide_save_method()
# THEN: The correct methods should have been called
service_manager.save_file_as.assert_called_once()
assert service_manager.save_file.call_count == 0, 'The save_file method should not have been called'
class TestServiceManager(TestCase, TestMixin): class TestServiceManager(TestCase, TestMixin):
""" """
Test the service manager Test the service manager