diff --git a/tests/interfaces/openlp_plugins/songs/forms/test_authorsform.py b/tests/interfaces/openlp_plugins/songs/forms/test_authorsform.py index 701f37d94..3ff5c8baa 100644 --- a/tests/interfaces/openlp_plugins/songs/forms/test_authorsform.py +++ b/tests/interfaces/openlp_plugins/songs/forms/test_authorsform.py @@ -23,6 +23,7 @@ Package to test the openlp.plugins.songs.forms.authorsform package. """ from unittest import TestCase +from unittest.mock import patch from PyQt5 import QtWidgets @@ -138,3 +139,217 @@ class TestAuthorsForm(TestCase, TestMixin): # THEN: The display_name_edit should have the correct value self.assertEqual(self.form.display_edit.text(), display_name, 'The display name should be set correctly') + + @patch('openlp.plugins.songs.forms.authorsform.QtWidgets.QDialog.exec') + def test_exec(self, mocked_exec): + """ + Test the exec() method + """ + # GIVEN: An authors for and various mocked objects + with patch.object(self.form.first_name_edit, 'clear') as mocked_first_name_edit_clear, \ + patch.object(self.form.last_name_edit, 'clear') as mocked_last_name_edit_clear, \ + patch.object(self.form.display_edit, 'clear') as mocked_display_edit_clear, \ + patch.object(self.form.first_name_edit, 'setFocus') as mocked_first_name_edit_setFocus: + # WHEN: The exec() method is called + self.form.exec(clear=True) + + # THEN: The clear and exec() methods should have been called + mocked_first_name_edit_clear.assert_called_once_with() + mocked_last_name_edit_clear.assert_called_once_with() + mocked_display_edit_clear.assert_called_once_with() + mocked_first_name_edit_setFocus.assert_called_once_with() + mocked_exec.assert_called_once_with(self.form) + + def test_first_name_edited(self): + """ + Test the on_first_name_edited() method + """ + # GIVEN: An author form + self.form.auto_display_name = True + + with patch.object(self.form.last_name_edit, 'text') as mocked_last_name_edit_text, \ + patch.object(self.form.display_edit, 'setText') as mocked_display_edit_setText: + mocked_last_name_edit_text.return_value = 'Newton' + + # WHEN: on_first_name_edited() is called + self.form.on_first_name_edited('John') + + # THEN: The display name should be updated + assert mocked_last_name_edit_text.call_count == 2 + mocked_display_edit_setText.assert_called_once_with('John Newton') + + def test_first_name_edited_no_auto(self): + """ + Test the on_first_name_edited() method without auto_display_name + """ + # GIVEN: An author form + self.form.auto_display_name = False + + with patch.object(self.form.last_name_edit, 'text') as mocked_last_name_edit_text, \ + patch.object(self.form.display_edit, 'setText') as mocked_display_edit_setText: + + # WHEN: on_first_name_edited() is called + self.form.on_first_name_edited('John') + + # THEN: The display name should not be updated + assert mocked_last_name_edit_text.call_count == 0 + assert mocked_display_edit_setText.call_count == 0 + + def test_last_name_edited(self): + """ + Test the on_last_name_edited() method + """ + # GIVEN: An author form + self.form.auto_display_name = True + + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.display_edit, 'setText') as mocked_display_edit_setText: + mocked_first_name_edit_text.return_value = 'John' + + # WHEN: on_last_name_edited() is called + self.form.on_last_name_edited('Newton') + + # THEN: The display name should be updated + assert mocked_first_name_edit_text.call_count == 2 + mocked_display_edit_setText.assert_called_once_with('John Newton') + + def test_last_name_edited_no_auto(self): + """ + Test the on_last_name_edited() method without auto_display_name + """ + # GIVEN: An author form + self.form.auto_display_name = False + + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.display_edit, 'setText') as mocked_display_edit_setText: + + # WHEN: on_last_name_edited() is called + self.form.on_last_name_edited('Newton') + + # THEN: The display name should not be updated + assert mocked_first_name_edit_text.call_count == 0 + assert mocked_display_edit_setText.call_count == 0 + + @patch('openlp.plugins.songs.forms.authorsform.critical_error_message_box') + def test_accept_no_first_name(self, mocked_critical_error): + """ + Test the accept() method with no first name + """ + # GIVEN: A form and no text in thefirst name edit + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.first_name_edit, 'setFocus') as mocked_first_name_edit_setFocus: + mocked_first_name_edit_text.return_value = '' + + # WHEN: accept() is called + result = self.form.accept() + + # THEN: The result should be false and a critical error displayed + assert result is False + mocked_critical_error.assert_called_once_with(message='You need to type in the first name of the author.') + mocked_first_name_edit_text.assert_called_once_with() + mocked_first_name_edit_setFocus.assert_called_once_with() + + @patch('openlp.plugins.songs.forms.authorsform.critical_error_message_box') + def test_accept_no_last_name(self, mocked_critical_error): + """ + Test the accept() method with no last name + """ + # GIVEN: A form and no text in the last name edit + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.last_name_edit, 'text') as mocked_last_name_edit_text, \ + patch.object(self.form.last_name_edit, 'setFocus') as mocked_last_name_edit_setFocus: + mocked_first_name_edit_text.return_value = 'John' + mocked_last_name_edit_text.return_value = '' + + # WHEN: accept() is called + result = self.form.accept() + + # THEN: The result should be false and a critical error displayed + assert result is False + mocked_critical_error.assert_called_once_with(message='You need to type in the last name of the author.') + mocked_first_name_edit_text.assert_called_once_with() + mocked_last_name_edit_text.assert_called_once_with() + mocked_last_name_edit_setFocus.assert_called_once_with() + + @patch('openlp.plugins.songs.forms.authorsform.critical_error_message_box') + def test_accept_no_display_name_no_combine(self, mocked_critical_error): + """ + Test the accept() method with no display name and no combining + """ + # GIVEN: A form and no text in the display name edit + mocked_critical_error.return_value = QtWidgets.QMessageBox.No + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.last_name_edit, 'text') as mocked_last_name_edit_text, \ + patch.object(self.form.display_edit, 'text') as mocked_display_edit_text, \ + patch.object(self.form.display_edit, 'setFocus') as mocked_display_edit_setFocus: + mocked_first_name_edit_text.return_value = 'John' + mocked_last_name_edit_text.return_value = 'Newton' + mocked_display_edit_text.return_value = '' + + # WHEN: accept() is called + result = self.form.accept() + + # THEN: The result should be false and a critical error displayed + assert result is False + mocked_critical_error.assert_called_once_with( + message='You have not set a display name for the author, combine the first and last names?', + parent=self.form, question=True) + mocked_first_name_edit_text.assert_called_once_with() + mocked_last_name_edit_text.assert_called_once_with() + mocked_display_edit_text.assert_called_once_with() + mocked_display_edit_setFocus.assert_called_once_with() + + @patch('openlp.plugins.songs.forms.authorsform.critical_error_message_box') + @patch('openlp.plugins.songs.forms.authorsform.QtWidgets.QDialog.accept') + def test_accept_no_display_name(self, mocked_accept, mocked_critical_error): + """ + Test the accept() method with no display name and auto-combine + """ + # GIVEN: A form and no text in the display name edit + mocked_accept.return_value = True + mocked_critical_error.return_value = QtWidgets.QMessageBox.Yes + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.last_name_edit, 'text') as mocked_last_name_edit_text, \ + patch.object(self.form.display_edit, 'text') as mocked_display_edit_text, \ + patch.object(self.form.display_edit, 'setText') as mocked_display_edit_setText: + mocked_first_name_edit_text.return_value = 'John' + mocked_last_name_edit_text.return_value = 'Newton' + mocked_display_edit_text.return_value = '' + + # WHEN: accept() is called + result = self.form.accept() + + # THEN: The result should be false and a critical error displayed + assert result is True + mocked_critical_error.assert_called_once_with( + message='You have not set a display name for the author, combine the first and last names?', + parent=self.form, question=True) + mocked_first_name_edit_text.assert_called_once_with() + mocked_last_name_edit_text.assert_called_once_with() + mocked_display_edit_text.assert_called_once_with() + mocked_display_edit_setText.assert_called_once_with('John Newton') + mocked_accept.assert_called_once_with(self.form) + + @patch('openlp.plugins.songs.forms.authorsform.QtWidgets.QDialog.accept') + def test_accept(self, mocked_accept): + """ + Test the accept() method + """ + # GIVEN: A form and text in the right places + mocked_accept.return_value = True + with patch.object(self.form.first_name_edit, 'text') as mocked_first_name_edit_text, \ + patch.object(self.form.last_name_edit, 'text') as mocked_last_name_edit_text, \ + patch.object(self.form.display_edit, 'text') as mocked_display_edit_text: + mocked_first_name_edit_text.return_value = 'John' + mocked_last_name_edit_text.return_value = 'Newton' + mocked_display_edit_text.return_value = 'John Newton' + + # WHEN: accept() is called + result = self.form.accept() + + # THEN: The result should be false and a critical error displayed + assert result is True + mocked_first_name_edit_text.assert_called_once_with() + mocked_last_name_edit_text.assert_called_once_with() + mocked_display_edit_text.assert_called_once_with() + mocked_accept.assert_called_once_with(self.form)