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 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.applocation import AppLocation
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.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.state import State
from openlp.core.ui.icons import UiIcons
from openlp.core.ui.media import AUDIO_EXT, VIDEO_EXT
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.list_double_clicked = False
self.servicefile_version = None
self.tree_widget_items = []
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'))
total_size = service_content_size
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.main_window.display_progress_bar(1000)
try:
@ -1315,11 +1319,13 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi
if not item['service_item'].has_original_file_path:
self.service_has_all_original_files = False
# Repaint the screen
self.service_manager_list.clear()
self.tree_widget_items = []
self.service_manager_list.clearSelection()
self.service_manager_list.clear()
for item_index, item in enumerate(self.service_items):
service_item_from_item = item['service_item']
tree_widget_item = QtWidgets.QTreeWidgetItem(self.service_manager_list)
self.tree_widget_items.append(tree_widget_item)
if service_item_from_item.is_valid:
icon = service_item_from_item.icon.pixmap(80, 80).toImage()
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()
@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):
"""
Test the service manager