diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index eae8e1c04..fad17ab80 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -87,6 +87,8 @@ def create_button_box(dialog, name, standard_buttons, custom_buttons=None): buttons |= QtWidgets.QDialogButtonBox.Cancel if 'close' in standard_buttons: buttons |= QtWidgets.QDialogButtonBox.Close + if 'help' in standard_buttons and hasattr(dialog, 'provide_help'): + buttons |= QtWidgets.QDialogButtonBox.Help if 'defaults' in standard_buttons: buttons |= QtWidgets.QDialogButtonBox.RestoreDefaults button_box = QtWidgets.QDialogButtonBox(dialog) @@ -99,6 +101,8 @@ def create_button_box(dialog, name, standard_buttons, custom_buttons=None): button_box.addButton(*button) button_box.accepted.connect(dialog.accept) button_box.rejected.connect(dialog.reject) + if 'help' in standard_buttons and hasattr(dialog, 'provide_help'): + button_box.helpRequested.connect(dialog.provide_help) return button_box diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index e19487923..b4215ca25 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -30,7 +30,7 @@ import urllib.request from pathlib import Path from tempfile import gettempdir -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.api.deploy import get_latest_size, download_and_check from openlp.core.common import trace_error_handler @@ -100,7 +100,8 @@ class FirstTimeForm(QtWidgets.QWizard, UiFirstTimeWizard, RegistryProperties): """ Create and set up the first time wizard. """ - super(FirstTimeForm, self).__init__(parent) + super(FirstTimeForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint | + QtCore.Qt.WindowCloseButtonHint) self.has_web_access = True self.web = '' self.is_index_downloaded = False @@ -109,6 +110,14 @@ class FirstTimeForm(QtWidgets.QWizard, UiFirstTimeWizard, RegistryProperties): self.themes_list_widget.itemSelectionChanged.connect(self.on_themes_list_widget_selection_changed) self.themes_deselect_all_button.clicked.connect(self.themes_list_widget.clearSelection) self.themes_select_all_button.clicked.connect(self.themes_list_widget.selectAll) + self.setOption(QtWidgets.QWizard.HaveHelpButton, True) + self.helpRequested.connect(self.provide_help) + + def provide_help(self): + """ + Provide help within the wizard by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/wizard.html")) def get_next_page_id(self): """ diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index 345af8d33..7f03607ca 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -51,7 +51,7 @@ class Ui_SettingsDialog(object): self.stacked_layout = QtWidgets.QStackedLayout() self.stacked_layout.setObjectName('stacked_layout') self.dialog_layout.addLayout(self.stacked_layout, 0, 1, 1, 1) - self.button_box = create_button_box(settings_dialog, 'button_box', ['cancel', 'ok']) + self.button_box = create_button_box(settings_dialog, 'button_box', ['cancel', 'ok', 'help']) self.dialog_layout.addWidget(self.button_box, 1, 1, 1, 1) self.retranslate_ui(settings_dialog) diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 2f6d3896d..9ed4933b0 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -23,7 +23,7 @@ The :mod:`settingsform` provides a user interface for the OpenLP settings """ import logging -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.state import State from openlp.core.api.tab import ApiTab @@ -210,3 +210,9 @@ class SettingsForm(QtWidgets.QDialog, Ui_SettingsDialog, RegistryProperties): """ if function not in self.processes: self.processes.append(function) + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/configure.html")) diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index 9b4ea4941..a766d61d3 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -52,7 +52,8 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties): :param parent: The QWidget-derived parent of the wizard. """ - super(ThemeForm, self).__init__(parent) + super(ThemeForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint | + QtCore.Qt.WindowCloseButtonHint) self._setup() def _setup(self): @@ -75,6 +76,14 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties): self.main_area_page.shadow_size_changed.connect(self.calculate_lines) self.footer_area_page.font_name_changed.connect(self.update_theme) self.footer_area_page.font_size_changed.connect(self.update_theme) + self.setOption(QtWidgets.QWizard.HaveHelpButton, True) + self.helpRequested.connect(self.provide_help) + + def provide_help(self): + """ + Provide help within the wizard by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/themes.html")) def set_defaults(self): """ diff --git a/openlp/core/widgets/wizard.py b/openlp/core/widgets/wizard.py index eddf84cc3..80796690c 100644 --- a/openlp/core/widgets/wizard.py +++ b/openlp/core/widgets/wizard.py @@ -125,6 +125,10 @@ class OpenLPWizard(QtWidgets.QWizard, RegistryProperties): self.setModal(True) self.setOptions(QtWidgets.QWizard.IndependentPages | QtWidgets.QWizard.NoBackButtonOnStartPage | QtWidgets.QWizard.NoBackButtonOnLastPage) + # Set up a help button if the class of this instance has overridden the provide_help method + if (self.provide_help.__module__ != __name__): + self.setOption(QtWidgets.QWizard.HaveHelpButton, True) + self.helpRequested.connect(self.provide_help) if is_macosx(): self.setPixmap(QtWidgets.QWizard.BackgroundPixmap, QtGui.QPixmap(':/wizards/openlp-osx-wizard.png')) else: @@ -277,3 +281,9 @@ class OpenLPWizard(QtWidgets.QWizard, RegistryProperties): self.finish_button.setVisible(True) self.cancel_button.setVisible(False) self.application.process_events() + + def provide_help(self): + """ + Provide help - usually by opening the appropriate page of the openlp manual in the user's browser + """ + pass diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index de164ed65..73e065706 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -79,7 +79,7 @@ class AlertDialog(object): self.display_button = create_button(alert_dialog, 'display_button', icon=UiIcons().live, enabled=False) self.display_close_button = create_button(alert_dialog, 'display_close_button', icon=UiIcons().live, enabled=False) - self.button_box = create_button_box(alert_dialog, 'button_box', ['close'], + self.button_box = create_button_box(alert_dialog, 'button_box', ['close', 'help'], [self.display_button, self.display_close_button]) self.alert_dialog_layout.addWidget(self.button_box, 2, 0, 1, 2) self.retranslate_ui(alert_dialog) diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index b4d0c84e5..ae78e29b0 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -19,7 +19,7 @@ # along with this program. If not, see . # ########################################################################## -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.common.i18n import translate from openlp.core.common.registry import Registry @@ -217,3 +217,9 @@ class AlertForm(QtWidgets.QDialog, AlertDialog): self.delete_button.setEnabled(True) # We do not need to enable the save button, as it is only enabled # when typing text in the "alert_text_edit". + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/alert.html")) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 7287df906..427929086 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -25,7 +25,7 @@ import logging import urllib.error from lxml import etree -from PyQt5 import QtWidgets +from PyQt5 import QtWidgets, QtGui, QtCore try: from pysword import modules @@ -773,3 +773,9 @@ class BibleImportForm(OpenLPWizard): # Don't delete the db if it wasen't created if hasattr(importer, 'file'): delete_database(self.plugin.settings_section, importer.file) + + def provide_help(self): + """ + Provide help within the wizard by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/bibles.html")) diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py index 9e51aeb64..8c8084ee1 100644 --- a/openlp/plugins/bibles/forms/editbibledialog.py +++ b/openlp/plugins/bibles/forms/editbibledialog.py @@ -123,7 +123,7 @@ class Ui_EditBibleDialog(object): self.bible_tab_widget.addTab(self.book_name_tab, '') # Last few bits self.dialog_layout.addWidget(self.bible_tab_widget) - self.button_box = create_button_box(edit_bible_dialog, 'button_box', ['cancel', 'save']) + self.button_box = create_button_box(edit_bible_dialog, 'button_box', ['cancel', 'save', 'help']) self.dialog_layout.addWidget(self.button_box) self.retranslate_ui(edit_bible_dialog) QtCore.QMetaObject.connectSlotsByName(edit_bible_dialog) diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py index b00f279d1..5d121f620 100644 --- a/openlp/plugins/bibles/forms/editbibleform.py +++ b/openlp/plugins/bibles/forms/editbibleform.py @@ -22,7 +22,7 @@ import logging import re -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.common.i18n import UiStrings, translate from openlp.core.common.mixins import RegistryProperties @@ -213,3 +213,9 @@ class EditBibleForm(QtWidgets.QDialog, Ui_EditBibleDialog, RegistryProperties): 'The Book Name "{name}" has been entered more than once.').format(name=new_book_name)) return False return True + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/bibles.html#edit-bible-data")) diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 3a394d5ea..1b3339167 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -94,7 +94,7 @@ class Ui_CustomEditDialog(object): self.bottom_form_layout.addRow(self.credit_label, self.credit_edit) self.dialog_layout.addLayout(self.bottom_form_layout) self.preview_button = QtWidgets.QPushButton() - self.button_box = create_button_box(custom_edit_dialog, 'button_box', ['cancel', 'save'], + self.button_box = create_button_box(custom_edit_dialog, 'button_box', ['cancel', 'save', 'help'], [self.preview_button]) self.save_button = self.button_box.button(QtWidgets.QDialogButtonBox.Save) self.dialog_layout.addWidget(self.button_box) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index a099e74f1..998b1c5db 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -21,7 +21,7 @@ import logging -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.common.i18n import translate from openlp.core.common.registry import Registry @@ -244,3 +244,9 @@ class EditCustomForm(QtWidgets.QDialog, Ui_CustomEditDialog): 'You need to add at least one slide.')) return False return True + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/custom_slides.html")) diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index dd7c78bdc..adc3f7e94 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -289,7 +289,7 @@ class Ui_EditSongDialog(object): self.warning_label = QtWidgets.QLabel(edit_song_dialog) self.warning_label.setObjectName('warning_label') self.bottom_layout.addWidget(self.warning_label) - self.button_box = create_button_box(edit_song_dialog, 'button_box', ['cancel', 'save']) + self.button_box = create_button_box(edit_song_dialog, 'button_box', ['cancel', 'save', 'help']) self.bottom_layout.addWidget(self.button_box) self.dialog_layout.addLayout(self.bottom_layout) self.retranslate_ui(edit_song_dialog) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index a6664f6b9..63b31f2b0 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -26,7 +26,7 @@ import logging import re from shutil import copyfile -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.state import State from openlp.core.common.applocation import AppLocation @@ -1099,3 +1099,10 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties): clean_song(self.manager, self.song) self.manager.save_object(self.song) self.media_item.auto_select_id = self.song.id + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/songs.html#creating-or-editing-a-song" + "-slide")) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index 28041d038..d0a100b9c 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -24,7 +24,7 @@ OpenLyrics format. """ import logging -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.common.i18n import UiStrings, translate from openlp.core.common.registry import Registry @@ -290,6 +290,12 @@ class SongExportForm(OpenLPWizard): if not item.isHidden(): item.setCheckState(QtCore.Qt.Checked) + def provide_help(self): + """ + Provide help within the wizard by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/export_songs.html")) + def find_list_widget_items(list_widget, text=''): """ diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 1189914ac..2e7355df9 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -23,7 +23,7 @@ The song import functions for OpenLP. """ import logging -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.common.i18n import UiStrings, translate from openlp.core.common.mixins import RegistryProperties @@ -463,6 +463,12 @@ class SongImportForm(OpenLPWizard, RegistryProperties): self.format_widgets[this_format]['import_widget'] = import_widget return import_widget + def provide_help(self): + """ + Provide help within the wizard by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/songs.html#song-importer")) + class SongImportSourcePage(QtWidgets.QWizardPage): """ diff --git a/openlp/plugins/songusage/forms/songusagedeletedialog.py b/openlp/plugins/songusage/forms/songusagedeletedialog.py index 7a207c056..971547c92 100644 --- a/openlp/plugins/songusage/forms/songusagedeletedialog.py +++ b/openlp/plugins/songusage/forms/songusagedeletedialog.py @@ -52,7 +52,7 @@ class Ui_SongUsageDeleteDialog(object): self.delete_calendar.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.NoVerticalHeader) self.delete_calendar.setObjectName('delete_calendar') self.vertical_layout.addWidget(self.delete_calendar) - self.button_box = create_button_box(song_usage_delete_dialog, 'button_box', ['cancel', 'ok']) + self.button_box = create_button_box(song_usage_delete_dialog, 'button_box', ['cancel', 'ok', 'help']) self.vertical_layout.addWidget(self.button_box) self.retranslate_ui(song_usage_delete_dialog) diff --git a/openlp/plugins/songusage/forms/songusagedeleteform.py b/openlp/plugins/songusage/forms/songusagedeleteform.py index 2638487e1..fc3009b0c 100644 --- a/openlp/plugins/songusage/forms/songusagedeleteform.py +++ b/openlp/plugins/songusage/forms/songusagedeleteform.py @@ -19,7 +19,7 @@ # along with this program. If not, see . # ########################################################################## -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from openlp.core.common.i18n import translate from openlp.core.common.mixins import RegistryProperties @@ -65,3 +65,9 @@ class SongUsageDeleteForm(QtWidgets.QDialog, Ui_SongUsageDeleteDialog, RegistryP self.accept() else: self.reject() + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/song_usage.html")) diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py index 895420bf0..8b901c699 100644 --- a/openlp/plugins/songusage/forms/songusagedetaildialog.py +++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py @@ -71,7 +71,7 @@ class Ui_SongUsageDetailDialog(object): self.report_path_edit = PathEdit(self.file_group_box, path_type=PathEditType.Directories, show_revert=False) self.file_horizontal_layout.addWidget(self.report_path_edit) self.vertical_layout.addWidget(self.file_group_box) - self.button_box = create_button_box(song_usage_detail_dialog, 'button_box', ['cancel', 'ok']) + self.button_box = create_button_box(song_usage_detail_dialog, 'button_box', ['cancel', 'ok', 'help']) self.vertical_layout.addWidget(self.button_box) self.retranslate_ui(song_usage_detail_dialog) self.report_path_edit.pathChanged.connect(song_usage_detail_dialog.on_report_path_edit_path_changed) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index 6b335d4b7..0f1ef4004 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -20,7 +20,7 @@ ########################################################################## import logging -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui from sqlalchemy.sql import and_ from openlp.core.common.i18n import translate @@ -119,3 +119,9 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP 'An error occurred while creating the report: {error}' ).format(error=ose.strerror)) self.close() + + def provide_help(self): + """ + Provide help within the form by opening the appropriate page of the openlp manual in the user's browser + """ + QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://manual.openlp.org/song_usage.html")) diff --git a/tests/openlp_core/ui/test_firsttimeform.py b/tests/openlp_core/ui/test_firsttimeform.py index 51e18deaf..e136c7034 100644 --- a/tests/openlp_core/ui/test_firsttimeform.py +++ b/tests/openlp_core/ui/test_firsttimeform.py @@ -25,7 +25,7 @@ import pytest from pathlib import Path from unittest.mock import MagicMock, call, patch, DEFAULT -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtTest from openlp.core.common.registry import Registry from openlp.core.ui.firsttimeform import FirstTimeForm, ThemeListWidgetItem @@ -482,3 +482,18 @@ def test_successful_download(mocked_build_icon, mocked_set_icon): # THEN: An icon should have been built from the downloaded file and used to replace the loading icon mocked_build_icon.assert_called_once_with(test_path) mocked_set_icon.assert_has_calls([call(UiIcons().picture), call(mocked_build_icon())]) + + +@patch.object(FirstTimeForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: A First Time Wizard and a patched help function + frw = FirstTimeForm(None) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(frw.button(QtWidgets.QWizard.HelpButton), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_core/ui/test_settingsform.py b/tests/openlp_core/ui/test_settingsform.py index fa891e80f..7b0572b46 100644 --- a/tests/openlp_core/ui/test_settingsform.py +++ b/tests/openlp_core/ui/test_settingsform.py @@ -23,7 +23,7 @@ Package to test the openlp.core.ui.settingsform package. """ from unittest.mock import MagicMock, patch -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets, QtTest from openlp.core.ui.settingsform import SettingsForm @@ -167,3 +167,18 @@ def test_register_post_process(registry): # THEN: The fake function should be in the settings form's list assert fake_function in settings_form.processes + + +@patch.object(SettingsForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: An initialised Settings form and a patched help function + settings_form = SettingsForm(None) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(settings_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/alerts/forms/test_alertform.py b/tests/openlp_plugins/alerts/forms/test_alertform.py new file mode 100644 index 000000000..0d54738ac --- /dev/null +++ b/tests/openlp_plugins/alerts/forms/test_alertform.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +########################################################################## +# OpenLP - Open Source Lyrics Projection # +# ---------------------------------------------------------------------- # +# Copyright (c) 2008-2021 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, either version 3 of the License, or # +# (at your option) any later version. # +# # +# 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, see . # +########################################################################## +""" +Package to test the openlp.plugins.alerts.forms.alertform package. +""" +from unittest.mock import MagicMock, patch + +from PyQt5 import QtWidgets, QtTest, QtCore + +from openlp.plugins.alerts.forms.alertform import AlertForm + + +@patch.object(AlertForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: An alert form and a patched help function + alert_form = AlertForm(MagicMock()) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(alert_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/bibles/forms/test_bibleimportform.py b/tests/openlp_plugins/bibles/forms/test_bibleimportform.py index 0e45ce473..23ba774d9 100644 --- a/tests/openlp_plugins/bibles/forms/test_bibleimportform.py +++ b/tests/openlp_plugins/bibles/forms/test_bibleimportform.py @@ -24,7 +24,7 @@ Package to test the openlp.plugins.bibles.forms.bibleimportform package. from unittest import TestCase, skip from unittest.mock import MagicMock, patch -from PyQt5 import QtWidgets +from PyQt5 import QtWidgets, QtTest, QtCore from openlp.core.common.registry import Registry from openlp.plugins.bibles.forms.bibleimportform import BibleImportForm @@ -89,3 +89,17 @@ class TestBibleImportForm(TestCase, TestMixin): # THEN: sword_tab_widget.setDisabled(True) should have been called self.form.sword_tab_widget.setDisabled.assert_called_with(True) + + @patch.object(BibleImportForm, 'provide_help') + def test_help(self, mocked_help, settings): + """ + Test the help button + """ + # GIVEN: A bible import wizard and a patched help function + bible_import_form = BibleImportForm(None, MagicMock(), None) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(bible_import_form.button(QtWidgets.QWizard.HelpButton), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/bibles/forms/test_editbibleform.py b/tests/openlp_plugins/bibles/forms/test_editbibleform.py new file mode 100644 index 000000000..df918b43e --- /dev/null +++ b/tests/openlp_plugins/bibles/forms/test_editbibleform.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +########################################################################## +# OpenLP - Open Source Lyrics Projection # +# ---------------------------------------------------------------------- # +# Copyright (c) 2008-2021 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, either version 3 of the License, or # +# (at your option) any later version. # +# # +# 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, see . # +########################################################################## +""" +Package to test the openlp.plugins.bibles.forms.editbibleform package. +""" +from unittest.mock import MagicMock, patch + +from PyQt5 import QtWidgets, QtTest, QtCore + +from openlp.plugins.bibles.forms.editbibleform import EditBibleForm + + +@patch.object(EditBibleForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: An edit bible form and a patched help function + main_window = QtWidgets.QMainWindow() + edit_bible_form = EditBibleForm(MagicMock(), main_window, MagicMock()) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(edit_bible_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/custom/forms/test_customform.py b/tests/openlp_plugins/custom/forms/test_customform.py index ee3d6827b..4759fea79 100644 --- a/tests/openlp_plugins/custom/forms/test_customform.py +++ b/tests/openlp_plugins/custom/forms/test_customform.py @@ -132,3 +132,19 @@ def test_update_slide_list(form): # THEN: The slides should be created in correct order form.slide_list_view.addItems.assert_called_with(['1st Slide', '2nd Slide', '3rd Slide']) + + +@patch.object(EditCustomForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: An edit custom slide form and a patched help function + main_window = QtWidgets.QMainWindow() + custom_form = EditCustomForm(MagicMock(), main_window, MagicMock()) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(custom_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/songs/forms/test_editsongform.py b/tests/openlp_plugins/songs/forms/test_editsongform.py index 640f3fddd..a95b467ab 100644 --- a/tests/openlp_plugins/songs/forms/test_editsongform.py +++ b/tests/openlp_plugins/songs/forms/test_editsongform.py @@ -22,9 +22,9 @@ Package to test the openlp.plugins.songs.forms.editsongform package. """ import pytest -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch -from PyQt5 import QtWidgets +from PyQt5 import QtWidgets, QtTest, QtCore from openlp.core.common.i18n import UiStrings from openlp.core.common.registry import Registry @@ -143,3 +143,21 @@ def test_verse_order_lowercase(form): # THEN: The verse order should be converted to uppercase assert form.verse_order_edit.text() == 'V1 V2 C1 V3 C1 V4 C1' + + +@patch.object(EditSongForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: An edit song form and a patched help function + main_window = QtWidgets.QMainWindow() + Registry().register('main_window', main_window) + Registry().register('theme_manager', MagicMock()) + edit_song_form = EditSongForm(MagicMock(), main_window, MagicMock()) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(edit_song_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/songusage/forms/test_songusagedeleteform.py b/tests/openlp_plugins/songusage/forms/test_songusagedeleteform.py new file mode 100644 index 000000000..3c482d4a2 --- /dev/null +++ b/tests/openlp_plugins/songusage/forms/test_songusagedeleteform.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +########################################################################## +# OpenLP - Open Source Lyrics Projection # +# ---------------------------------------------------------------------- # +# Copyright (c) 2008-2021 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, either version 3 of the License, or # +# (at your option) any later version. # +# # +# 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, see . # +########################################################################## +""" +Package to test the openlp.plugins.songusage.forms.songusagedeleteform package. +""" +from unittest.mock import MagicMock, patch + +from PyQt5 import QtWidgets, QtTest, QtCore + +from openlp.plugins.songusage.forms.songusagedeleteform import SongUsageDeleteForm + + +@patch.object(SongUsageDeleteForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: A songusage delete form and a patched help function + main_window = QtWidgets.QMainWindow() + delete_form = SongUsageDeleteForm(MagicMock(), main_window) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(delete_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once() diff --git a/tests/openlp_plugins/songusage/forms/test_songusagedetailform.py b/tests/openlp_plugins/songusage/forms/test_songusagedetailform.py new file mode 100644 index 000000000..f24a05025 --- /dev/null +++ b/tests/openlp_plugins/songusage/forms/test_songusagedetailform.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +########################################################################## +# OpenLP - Open Source Lyrics Projection # +# ---------------------------------------------------------------------- # +# Copyright (c) 2008-2021 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, either version 3 of the License, or # +# (at your option) any later version. # +# # +# 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, see . # +########################################################################## +""" +Package to test the openlp.plugins.songusage.forms.songusagedetailform package. +""" +from unittest.mock import MagicMock, patch + +from PyQt5 import QtWidgets, QtTest, QtCore + +from openlp.plugins.songusage.forms.songusagedetailform import SongUsageDetailForm + + +@patch.object(SongUsageDetailForm, 'provide_help') +def test_help(mocked_help, settings): + """ + Test the help button + """ + # GIVEN: A songusage detail form and a patched help function + main_window = QtWidgets.QMainWindow() + detail_form = SongUsageDetailForm(MagicMock(), main_window) + + # WHEN: The Help button is clicked + QtTest.QTest.mouseClick(detail_form.button_box.button(QtWidgets.QDialogButtonBox.Help), QtCore.Qt.LeftButton) + + # THEN: The Help function should be called + mocked_help.assert_called_once()