From bdec3f407b4723152595bfdc2484982a010317bc Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Mon, 22 Oct 2018 21:17:55 +0100 Subject: [PATCH 1/2] Remove proxy settings from individual bibles and use the centeral OpenLP proxy server settings. --- openlp/core/common/settings.py | 9 +- openlp/plugins/bibles/bibleplugin.py | 4 - .../plugins/bibles/forms/bibleimportform.py | 64 +---- openlp/plugins/bibles/lib/db.py | 9 +- openlp/plugins/bibles/lib/importers/http.py | 45 +--- openlp/plugins/bibles/lib/manager.py | 4 - openlp/plugins/bibles/lib/upgrade.py | 55 ++++- .../openlp_plugins/bibles/test_upgrade.py | 219 ++++++++++++++++++ tests/resources/bibles/tests.sqlite | Bin 26624 -> 26624 bytes .../web-bible-2.4.6-proxy-meta-v1.sqlite | Bin 0 -> 49152 bytes .../bibles/web-bible-2.4.6-v1.sqlite | Bin 0 -> 49152 bytes 11 files changed, 308 insertions(+), 101 deletions(-) create mode 100644 tests/functional/openlp_plugins/bibles/test_upgrade.py create mode 100644 tests/resources/bibles/web-bible-2.4.6-proxy-meta-v1.sqlite create mode 100644 tests/resources/bibles/web-bible-2.4.6-v1.sqlite diff --git a/openlp/core/common/settings.py b/openlp/core/common/settings.py index 74d686b09..6fe0429cb 100644 --- a/openlp/core/common/settings.py +++ b/openlp/core/common/settings.py @@ -274,7 +274,14 @@ class Settings(QtCore.QSettings): ('songuasge/db password', 'songusage/db password', []), ('songuasge/db hostname', 'songusage/db hostname', []), ('songuasge/db database', 'songusage/db database', []), - ('presentations / Powerpoint Viewer', '', []) + ('presentations / Powerpoint Viewer', '', []), + ('songuasge/db hostname', 'songusage/db hostname', []), + ('songuasge/db hostname', 'songusage/db hostname', []), + ('songuasge/db hostname', 'songusage/db hostname', []), + ('bibles/proxy name', '', []), # Just remove these bible proxy settings. They weren't used in 2.4! + ('bibles/proxy address', '', []), + ('bibles/proxy username', '', []), + ('bibles/proxy password', '', []) ] @staticmethod diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 1b507e97f..85d903546 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -52,10 +52,6 @@ __default_settings__ = { 'bibles/display new chapter': False, 'bibles/second bibles': True, 'bibles/primary bible': '', - 'bibles/proxy name': '', - 'bibles/proxy address': '', - 'bibles/proxy username': '', - 'bibles/proxy password': '', 'bibles/bible theme': '', 'bibles/verse separator': '', 'bibles/range separator': '', diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index d32711b62..912ab26e5 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -210,22 +210,22 @@ class BibleImportForm(OpenLPWizard): self.open_song_layout.addRow(self.open_song_file_label, self.open_song_path_edit) self.open_song_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacer) self.select_stack.addWidget(self.open_song_widget) - self.web_tab_widget = QtWidgets.QTabWidget(self.select_page) - self.web_tab_widget.setObjectName('WebTabWidget') + self.web_widget = QtWidgets.QWidget(self.select_page) + self.web_widget.setObjectName('WebWidget') self.web_bible_tab = QtWidgets.QWidget() self.web_bible_tab.setObjectName('WebBibleTab') - self.web_bible_layout = QtWidgets.QFormLayout(self.web_bible_tab) + self.web_bible_layout = QtWidgets.QFormLayout(self.web_widget) self.web_bible_layout.setObjectName('WebBibleLayout') - self.web_update_label = QtWidgets.QLabel(self.web_bible_tab) + self.web_update_label = QtWidgets.QLabel(self.web_widget) self.web_update_label.setObjectName('WebUpdateLabel') self.web_bible_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.web_update_label) - self.web_update_button = QtWidgets.QPushButton(self.web_bible_tab) + self.web_update_button = QtWidgets.QPushButton(self.web_widget) self.web_update_button.setObjectName('WebUpdateButton') self.web_bible_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.web_update_button) - self.web_source_label = QtWidgets.QLabel(self.web_bible_tab) + self.web_source_label = QtWidgets.QLabel(self.web_widget) self.web_source_label.setObjectName('WebSourceLabel') self.web_bible_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.web_source_label) - self.web_source_combo_box = QtWidgets.QComboBox(self.web_bible_tab) + self.web_source_combo_box = QtWidgets.QComboBox(self.web_widget) self.web_source_combo_box.setObjectName('WebSourceComboBox') self.web_source_combo_box.addItems(['', '', '']) self.web_source_combo_box.setEnabled(False) @@ -243,31 +243,7 @@ class BibleImportForm(OpenLPWizard): self.web_progress_bar.setObjectName('WebTranslationProgressBar') self.web_progress_bar.setVisible(False) self.web_bible_layout.setWidget(3, QtWidgets.QFormLayout.SpanningRole, self.web_progress_bar) - self.web_tab_widget.addTab(self.web_bible_tab, '') - self.web_proxy_tab = QtWidgets.QWidget() - self.web_proxy_tab.setObjectName('WebProxyTab') - self.web_proxy_layout = QtWidgets.QFormLayout(self.web_proxy_tab) - self.web_proxy_layout.setObjectName('WebProxyLayout') - self.web_server_label = QtWidgets.QLabel(self.web_proxy_tab) - self.web_server_label.setObjectName('WebServerLabel') - self.web_proxy_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.web_server_label) - self.web_server_edit = QtWidgets.QLineEdit(self.web_proxy_tab) - self.web_server_edit.setObjectName('WebServerEdit') - self.web_proxy_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.web_server_edit) - self.web_user_label = QtWidgets.QLabel(self.web_proxy_tab) - self.web_user_label.setObjectName('WebUserLabel') - self.web_proxy_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.web_user_label) - self.web_user_edit = QtWidgets.QLineEdit(self.web_proxy_tab) - self.web_user_edit.setObjectName('WebUserEdit') - self.web_proxy_layout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.web_user_edit) - self.web_password_label = QtWidgets.QLabel(self.web_proxy_tab) - self.web_password_label.setObjectName('WebPasswordLabel') - self.web_proxy_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.web_password_label) - self.web_password_edit = QtWidgets.QLineEdit(self.web_proxy_tab) - self.web_password_edit.setObjectName('WebPasswordEdit') - self.web_proxy_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.web_password_edit) - self.web_tab_widget.addTab(self.web_proxy_tab, '') - self.select_stack.addWidget(self.web_tab_widget) + self.select_stack.addWidget(self.web_widget) self.zefania_widget = QtWidgets.QWidget(self.select_page) self.zefania_widget.setObjectName('ZefaniaWidget') self.zefania_layout = QtWidgets.QFormLayout(self.zefania_widget) @@ -427,14 +403,6 @@ class BibleImportForm(OpenLPWizard): self.web_source_combo_box.setItemText(WebDownload.Bibleserver, translate('BiblesPlugin.ImportWizardForm', 'Bibleserver')) self.web_translation_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible:')) - self.web_tab_widget.setTabText(self.web_tab_widget.indexOf(self.web_bible_tab), - translate('BiblesPlugin.ImportWizardForm', 'Download Options')) - self.web_server_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Server:')) - self.web_user_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Username:')) - self.web_password_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Password:')) - self.web_tab_widget.setTabText( - self.web_tab_widget.indexOf(self.web_proxy_tab), translate('BiblesPlugin.ImportWizardForm', - 'Proxy Server (Optional)')) self.sword_bible_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Bibles:')) self.sword_folder_label.setText(translate('BiblesPlugin.ImportWizardForm', 'SWORD data folder:')) self.sword_zipfile_label.setText(translate('BiblesPlugin.ImportWizardForm', 'SWORD zip-file:')) @@ -609,11 +577,10 @@ class BibleImportForm(OpenLPWizard): self.web_update_button.setEnabled(False) self.web_progress_bar.setVisible(True) self.web_progress_bar.setValue(0) - proxy_server = self.field('proxy_server') # TODO: Where does critical_error_message_box get %s string from? - for (download_type, extractor) in ((WebDownload.Crosswalk, CWExtract(proxy_server)), - (WebDownload.BibleGateway, BGExtract(proxy_server)), - (WebDownload.Bibleserver, BSExtract(proxy_server))): + for (download_type, extractor) in ((WebDownload.Crosswalk, CWExtract()), + (WebDownload.BibleGateway, BGExtract()), + (WebDownload.Bibleserver, BSExtract())): try: bibles = extractor.get_bibles_from_http() except (urllib.error.URLError, ConnectionError) as err: @@ -679,9 +646,6 @@ class BibleImportForm(OpenLPWizard): self.select_page.registerField('web_biblename', self.web_translation_combo_box) self.select_page.registerField('sword_folder_path', self.sword_folder_path_edit, 'path', PathEdit.pathChanged) self.select_page.registerField('sword_zip_path', self.sword_zipfile_path_edit, 'path', PathEdit.pathChanged) - self.select_page.registerField('proxy_server', self.web_server_edit) - self.select_page.registerField('proxy_username', self.web_user_edit) - self.select_page.registerField('proxy_password', self.web_password_edit) self.license_details_page.registerField('license_version', self.version_name_edit) self.license_details_page.registerField('license_copyright', self.copyright_edit) self.license_details_page.registerField('license_permissions', self.permissions_edit) @@ -706,9 +670,6 @@ class BibleImportForm(OpenLPWizard): self.setField('sword_zip_path', None) self.setField('web_location', WebDownload.Crosswalk) self.setField('web_biblename', self.web_translation_combo_box.currentIndex()) - self.setField('proxy_server', settings.value('proxy address')) - self.setField('proxy_username', settings.value('proxy username')) - self.setField('proxy_password', settings.value('proxy password')) self.setField('license_version', self.version_name_edit.text()) self.version_name_edit.setPlaceholderText(UiStrings().RequiredShowInFooter) self.setField('license_copyright', self.copyright_edit.text()) @@ -765,9 +726,6 @@ class BibleImportForm(OpenLPWizard): BibleFormat.WebDownload, name=license_version, download_source=WebDownload.Names[download_location], download_name=bible, - proxy_server=self.field('proxy_server'), - proxy_username=self.field('proxy_username'), - proxy_password=self.field('proxy_password'), language_id=language_id ) elif bible_type == BibleFormat.Zefania: diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 040115d56..e42fed5c6 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -82,20 +82,19 @@ def init_schema(url): meta_table = Table('metadata', metadata, Column('key', types.Unicode(255), primary_key=True, index=True), - Column('value', types.Unicode(255)),) + Column('value', types.Unicode(255))) book_table = Table('book', metadata, Column('id', types.Integer, primary_key=True), Column('book_reference_id', types.Integer, index=True), Column('testament_reference_id', types.Integer), - Column('name', types.Unicode(50), index=True),) + Column('name', types.Unicode(50), index=True)) verse_table = Table('verse', metadata, Column('id', types.Integer, primary_key=True, index=True), - Column('book_id', types.Integer, ForeignKey( - 'book.id'), index=True), + Column('book_id', types.Integer, ForeignKey('book.id'), index=True), Column('chapter', types.Integer, index=True), Column('verse', types.Integer, index=True), - Column('text', types.UnicodeText, index=True),) + Column('text', types.UnicodeText, index=True)) try: class_mapper(BibleMeta) diff --git a/openlp/plugins/bibles/lib/importers/http.py b/openlp/plugins/bibles/lib/importers/http.py index 4eee26256..c624210be 100644 --- a/openlp/plugins/bibles/lib/importers/http.py +++ b/openlp/plugins/bibles/lib/importers/http.py @@ -94,9 +94,8 @@ class BGExtract(RegistryProperties): """ NAME = 'BibleGateway' - def __init__(self, proxy_url=None): - log.debug('BGExtract.init(proxy_url="{url}")'.format(url=proxy_url)) - self.proxy_url = proxy_url + def __init__(self): + log.debug('BGExtract.__init__()') socket.setdefaulttimeout(30) def _remove_elements(self, parent, tag, class_=None): @@ -358,9 +357,8 @@ class BSExtract(RegistryProperties): """ NAME = 'BibleServer' - def __init__(self, proxy_url=None): - log.debug('BSExtract.init("{url}")'.format(url=proxy_url)) - self.proxy_url = proxy_url + def __init__(self): + log.debug('BSExtract.__init__()') socket.setdefaulttimeout(30) def get_bible_chapter(self, version, book_name, chapter): @@ -461,9 +459,8 @@ class CWExtract(RegistryProperties): """ NAME = 'Crosswalk' - def __init__(self, proxy_url=None): - log.debug('CWExtract.init("{url}")'.format(url=proxy_url)) - self.proxy_url = proxy_url + def __init__(self): + log.debug('CWExtract.__init__()') socket.setdefaulttimeout(30) def get_bible_chapter(self, version, book_name, chapter): @@ -595,19 +592,9 @@ class HTTPBible(BibleImport, RegistryProperties): super().__init__(*args, **kwargs) self.download_source = kwargs['download_source'] self.download_name = kwargs['download_name'] - # TODO: Clean up proxy stuff. We probably want one global proxy per connection type (HTTP and HTTPS) at most. - self.proxy_server = None - self.proxy_username = None - self.proxy_password = None self.language_id = None if 'path' in kwargs: self.path = kwargs['path'] - if 'proxy_server' in kwargs: - self.proxy_server = kwargs['proxy_server'] - if 'proxy_username' in kwargs: - self.proxy_username = kwargs['proxy_username'] - if 'proxy_password' in kwargs: - self.proxy_password = kwargs['proxy_password'] if 'language_id' in kwargs: self.language_id = kwargs['language_id'] @@ -621,20 +608,12 @@ class HTTPBible(BibleImport, RegistryProperties): 'Registering Bible and loading books...')) self.save_meta('download_source', self.download_source) self.save_meta('download_name', self.download_name) - if self.proxy_server: - self.save_meta('proxy_server', self.proxy_server) - if self.proxy_username: - # Store the proxy userid. - self.save_meta('proxy_username', self.proxy_username) - if self.proxy_password: - # Store the proxy password. - self.save_meta('proxy_password', self.proxy_password) if self.download_source.lower() == 'crosswalk': - handler = CWExtract(self.proxy_server) + handler = CWExtract() elif self.download_source.lower() == 'biblegateway': - handler = BGExtract(self.proxy_server) + handler = BGExtract() elif self.download_source.lower() == 'bibleserver': - handler = BSExtract(self.proxy_server) + handler = BSExtract() books = handler.get_books_from_http(self.download_name) if not books: log.error('Importing books from {source} - download name: "{name}" ' @@ -722,11 +701,11 @@ class HTTPBible(BibleImport, RegistryProperties): log.debug('HTTPBible.get_chapter("{book}", "{chapter}")'.format(book=book, chapter=chapter)) log.debug('source = {source}'.format(source=self.download_source)) if self.download_source.lower() == 'crosswalk': - handler = CWExtract(self.proxy_server) + handler = CWExtract() elif self.download_source.lower() == 'biblegateway': - handler = BGExtract(self.proxy_server) + handler = BGExtract() elif self.download_source.lower() == 'bibleserver': - handler = BSExtract(self.proxy_server) + handler = BSExtract() return handler.get_bible_chapter(self.download_name, book, chapter) def get_books(self): diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 1e1b4243d..fce411870 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -116,7 +116,6 @@ class BibleManager(LogMixin, RegistryProperties): self.web = 'Web' self.db_cache = None self.path = AppLocation.get_section_data_path(self.settings_section) - self.proxy_name = Settings().value(self.settings_section + '/proxy name') self.suffix = '.sqlite' self.import_wizard = None self.reload_bibles() @@ -149,11 +148,8 @@ class BibleManager(LogMixin, RegistryProperties): if self.db_cache[name].is_web_bible: source = self.db_cache[name].get_object(BibleMeta, 'download_source') download_name = self.db_cache[name].get_object(BibleMeta, 'download_name').value - meta_proxy = self.db_cache[name].get_object(BibleMeta, 'proxy_server') web_bible = HTTPBible(self.parent, path=self.path, file=file_path, download_source=source.value, download_name=download_name) - if meta_proxy: - web_bible.proxy_server = meta_proxy.value self.db_cache[name] = web_bible log.debug('Bibles reloaded') diff --git a/openlp/plugins/bibles/lib/upgrade.py b/openlp/plugins/bibles/lib/upgrade.py index c53f9d324..76fa49ca0 100644 --- a/openlp/plugins/bibles/lib/upgrade.py +++ b/openlp/plugins/bibles/lib/upgrade.py @@ -24,8 +24,16 @@ The :mod:`upgrade` module provides a way for the database and schema that is the """ import logging +from PyQt5 import QtWidgets +from sqlalchemy import Table +from sqlalchemy.sql.expression import delete, select + +from openlp.core.common.i18n import translate +from openlp.core.common.settings import ProxyMode, Settings +from openlp.core.lib.db import get_upgrade_op + log = logging.getLogger(__name__) -__version__ = 1 +__version__ = 2 # TODO: When removing an upgrade path the ftw-data needs updating to the minimum supported version @@ -36,3 +44,48 @@ def upgrade_1(session, metadata): This upgrade renamed a number of keys to a single naming convention. """ log.info('No upgrades to perform') + + +def upgrade_2(session, metadata): + """ + Remove the individual proxy settings, after the implementation of central proxy settings. + Added in 2.5 (3.0 development) + """ + # TODO: Test + settings = Settings() + op = get_upgrade_op(session) + metadata_table = Table('metadata', metadata, autoload=True) + proxy, = session.execute(select([metadata_table.c.value], metadata_table.c.key == 'proxy_server')).first() or ('', ) + if proxy and not \ + (proxy == settings.value('advanced/proxy http') or proxy == settings.value('advanced/proxy https')): + http_proxy = '' + https_proxy = '' + name, = session.execute(select([metadata_table.c.value], metadata_table.c.key == 'name')).first() + msg_box = QtWidgets.QMessageBox() + msg_box.setText(translate('BiblesPlugin', f'The proxy server {proxy} was found in the bible {name}.
' + f'Would you like to set it as the proxy for OpenLP?')) + msg_box.setIcon(QtWidgets.QMessageBox.Question) + msg_box.addButton(QtWidgets.QMessageBox.No) + http_button = msg_box.addButton('http', QtWidgets.QMessageBox.ActionRole) + both_button = msg_box.addButton(translate('BiblesPlugin', 'both'), QtWidgets.QMessageBox.ActionRole) + https_button = msg_box.addButton('https', QtWidgets.QMessageBox.ActionRole) + msg_box.setDefaultButton(both_button) + msg_box.exec() + + clicked_button = msg_box.clickedButton() + if clicked_button in [http_button, both_button]: + http_proxy = proxy + settings.setValue('advanced/proxy http', proxy) + if clicked_button in [https_button, both_button]: + https_proxy = proxy + settings.setValue('advanced/proxy https', proxy) + if http_proxy or https_proxy: + username, = session.execute(select([metadata_table.c.value], metadata_table.c.key == 'proxy_username')).first() + proxy, = session.execute(select([metadata_table.c.value], metadata_table.c.key == 'proxy_password')).first() + settings.setValue('advanced/proxy username', username) + settings.setValue('advanced/proxy password', proxy) + settings.setValue('advanced/proxy mode', ProxyMode.MANUAL_PROXY) + + op.execute(delete(metadata_table, metadata_table.c.key == 'proxy_server')) + op.execute(delete(metadata_table, metadata_table.c.key == 'proxy_username')) + op.execute(delete(metadata_table, metadata_table.c.key == 'proxy_password')) diff --git a/tests/functional/openlp_plugins/bibles/test_upgrade.py b/tests/functional/openlp_plugins/bibles/test_upgrade.py new file mode 100644 index 000000000..0eb33338d --- /dev/null +++ b/tests/functional/openlp_plugins/bibles/test_upgrade.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2018 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 # +############################################################################### +""" +This module contains tests for the upgrade submodule of the Bibles plugin. +""" +import os +import shutil +from pathlib import Path +from tempfile import mkdtemp +from unittest import TestCase +from unittest.mock import MagicMock, call, patch + +from PyQt5 import QtWidgets +from sqlalchemy import create_engine + +from openlp.core.common.settings import ProxyMode +from openlp.core.lib.db import upgrade_db +from openlp.plugins.bibles.lib import upgrade +from tests.helpers.testmixin import TestMixin +from tests.utils.constants import RESOURCE_PATH + + +class TestUpgrade(TestCase, TestMixin): + """ + Test the `upgrade_2` function in the :mod:`upgrade` module when the db does not contains proxy metadata + """ + + def setUp(self): + """ + Setup for tests + """ + self.tmp_path = Path(mkdtemp()) + db_path = RESOURCE_PATH / 'bibles' / 'web-bible-2.4.6-v1.sqlite' + db_tmp_path = self.tmp_path / 'web-bible-2.4.6-v1.sqlite' + shutil.copyfile(db_path, db_tmp_path) + self.db_url = 'sqlite:///' + str(db_tmp_path) + + patched_settings = patch('openlp.plugins.bibles.lib.upgrade.Settings') + self.mocked_settings = patched_settings.start() + self.addCleanup(patched_settings.stop) + self.mocked_settings_instance = MagicMock() + self.mocked_settings.return_value = self.mocked_settings_instance + + patched_message_box = patch('openlp.plugins.bibles.lib.upgrade.QtWidgets.QMessageBox') + self.mocked_message_box = patched_message_box.start() + self.addCleanup(patched_message_box.stop) + + def tearDown(self): + """ + Clean up after tests + """ + # Ignore errors since windows can have problems with locked files + shutil.rmtree(self.tmp_path, ignore_errors=True) + + def test_upgrade_2_none_selected(self): + """ + Test that upgrade 2 completes properly when the user chooses not to use a proxy ('No') + """ + # GIVEN: An version 1 web bible with proxy settings + + # WHEN: Calling upgrade_db and the user has 'clicked' the 'No' button + upgrade_db(self.db_url, upgrade) + + # THEN: The proxy meta data should have been removed, and the version should have been changed to version 2 + self.mocked_message_box.assert_not_called() + engine = create_engine(self.db_url) + conn = engine.connect() + assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' + + +class TestProxyMetaUpgrade(TestCase, TestMixin): + """ + Test the `upgrade_2` function in the :mod:`upgrade` module when the db contains proxy metadata + """ + + def setUp(self): + """ + Setup for tests + """ + self.tmp_path = Path(mkdtemp()) + db_path = RESOURCE_PATH / 'bibles' / 'web-bible-2.4.6-proxy-meta-v1.sqlite' + db_tmp_path = self.tmp_path / 'web-bible-2.4.6-proxy-meta-v1.sqlite' + shutil.copyfile(db_path, db_tmp_path) + self.db_url = 'sqlite:///' + str(db_tmp_path) + + patched_settings = patch('openlp.plugins.bibles.lib.upgrade.Settings') + self.mocked_settings = patched_settings.start() + self.addCleanup(patched_settings.stop) + self.mocked_settings_instance = MagicMock() + self.mocked_settings.return_value = self.mocked_settings_instance + + patched_message_box = patch('openlp.plugins.bibles.lib.upgrade.QtWidgets.QMessageBox') + mocked_message_box = patched_message_box.start() + self.addCleanup(patched_message_box.stop) + self.mocked_no_button = MagicMock() + self.mocked_http_button = MagicMock() + self.mocked_both_button = MagicMock() + self.mocked_https_button = MagicMock() + self.mocked_message_box_instance = MagicMock( + **{'addButton.side_effect': [self.mocked_no_button, self.mocked_http_button, + self.mocked_both_button, self.mocked_https_button]}) + mocked_message_box.return_value = self.mocked_message_box_instance + + def tearDown(self): + """ + Clean up after tests + """ + # Ignore errors since windows can have problems with locked files + shutil.rmtree(self.tmp_path, ignore_errors=True) + + def test_upgrade_2_none_selected(self): + """ + Test that upgrade 2 completes properly when the user chooses not to use a proxy ('No') + """ + # GIVEN: An version 1 web bible with proxy settings + + # WHEN: Calling upgrade_db and the user has 'clicked' the 'No' button + self.mocked_message_box_instance.clickedButton.return_value = self.mocked_no_button + upgrade_db(self.db_url, upgrade) + + # THEN: The proxy meta data should have been removed, and the version should have been changed to version 2 + engine = create_engine(self.db_url) + conn = engine.connect() + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_server"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_username"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_password"').fetchall()) == 0 + assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' + self.mocked_settings_instance.setValue.assert_not_called() + + + def test_upgrade_2_http_selected(self): + """ + Test that upgrade 2 completes properly when the user chooses to use a HTTP proxy + """ + # GIVEN: An version 1 web bible with proxy settings + + # WHEN: Calling upgrade_db and the user has 'clicked' the 'HTTP' button + self.mocked_message_box_instance.clickedButton.return_value = self.mocked_http_button + upgrade_db(self.db_url, upgrade) + + # THEN: The proxy meta data should have been removed, the version should have been changed to version 2, and the + # proxy server saved to the settings + engine = create_engine(self.db_url) + conn = engine.connect() + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_server"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_username"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_password"').fetchall()) == 0 + assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' + + assert self.mocked_settings_instance.setValue.call_args_list == [ + call('advanced/proxy http', 'proxy_server'), call('advanced/proxy username', 'proxy_username'), + call('advanced/proxy password', 'proxy_password'), call('advanced/proxy mode', ProxyMode.MANUAL_PROXY)] + + def test_upgrade_2_https_selected(self): + """ + Tcest that upgrade 2 completes properly when the user chooses to use a HTTPS proxy + """ + # GIVEN: An version 1 web bible with proxy settings + + # WHEN: Calling upgrade_db and the user has 'clicked' the 'HTTPS' button + self.mocked_message_box_instance.clickedButton.return_value = self.mocked_https_button + upgrade_db(self.db_url, upgrade) + + # THEN: The proxy settings should have been removed, the version should have been changed to version 2, and the + # proxy server saved to the settings + engine = create_engine(self.db_url) + conn = engine.connect() + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_server"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_username"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_password"').fetchall()) == 0 + assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' + + assert self.mocked_settings_instance.setValue.call_args_list == [ + call('advanced/proxy https', 'proxy_server'), call('advanced/proxy username', 'proxy_username'), + call('advanced/proxy password', 'proxy_password'), call('advanced/proxy mode', ProxyMode.MANUAL_PROXY)] + + def test_upgrade_2_both_selected(self): + """ + Tcest that upgrade 2 completes properly when the user chooses to use a both HTTP and HTTPS proxies + """ + + # GIVEN: An version 1 web bible with proxy settings + + # WHEN: Calling upgrade_db + self.mocked_message_box_instance.clickedButton.return_value = self.mocked_both_button + upgrade_db(self.db_url, upgrade) + + # THEN: The proxy settings should have been removed, the version should have been changed to version 2, and the + # proxy server saved to the settings + engine = create_engine(self.db_url) + conn = engine.connect() + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_server"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_username"').fetchall()) == 0 + assert len(conn.execute('SELECT * FROM metadata WHERE key = "proxy_password"').fetchall()) == 0 + assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' + + assert self.mocked_settings_instance.setValue.call_args_list == [ + call('advanced/proxy http', 'proxy_server'), call('advanced/proxy https', 'proxy_server'), + call('advanced/proxy username', 'proxy_username'), call('advanced/proxy password', 'proxy_password'), + call('advanced/proxy mode', ProxyMode.MANUAL_PROXY)] diff --git a/tests/resources/bibles/tests.sqlite b/tests/resources/bibles/tests.sqlite index b6af457d77f217674aa5b98fbb7f88fee9c930c0..a49d3b21a62f4ceed236898f30eddaed9859ee91 100644 GIT binary patch delta 30 mcmZp;z}Rqsae_2s^h6nF)@TMjnGG9LO4u2VHs54dPXGX&_zBSf delta 30 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 O2oM1xKm;}&f&T(jC0Qf@ literal 0 HcmV?d00001 diff --git a/tests/resources/bibles/web-bible-2.4.6-v1.sqlite b/tests/resources/bibles/web-bible-2.4.6-v1.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..6d61b153e7f2822dd1897dade200db6d1ed06cfb GIT binary patch literal 49152 zcmeI4e{36P8OMEhiGSU_@0%ZWuCD9)@~erPq=}Oz>F?G_-KJ^krfHbkNnkF?HMU~= zGN0Wa1F^M2>ITx_k1`M%(f~0Knvj@=gaAzgZ6HmPHo-KZsvsB>OhZD9QD7TFyw7Vp zwcCt8m?lB=IPy2|^W6JB?|YxSSiSF^d*<{^rf3=G?Ly8h8Y8YImn69k8-~l}I?LZ0 ze^+0A-e{->{I^uoe!u2f*Uqj73HygjRiALNB>Nft22GK-NRReA?NMz~eTS#rCcVzWL?T!N?ouDj+I(Wo2x~uAOdZ2E)kzk7{`-G z5@(G&yBMdEhUjMWRt80<{BFHRm(2Q-Me9;gbX3=`2it3kK^Q&lTW@g-w!M!&)xb;q5I#*w;vNZ4dl`=~;Wim_A zE63a(UDu_nxuUs{wQjG(QyD)WpO{Hh8T);F{PE;`;#gwNNS>NEk{_9w={Nko>K<3N zL8@{*s@)+~-i?|*g8F>o>^y9pojZOqK6lPIkvM1c@})uU=&8BH@ncEI^;Q`gbBUvg zxkPd@amIk0=&Gh>{7_5 zMEVx()ysvNp2dH3YU$0xFZLpnmkHpb9FB6qgZ*4CiNlW zX;qY-)+PI5K5LsxVpsEv7ecbq7gcB!yvO%`m&xoBorR7nXj@R;~|V}AA}mzPbu z*fhJ3y~KXY9%2tLlie!+e2DAD(ntUaAOR$R1dsp{Kmter2_OL^fCT<83A8CO>2AA0 zWlE=1V>S4R5|P%N1s}H(B(M^^(5=Qc@Nfj<{{@C-rAJ!3?uWuktI~HnQ+5JmzY-D; znQ#Mu@JS}r*In!{>~;1F_8j{z`#Spqdzf8j8Fnu_!Nyr9)0v09L;pm7Ltmyp;!p5@ zkzS(?U848UAzX>yKCk^vGTKJAwFn)ZVB zl=isxi1wgnYbout7T020ht{e!sDI~+z!wrg0!RP}AOR$R1dsp{Kms3_K=VW+|5k7N zggnO|T+f;N~UcTGJT`aCv7>7nYHs7Gw-zR68T-wvo_y6 z0{Qk4dD71EJD||DWf)SO!(tVg)m6wf#UK}n$%$1yT4aVqW=K9}0yN%d(;#Ge2Km&J zb|I55rbTwA$nNA5*JQ~6WP=0poSoxC)qV&A{c?P<=%{@n=#v4rx% zl~0<571|3ysFw%DV%oY$dU)&$^_=AESxjfxb_gTe@3r`M2nrc9t#v~p*ga(~FPj#H;wXK^WK;&)JSYEZX5|+sdk2#h9&Awqu!E2!def2%p%>k}VL0wj}PiR(RMF zgs?j}!%vWWQJjtr-3+<#=4t)~gdFUOE(++!9g|0aHi-J#&e-{7!#;1E;YX66J1qfG zD3DlO%)%ja_+$KZlPI)lwqWyH+zXD@DhjpE^7AC;_*x)pZJD+gv}UoPIpJ`$1==Kr zH6^XInBUJJ4zR@i1+#@hyPNWZo-Xin4JK6E=vU}X(neomUGzG6mzLP~v{%@-=`-vmRcJfaxJR%;P3|YWOdlZq z2x3@Gtg3w&Gpv)s(PQ^)2>5 z7vWj#hC8}ze#JOMYhJ||+nrx=CY9UjFl*n`{t#0cCChM6kf#4r?H^Ce;st$7kd zaLc#Oj~IkZofokacDd|B3;-PPAo>L*?mzTF1H6YF&;Z{d3Oil#9D2)bVL0@_#A|ND zb|_l58oJ9HDn3IOaH^UNoxn*r3?0xC_CmYB3*LeO)hotAM68Uv3fsynv$A36C;Wu1 zFjv`32*Hqwldz>p>6U73gdj{^^$<40pt6CW1M@rFgEkmkYaIl{@vZm5Zl4J*fzGAweYKZH*?W<>0kMC18>mR=uP@6e|q2r`W$_RexE)?pQKOF$LW{p zb@~W>h+d_i?>N;p!8)zT^x@i+=Yb$6=3utpQXj2m?W1y6R5(27epsEV$_k;R; zpk6Pi#{=qigElsTHZ*`L3aBhAiq8kn|GSzt*y)A4g9MNO5c_5X%D zq_{&!00|%gB!C2v01`j~NB{{S0VIF~?jnHK|92t51QI|3NB{{S0VIF~kN^@u0!RP} JAb|}>;NP@+CVBt> literal 0 HcmV?d00001 From aa744e0d99cceb5f1bd678cc9bea894128453bd5 Mon Sep 17 00:00:00 2001 From: Philip Ridout Date: Mon, 22 Oct 2018 21:42:25 +0100 Subject: [PATCH 2/2] PEP fixes --- openlp/core/common/settings.py | 3 --- openlp/core/lib/__init__.py | 2 +- openlp/plugins/bibles/lib/upgrade.py | 4 ++-- tests/functional/openlp_core/common/test_i18n.py | 1 + tests/functional/openlp_plugins/bibles/test_upgrade.py | 9 ++++----- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/openlp/core/common/settings.py b/openlp/core/common/settings.py index 6fe0429cb..830994546 100644 --- a/openlp/core/common/settings.py +++ b/openlp/core/common/settings.py @@ -275,9 +275,6 @@ class Settings(QtCore.QSettings): ('songuasge/db hostname', 'songusage/db hostname', []), ('songuasge/db database', 'songusage/db database', []), ('presentations / Powerpoint Viewer', '', []), - ('songuasge/db hostname', 'songusage/db hostname', []), - ('songuasge/db hostname', 'songusage/db hostname', []), - ('songuasge/db hostname', 'songusage/db hostname', []), ('bibles/proxy name', '', []), # Just remove these bible proxy settings. They weren't used in 2.4! ('bibles/proxy address', '', []), ('bibles/proxy username', '', []), diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 0111c13e5..e15f81ab6 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -609,4 +609,4 @@ def create_separated_list(string_list): last=string_list[-1]) else: list_to_string = '' - return list_to_string \ No newline at end of file + return list_to_string diff --git a/openlp/plugins/bibles/lib/upgrade.py b/openlp/plugins/bibles/lib/upgrade.py index 76fa49ca0..763e40c6b 100644 --- a/openlp/plugins/bibles/lib/upgrade.py +++ b/openlp/plugins/bibles/lib/upgrade.py @@ -51,7 +51,6 @@ def upgrade_2(session, metadata): Remove the individual proxy settings, after the implementation of central proxy settings. Added in 2.5 (3.0 development) """ - # TODO: Test settings = Settings() op = get_upgrade_op(session) metadata_table = Table('metadata', metadata, autoload=True) @@ -80,7 +79,8 @@ def upgrade_2(session, metadata): https_proxy = proxy settings.setValue('advanced/proxy https', proxy) if http_proxy or https_proxy: - username, = session.execute(select([metadata_table.c.value], metadata_table.c.key == 'proxy_username')).first() + username, = session.execute( + select([metadata_table.c.value], metadata_table.c.key == 'proxy_username')).first() proxy, = session.execute(select([metadata_table.c.value], metadata_table.c.key == 'proxy_password')).first() settings.setValue('advanced/proxy username', username) settings.setValue('advanced/proxy password', proxy) diff --git a/tests/functional/openlp_core/common/test_i18n.py b/tests/functional/openlp_core/common/test_i18n.py index 7dadcb976..a4b896c6b 100644 --- a/tests/functional/openlp_core/common/test_i18n.py +++ b/tests/functional/openlp_core/common/test_i18n.py @@ -162,6 +162,7 @@ def test_check_same_instance(): def test_get_language_from_settings(): assert LanguageManager.get_language() == 'en' + def test_get_language_from_settings_returns_unchanged_if_unknown_format(): Settings().setValue('core/language', '(foobar)') assert LanguageManager.get_language() == '(foobar)' diff --git a/tests/functional/openlp_plugins/bibles/test_upgrade.py b/tests/functional/openlp_plugins/bibles/test_upgrade.py index 0eb33338d..1e2520391 100644 --- a/tests/functional/openlp_plugins/bibles/test_upgrade.py +++ b/tests/functional/openlp_plugins/bibles/test_upgrade.py @@ -146,7 +146,6 @@ class TestProxyMetaUpgrade(TestCase, TestMixin): assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' self.mocked_settings_instance.setValue.assert_not_called() - def test_upgrade_2_http_selected(self): """ Test that upgrade 2 completes properly when the user chooses to use a HTTP proxy @@ -167,7 +166,7 @@ class TestProxyMetaUpgrade(TestCase, TestMixin): assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' assert self.mocked_settings_instance.setValue.call_args_list == [ - call('advanced/proxy http', 'proxy_server'), call('advanced/proxy username', 'proxy_username'), + call('advanced/proxy http', 'proxy_server'), call('advanced/proxy username', 'proxy_username'), call('advanced/proxy password', 'proxy_password'), call('advanced/proxy mode', ProxyMode.MANUAL_PROXY)] def test_upgrade_2_https_selected(self): @@ -214,6 +213,6 @@ class TestProxyMetaUpgrade(TestCase, TestMixin): assert conn.execute('SELECT * FROM metadata WHERE key = "version"').first().value == '2' assert self.mocked_settings_instance.setValue.call_args_list == [ - call('advanced/proxy http', 'proxy_server'), call('advanced/proxy https', 'proxy_server'), - call('advanced/proxy username', 'proxy_username'), call('advanced/proxy password', 'proxy_password'), - call('advanced/proxy mode', ProxyMode.MANUAL_PROXY)] + call('advanced/proxy http', 'proxy_server'), call('advanced/proxy https', 'proxy_server'), + call('advanced/proxy username', 'proxy_username'), call('advanced/proxy password', 'proxy_password'), + call('advanced/proxy mode', ProxyMode.MANUAL_PROXY)]