openlp/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py

207 lines
9.4 KiB
Python
Raw Normal View History

2014-03-14 22:08:44 +00:00
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2016-12-31 11:05:48 +00:00
# Copyright (c) 2008-2017 OpenLP Developers #
2014-03-14 22:08:44 +00:00
# --------------------------------------------------------------------------- #
# 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 #
###############################################################################
2013-03-07 12:34:35 +00:00
"""
Package to test the openlp.plugins.songs.forms.editsongform package.
"""
from unittest import TestCase
2017-03-09 05:23:37 +00:00
from unittest.mock import MagicMock, patch
2013-03-07 12:34:35 +00:00
2017-03-09 05:23:37 +00:00
from PyQt5 import QtCore, QtWidgets
2013-03-07 12:34:35 +00:00
2013-12-13 17:44:05 +00:00
from openlp.core.common import Registry
2014-12-29 17:41:45 +00:00
from openlp.core.common.uistrings import UiStrings
2013-03-07 12:34:35 +00:00
from openlp.plugins.songs.forms.editsongform import EditSongForm
2014-03-14 22:08:44 +00:00
from tests.helpers.testmixin import TestMixin
2013-03-07 12:34:35 +00:00
2014-03-14 22:08:44 +00:00
class TestEditSongForm(TestCase, TestMixin):
2013-03-14 22:22:18 +00:00
"""
Test the EditSongForm class
"""
2013-03-07 12:34:35 +00:00
def setUp(self):
"""
Create the UI
"""
Registry.create()
self.setup_application()
2015-11-07 00:49:40 +00:00
self.main_window = QtWidgets.QMainWindow()
2013-08-31 18:17:38 +00:00
Registry().register('main_window', self.main_window)
Registry().register('theme_manager', MagicMock())
2013-03-07 12:34:35 +00:00
self.form = EditSongForm(MagicMock(), self.main_window, MagicMock())
def tearDown(self):
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
del self.form
del self.main_window
2013-06-21 10:16:50 +00:00
def ui_defaults_test(self):
2013-03-07 12:34:35 +00:00
"""
Test that the EditSongForm defaults are correct
"""
2013-08-31 18:17:38 +00:00
self.assertFalse(self.form.verse_edit_button.isEnabled(), 'The verse edit button should not be enabled')
self.assertFalse(self.form.verse_delete_button.isEnabled(), 'The verse delete button should not be enabled')
self.assertFalse(self.form.author_remove_button.isEnabled(), 'The author remove button should not be enabled')
self.assertFalse(self.form.topic_remove_button.isEnabled(), 'The topic remove button should not be enabled')
2013-03-13 07:08:41 +00:00
2013-06-21 10:16:50 +00:00
def is_verse_edit_form_executed_test(self):
2013-04-18 18:27:22 +00:00
pass
2013-06-21 10:16:50 +00:00
def verse_order_no_warning_test(self):
2013-04-18 18:27:22 +00:00
"""
2013-06-21 10:16:50 +00:00
Test if the verse order warning is not shown
2013-04-18 18:27:22 +00:00
"""
# GIVEN: Mocked methods.
2013-08-31 18:17:38 +00:00
given_verse_order = 'V1 V2'
2013-06-21 10:16:50 +00:00
self.form.verse_list_widget.rowCount = MagicMock(return_value=2)
2013-04-18 18:27:22 +00:00
# Mock out the verse.
2013-06-21 10:16:50 +00:00
first_verse = MagicMock()
2013-10-21 07:38:18 +00:00
first_verse.data.return_value = 'V1'
2013-06-21 10:16:50 +00:00
second_verse = MagicMock()
2013-10-21 07:38:18 +00:00
second_verse.data.return_value = 'V2'
2013-06-21 10:16:50 +00:00
self.form.verse_list_widget.item = MagicMock(side_effect=[first_verse, second_verse])
self.form._extract_verse_order = MagicMock(return_value=given_verse_order.split())
2013-04-18 18:27:22 +00:00
# WHEN: Call the method.
2013-06-21 10:16:50 +00:00
self.form.on_verse_order_text_changed(given_verse_order)
2013-04-18 18:27:22 +00:00
2013-06-21 18:13:59 +00:00
# THEN: No text should be shown.
2013-08-31 18:17:38 +00:00
assert self.form.warning_label.text() == '', 'There should be no warning.'
2013-06-21 10:16:50 +00:00
def verse_order_incomplete_warning_test(self):
"""
Test if the verse-order-incomple warning is shown
"""
# GIVEN: Mocked methods.
2013-08-31 18:17:38 +00:00
given_verse_order = 'V1'
2013-06-21 10:16:50 +00:00
self.form.verse_list_widget.rowCount = MagicMock(return_value=2)
# Mock out the verse.
first_verse = MagicMock()
2013-10-21 07:38:18 +00:00
first_verse.data.return_value = 'V1'
2013-06-21 10:16:50 +00:00
second_verse = MagicMock()
2013-10-21 07:38:18 +00:00
second_verse.data.return_value = 'V2'
2013-06-21 10:16:50 +00:00
self.form.verse_list_widget.item = MagicMock(side_effect=[first_verse, second_verse])
self.form._extract_verse_order = MagicMock(return_value=[given_verse_order])
# WHEN: Call the method.
self.form.on_verse_order_text_changed(given_verse_order)
2013-06-21 18:13:59 +00:00
# THEN: The verse-order-incomplete text should be shown.
assert self.form.warning_label.text() == self.form.not_all_verses_used_warning, \
2013-08-31 18:17:38 +00:00
'The verse-order-incomplete warning should be shown.'
2013-04-18 18:27:22 +00:00
2013-04-18 18:28:11 +00:00
def bug_1170435_test(self):
2013-04-18 18:27:22 +00:00
"""
2013-06-21 10:16:50 +00:00
Regression test for bug 1170435 (test if "no verse order" message is shown)
2013-04-18 18:27:22 +00:00
"""
# GIVEN: Mocked methods.
2013-08-31 18:17:38 +00:00
given_verse_order = ''
2013-06-21 10:16:50 +00:00
self.form.verse_list_widget.rowCount = MagicMock(return_value=1)
2013-04-18 18:27:22 +00:00
# Mock out the verse. (We want a verse type to be returned).
mocked_verse = MagicMock()
2013-10-21 07:38:18 +00:00
mocked_verse.data.return_value = 'V1'
2013-06-21 10:16:50 +00:00
self.form.verse_list_widget.item = MagicMock(return_value=mocked_verse)
2013-06-21 18:13:59 +00:00
self.form._extract_verse_order = MagicMock(return_value=[])
2013-06-21 10:16:50 +00:00
self.form.verse_order_edit.text = MagicMock(return_value=given_verse_order)
2013-04-18 18:27:22 +00:00
# WHEN: Call the method.
2013-06-21 10:16:50 +00:00
self.form.on_verse_order_text_changed(given_verse_order)
2013-04-18 18:27:22 +00:00
2013-06-21 18:13:59 +00:00
# THEN: The no-verse-order message should be shown.
assert self.form.warning_label.text() == self.form.no_verse_order_entered_warning, \
2013-08-31 18:17:38 +00:00
'The no-verse-order message should be shown.'
2014-12-29 17:41:45 +00:00
def bug_1404967_test(self):
"""
Test for CCLI label showing correct text
"""
# GIVEN; Mocked methods
form = self.form
# THEN: CCLI label should be CCLI song label
self.assertNotEquals(form.ccli_label.text(), UiStrings().CCLINumberLabel,
'CCLI label should not be "{}"'.format(UiStrings().CCLINumberLabel))
self.assertEquals(form.ccli_label.text(), UiStrings().CCLISongNumberLabel,
'CCLI label text should be "{}"'.format(UiStrings().CCLISongNumberLabel))
def verse_order_lowercase_test(self):
"""
Test that entering a verse order in lowercase automatically converts to uppercase
"""
# GIVEN; Mocked methods
form = self.form
# WHEN: We enter a verse order in lowercase
form.verse_order_edit.setText('v1 v2 c1 v3 c1 v4 c1')
# Need to manually trigger this method as it is only triggered by manual input
form.on_verse_order_text_changed(form.verse_order_edit.text())
# THEN: The verse order should be converted to uppercase
self.assertEqual(form.verse_order_edit.text(), 'V1 V2 C1 V3 C1 V4 C1')
2017-03-09 05:23:37 +00:00
@patch('openlp.plugins.songs.forms.editsongform.QtWidgets.QListWidgetItem')
def test_add_author_to_list(self, MockedQListWidgetItem):
"""
Test the _add_author_to_list() method
"""
# GIVEN: A song edit form and some mocked stuff
mocked_author = MagicMock()
mocked_author.id = 1
mocked_author.get_display_name.return_value = 'John Newton'
mocked_author_type = 'words'
mocked_widget_item = MagicMock()
MockedQListWidgetItem.return_value = mocked_widget_item
# WHEN: _add_author_to_list() is called
with patch.object(self.form.authors_list_view, 'addItem') as mocked_add_item:
self.form._add_author_to_list(mocked_author, mocked_author_type)
# THEN: All the correct methods should have been called
mocked_author.get_display_name.assert_called_once_with('words')
MockedQListWidgetItem.assert_called_once_with('John Newton')
mocked_widget_item.setData.assert_called_once_with(QtCore.Qt.UserRole, (1, mocked_author_type))
mocked_add_item.assert_called_once_with(mocked_widget_item)
@patch('openlp.plugins.songs.forms.editsongform.SongBookEntry')
@patch('openlp.plugins.songs.forms.editsongform.QtWidgets.QListWidgetItem')
def test_add_songbook_entry_to_list(self, MockedQListWidgetItem, MockedSongbookEntry):
"""
Test the add_songbook_entry_to_list() method
"""
# GIVEN: A song edit form and some mocked stuff
songbook_id = 1
songbook_name = 'Hymnal'
entry = '546'
MockedSongbookEntry.get_display_name.return_value = 'Hymnal #546'
mocked_widget_item = MagicMock()
MockedQListWidgetItem.return_value = mocked_widget_item
# WHEN: _add_author_to_list() is called
with patch.object(self.form.songbooks_list_view, 'addItem') as mocked_add_item:
self.form.add_songbook_entry_to_list(songbook_id, songbook_name, entry)
# THEN: All the correct methods should have been called
MockedSongbookEntry.get_display_name.assert_called_once_with(songbook_name, entry)
MockedQListWidgetItem.assert_called_once_with('Hymnal #546')
mocked_widget_item.setData.assert_called_once_with(QtCore.Qt.UserRole, (songbook_id, entry))
mocked_add_item.assert_called_once_with(mocked_widget_item)