diff --git a/openlp/core/common/__init__.py b/openlp/core/common/__init__.py index fcb96e5ac..b382a719f 100644 --- a/openlp/core/common/__init__.py +++ b/openlp/core/common/__init__.py @@ -24,13 +24,12 @@ The :mod:`common` module contains most of the components and libraries that make OpenLP work. """ import hashlib -import re -import os import logging +import os +import re import sys import traceback from ipaddress import IPv4Address, IPv6Address, AddressValueError -from codecs import decode, encode from PyQt5 import QtCore from PyQt5.QtCore import QCryptographicHash as QHash @@ -241,6 +240,20 @@ from .registryproperties import RegistryProperties from .uistrings import UiStrings from .settings import Settings from .applocation import AppLocation -from .historycombobox import HistoryComboBox from .actions import ActionList from .languagemanager import LanguageManager + + +def add_actions(target, actions): + """ + Adds multiple actions to a menu or toolbar in one command. + + :param target: The menu or toolbar to add actions to + :param actions: The actions to be added. An action consisting of the keyword ``None`` + will result in a separator being inserted into the target. + """ + for action in actions: + if action is None: + target.addSeparator() + else: + target.addAction(action) diff --git a/openlp/core/ui/lib/__init__.py b/openlp/core/ui/lib/__init__.py new file mode 100644 index 000000000..02bded5b0 --- /dev/null +++ b/openlp/core/ui/lib/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2016 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### diff --git a/openlp/core/common/historycombobox.py b/openlp/core/ui/lib/historycombobox.py similarity index 98% rename from openlp/core/common/historycombobox.py rename to openlp/core/ui/lib/historycombobox.py index f0ec7c2ad..23e05e76e 100644 --- a/openlp/core/common/historycombobox.py +++ b/openlp/core/ui/lib/historycombobox.py @@ -20,7 +20,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`~openlp.core.common.historycombobox` module contains the HistoryComboBox widget +The :mod:`~openlp.core.ui.lib.historycombobox` module contains the HistoryComboBox widget """ from PyQt5 import QtCore, QtWidgets diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 3fd154c14..9618b1c48 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -35,7 +35,7 @@ from tempfile import gettempdir from PyQt5 import QtCore, QtGui, QtWidgets from openlp.core.common import Registry, RegistryProperties, AppLocation, LanguageManager, Settings, \ - check_directory_exists, translate, is_win, is_macosx + check_directory_exists, translate, is_win, is_macosx, add_actions from openlp.core.common.actions import ActionList, CategoryOrder from openlp.core.lib import Renderer, OpenLPDockWidget, PluginManager, ImageManager, PluginStatus, ScreenList, \ build_icon @@ -46,7 +46,7 @@ from openlp.core.ui.firsttimeform import FirstTimeForm from openlp.core.ui.media import MediaController from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.ui.projector.manager import ProjectorManager -from openlp.core.utils import get_application_version, add_actions +from openlp.core.utils import get_application_version log = logging.getLogger(__name__) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 8b09b18a2..800eec557 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -267,21 +267,6 @@ def check_latest_version(current_version): return version_string -def add_actions(target, actions): - """ - Adds multiple actions to a menu or toolbar in one command. - - :param target: The menu or toolbar to add actions to - :param actions: The actions to be added. An action consisting of the keyword ``None`` - will result in a separator being inserted into the target. - """ - for action in actions: - if action is None: - target.addSeparator() - else: - target.addAction(action) - - def get_filesystem_encoding(): """ Returns the name of the encoding used to convert Unicode filenames into system file names. @@ -450,7 +435,7 @@ def get_web_page(url, header=None, update_openlp=False): def get_uno_command(connection_type='pipe'): """ - Returns the UNO command to launch an openoffice.org instance. + Returns the UNO command to launch an libreoffice.org instance. """ for command in ['libreoffice', 'soffice']: if which(command): @@ -468,7 +453,7 @@ def get_uno_command(connection_type='pipe'): def get_uno_instance(resolver, connection_type='pipe'): """ - Returns a running openoffice.org instance. + Returns a running libreoffice.org instance. :param resolver: The UNO resolver to use to find a running instance. """ @@ -535,5 +520,5 @@ def get_natural_key(string): return key __all__ = ['get_application_version', 'check_latest_version', - 'add_actions', 'get_filesystem_encoding', 'get_web_page', 'get_uno_command', 'get_uno_instance', + 'get_filesystem_encoding', 'get_web_page', 'get_uno_command', 'get_uno_instance', 'delete_file', 'clean_filename', 'format_time', 'get_locale_key', 'get_natural_key'] diff --git a/openlp/plugins/songs/forms/songselectdialog.py b/openlp/plugins/songs/forms/songselectdialog.py index 68d91e1ae..833ee39ec 100644 --- a/openlp/plugins/songs/forms/songselectdialog.py +++ b/openlp/plugins/songs/forms/songselectdialog.py @@ -25,7 +25,7 @@ The :mod:`~openlp.plugins.songs.forms.songselectdialog` module contains the user from PyQt5 import QtCore, QtWidgets -from openlp.core.common import HistoryComboBox +from openlp.core.ui.lib.historycombobox import HistoryComboBox from openlp.core.lib import translate, build_icon from openlp.core.ui import SingleColumnTableWidget diff --git a/tests/functional/openlp_core_common/test_init.py b/tests/functional/openlp_core_common/test_init.py new file mode 100644 index 000000000..70fe6e943 --- /dev/null +++ b/tests/functional/openlp_core_common/test_init.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2016 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +Functional tests to test the AppLocation class and related methods. +""" +import os +from unittest import TestCase + +from openlp.core.common import add_actions +from tests.functional import MagicMock, patch + + +class TestInit(TestCase): + """ + A test suite to test out various methods around the common __init__ class. + """ + + def add_actions_empty_list_test(self): + """ + Test that no actions are added when the list is empty + """ + # GIVEN: a mocked action list, and an empty list + mocked_target = MagicMock() + empty_list = [] + + # WHEN: The empty list is added to the mocked target + add_actions(mocked_target, empty_list) + + # THEN: The add method on the mocked target is never called + self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called') + self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called') + + def add_actions_none_action_test(self): + """ + Test that a separator is added when a None action is in the list + """ + # GIVEN: a mocked action list, and a list with None in it + mocked_target = MagicMock() + separator_list = [None] + + # WHEN: The list is added to the mocked target + add_actions(mocked_target, separator_list) + + # THEN: The addSeparator method is called, but the addAction method is never called + mocked_target.addSeparator.assert_called_with() + self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called') + + def add_actions_add_action_test(self): + """ + Test that an action is added when a valid action is in the list + """ + # GIVEN: a mocked action list, and a list with an action in it + mocked_target = MagicMock() + action_list = ['action'] + + # WHEN: The list is added to the mocked target + add_actions(mocked_target, action_list) + + # THEN: The addSeparator method is not called, and the addAction method is called + self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called') + mocked_target.addAction.assert_called_with('action') + + def add_actions_action_and_none_test(self): + """ + Test that an action and a separator are added when a valid action and None are in the list + """ + # GIVEN: a mocked action list, and a list with an action and None in it + mocked_target = MagicMock() + action_list = ['action', None] + + # WHEN: The list is added to the mocked target + add_actions(mocked_target, action_list) + + # THEN: The addSeparator method is called, and the addAction method is called + mocked_target.addSeparator.assert_called_with() + mocked_target.addAction.assert_called_with('action') diff --git a/tests/functional/openlp_core_utils/test_utils.py b/tests/functional/openlp_core_utils/test_utils.py index a9e402369..fd033cd88 100644 --- a/tests/functional/openlp_core_utils/test_utils.py +++ b/tests/functional/openlp_core_utils/test_utils.py @@ -26,7 +26,8 @@ import os from unittest import TestCase from openlp.core.utils import clean_filename, delete_file, get_filesystem_encoding, get_locale_key, \ - get_natural_key, split_filename, _get_user_agent, get_web_page, get_uno_instance, add_actions + get_natural_key, split_filename, _get_user_agent, get_web_page, get_uno_instance + from tests.functional import MagicMock, patch @@ -34,65 +35,6 @@ class TestUtils(TestCase): """ A test suite to test out various methods around the AppLocation class. """ - def add_actions_empty_list_test(self): - """ - Test that no actions are added when the list is empty - """ - # GIVEN: a mocked action list, and an empty list - mocked_target = MagicMock() - empty_list = [] - - # WHEN: The empty list is added to the mocked target - add_actions(mocked_target, empty_list) - - # THEN: The add method on the mocked target is never called - self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called') - self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called') - - def add_actions_none_action_test(self): - """ - Test that a separator is added when a None action is in the list - """ - # GIVEN: a mocked action list, and a list with None in it - mocked_target = MagicMock() - separator_list = [None] - - # WHEN: The list is added to the mocked target - add_actions(mocked_target, separator_list) - - # THEN: The addSeparator method is called, but the addAction method is never called - mocked_target.addSeparator.assert_called_with() - self.assertEqual(0, mocked_target.addAction.call_count, 'addAction method should not have been called') - - def add_actions_add_action_test(self): - """ - Test that an action is added when a valid action is in the list - """ - # GIVEN: a mocked action list, and a list with an action in it - mocked_target = MagicMock() - action_list = ['action'] - - # WHEN: The list is added to the mocked target - add_actions(mocked_target, action_list) - - # THEN: The addSeparator method is not called, and the addAction method is called - self.assertEqual(0, mocked_target.addSeparator.call_count, 'addSeparator method should not have been called') - mocked_target.addAction.assert_called_with('action') - - def add_actions_action_and_none_test(self): - """ - Test that an action and a separator are added when a valid action and None are in the list - """ - # GIVEN: a mocked action list, and a list with an action and None in it - mocked_target = MagicMock() - action_list = ['action', None] - - # WHEN: The list is added to the mocked target - add_actions(mocked_target, action_list) - - # THEN: The addSeparator method is called, and the addAction method is called - mocked_target.addSeparator.assert_called_with() - mocked_target.addAction.assert_called_with('action') def get_filesystem_encoding_sys_function_not_called_test(self): """ diff --git a/tests/interfaces/openlp_core_ui_lib/__init__.py b/tests/interfaces/openlp_core_ui_lib/__init__.py new file mode 100644 index 000000000..02bded5b0 --- /dev/null +++ b/tests/interfaces/openlp_core_ui_lib/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2016 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### diff --git a/tests/interfaces/openlp_core_common/test_historycombobox.py b/tests/interfaces/openlp_core_ui_lib/test_historycombobox.py similarity index 96% rename from tests/interfaces/openlp_core_common/test_historycombobox.py rename to tests/interfaces/openlp_core_ui_lib/test_historycombobox.py index 1bc7a2f0d..7aa460c8f 100644 --- a/tests/interfaces/openlp_core_common/test_historycombobox.py +++ b/tests/interfaces/openlp_core_ui_lib/test_historycombobox.py @@ -28,9 +28,8 @@ from unittest import TestCase from PyQt5 import QtWidgets from openlp.core.common import Registry -from openlp.core.common import HistoryComboBox +from openlp.core.ui.lib.historycombobox import HistoryComboBox from tests.helpers.testmixin import TestMixin -from tests.interfaces import MagicMock, patch class TestHistoryComboBox(TestCase, TestMixin):