forked from openlp/openlp
175 lines
9.1 KiB
Python
175 lines
9.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
|
|
|
###############################################################################
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
# --------------------------------------------------------------------------- #
|
|
# Copyright (c) 2008-2017 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 #
|
|
###############################################################################
|
|
"""
|
|
Package to test the openlp.core.ui.exeptionform package.
|
|
"""
|
|
import os
|
|
import tempfile
|
|
from unittest import TestCase
|
|
from unittest.mock import call, patch
|
|
|
|
from openlp.core.common.path import Path
|
|
from openlp.core.common.registry import Registry
|
|
from openlp.core.ui import exceptionform
|
|
from tests.helpers.testmixin import TestMixin
|
|
|
|
exceptionform.WEBKIT_VERSION = 'Webkit Test'
|
|
exceptionform.MIGRATE_VERSION = 'Migrate Test'
|
|
exceptionform.CHARDET_VERSION = 'CHARDET Test'
|
|
exceptionform.ENCHANT_VERSION = 'Enchant Test'
|
|
exceptionform.MAKO_VERSION = 'Mako Test'
|
|
exceptionform.ICU_VERSION = 'ICU Test'
|
|
exceptionform.VLC_VERSION = 'VLC Test'
|
|
|
|
MAIL_ITEM_TEXT = ('**OpenLP Bug Report**\nVersion: Trunk Test\n\n--- Details of the Exception. ---\n\n'
|
|
'Description Test\n\n --- Exception Traceback ---\nopenlp: Traceback Test\n'
|
|
'--- System information ---\nPlatform: Nose Test\n\n--- Library Versions ---\n'
|
|
'Python: Python Test\nQt5: Qt5 test\nPyQt5: PyQt5 Test\nQtWebkit: Webkit Test\n'
|
|
'SQLAlchemy: SqlAlchemy Test\nSQLAlchemy Migrate: Migrate Test\nBeautifulSoup: BeautifulSoup Test\n'
|
|
'lxml: ETree Test\nChardet: CHARDET Test\nPyEnchant: Enchant Test\nMako: Mako Test\n'
|
|
'pyICU: ICU Test\npyUNO bridge: UNO Bridge Test\nVLC: VLC Test\n\n')
|
|
|
|
|
|
@patch("openlp.core.ui.exceptionform.Qt.qVersion")
|
|
@patch("openlp.core.ui.exceptionform.QtGui.QDesktopServices.openUrl")
|
|
@patch("openlp.core.ui.exceptionform.get_version")
|
|
@patch("openlp.core.ui.exceptionform.sqlalchemy")
|
|
@patch("openlp.core.ui.exceptionform.bs4")
|
|
@patch("openlp.core.ui.exceptionform.etree")
|
|
@patch("openlp.core.ui.exceptionform.is_linux")
|
|
@patch("openlp.core.ui.exceptionform.platform.platform")
|
|
@patch("openlp.core.ui.exceptionform.platform.python_version")
|
|
class TestExceptionForm(TestMixin, TestCase):
|
|
"""
|
|
Test functionality of exception form functions
|
|
"""
|
|
def __method_template_for_class_patches(self, __PLACEHOLDER_FOR_LOCAL_METHOD_PATCH_DECORATORS_GO_HERE__,
|
|
mocked_python_version, mocked_platform, mocked_is_linux,
|
|
mocked_etree, mocked_bs4, mocked_sqlalchemy, mocked_get_version,
|
|
mocked_openlurl, mocked_qversion):
|
|
"""
|
|
Template so you don't have to remember the layout of class mock options for methods
|
|
"""
|
|
mocked_etree.__version__ = 'ETree Test'
|
|
mocked_bs4.__version__ = 'BeautifulSoup Test'
|
|
mocked_sqlalchemy.__version__ = 'SqlAlchemy Test'
|
|
mocked_python_version.return_value = 'Python Test'
|
|
mocked_platform.return_value = 'Nose Test'
|
|
mocked_qversion.return_value = 'Qt5 test'
|
|
mocked_is_linux.return_value = False
|
|
mocked_get_version.return_value = 'Trunk Test'
|
|
|
|
def setUp(self):
|
|
self.setup_application()
|
|
self.app.setApplicationVersion('0.0')
|
|
# Set up a fake "set_normal_cursor" method since we're not dealing with an actual OpenLP application object
|
|
self.app.set_normal_cursor = lambda: None
|
|
self.app.process_events = lambda: None
|
|
Registry.create()
|
|
Registry().register('application', self.app)
|
|
self.tempfile = os.path.join(tempfile.gettempdir(), 'testfile')
|
|
|
|
def tearDown(self):
|
|
if os.path.isfile(self.tempfile):
|
|
os.remove(self.tempfile)
|
|
|
|
@patch("openlp.core.ui.exceptionform.Ui_ExceptionDialog")
|
|
@patch("openlp.core.ui.exceptionform.FileDialog")
|
|
@patch("openlp.core.ui.exceptionform.QtCore.QUrl")
|
|
@patch("openlp.core.ui.exceptionform.QtCore.QUrlQuery.addQueryItem")
|
|
@patch("openlp.core.ui.exceptionform.Qt")
|
|
def test_on_send_report_button_clicked(self, mocked_qt, mocked_add_query_item, mocked_qurl, mocked_file_dialog,
|
|
mocked_ui_exception_dialog, mocked_python_version, mocked_platform,
|
|
mocked_is_linux, mocked_etree, mocked_bs4, mocked_sqlalchemy,
|
|
mocked_get_version, mocked_openlurl, mocked_qversion):
|
|
"""
|
|
Test send report creates the proper system information text
|
|
"""
|
|
# GIVEN: Test environment
|
|
mocked_etree.__version__ = 'ETree Test'
|
|
mocked_bs4.__version__ = 'BeautifulSoup Test'
|
|
mocked_sqlalchemy.__version__ = 'SqlAlchemy Test'
|
|
mocked_python_version.return_value = 'Python Test'
|
|
mocked_platform.return_value = 'Nose Test'
|
|
mocked_qversion.return_value = 'Qt5 test'
|
|
mocked_is_linux.return_value = False
|
|
mocked_get_version.return_value = 'Trunk Test'
|
|
mocked_qt.PYQT_VERSION_STR = 'PyQt5 Test'
|
|
mocked_is_linux.return_value = False
|
|
mocked_get_version.return_value = 'Trunk Test'
|
|
|
|
test_form = exceptionform.ExceptionForm()
|
|
test_form.file_attachment = None
|
|
|
|
with patch.object(test_form, '_pyuno_import') as mock_pyuno, \
|
|
patch.object(test_form.exception_text_edit, 'toPlainText') as mock_traceback, \
|
|
patch.object(test_form.description_text_edit, 'toPlainText') as mock_description:
|
|
mock_pyuno.return_value = 'UNO Bridge Test'
|
|
mock_traceback.return_value = 'openlp: Traceback Test'
|
|
mock_description.return_value = 'Description Test'
|
|
|
|
# WHEN: on_save_report_button_clicked called
|
|
test_form.on_send_report_button_clicked()
|
|
|
|
# THEN: Verify strings were formatted properly
|
|
mocked_add_query_item.assert_called_with('body', MAIL_ITEM_TEXT)
|
|
|
|
@patch("openlp.core.ui.exceptionform.FileDialog.getSaveFileName")
|
|
@patch("openlp.core.ui.exceptionform.Qt")
|
|
def test_on_save_report_button_clicked(self, mocked_qt, mocked_save_filename, mocked_python_version,
|
|
mocked_platform, mocked_is_linux, mocked_etree, mocked_bs4,
|
|
mocked_sqlalchemy, mocked_get_version, mocked_openlurl,
|
|
mocked_qversion):
|
|
"""
|
|
Test save report saves the correct information to a file
|
|
"""
|
|
mocked_etree.__version__ = 'ETree Test'
|
|
mocked_bs4.__version__ = 'BeautifulSoup Test'
|
|
mocked_sqlalchemy.__version__ = 'SqlAlchemy Test'
|
|
mocked_python_version.return_value = 'Python Test'
|
|
mocked_platform.return_value = 'Nose Test'
|
|
mocked_qversion.return_value = 'Qt5 test'
|
|
mocked_qt.PYQT_VERSION_STR = 'PyQt5 Test'
|
|
mocked_is_linux.return_value = False
|
|
mocked_get_version.return_value = 'Trunk Test'
|
|
|
|
with patch.object(Path, 'open') as mocked_path_open:
|
|
test_path = Path('testfile.txt')
|
|
mocked_save_filename.return_value = test_path, 'ext'
|
|
|
|
test_form = exceptionform.ExceptionForm()
|
|
test_form.file_attachment = None
|
|
|
|
with patch.object(test_form, '_pyuno_import') as mock_pyuno, \
|
|
patch.object(test_form.exception_text_edit, 'toPlainText') as mock_traceback, \
|
|
patch.object(test_form.description_text_edit, 'toPlainText') as mock_description:
|
|
mock_pyuno.return_value = 'UNO Bridge Test'
|
|
mock_traceback.return_value = 'openlp: Traceback Test'
|
|
mock_description.return_value = 'Description Test'
|
|
|
|
# WHEN: on_save_report_button_clicked called
|
|
test_form.on_save_report_button_clicked()
|
|
|
|
# THEN: Verify proper calls to save file
|
|
# self.maxDiff = None
|
|
mocked_path_open.assert_has_calls([call().__enter__().write(MAIL_ITEM_TEXT)])
|