def parse_verse_number_empty_attribute_test(self): """ Test parse_verse_number when the verse number is an empty string. (Bug #1074727) """ # GIVEN: An instance of OpenSongBible, an empty string, and the previous verse number set as 14 importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') # WHEN: Calling parse_verse_number result = importer.parse_verse_number('', 14) # THEN: parse_verse_number should increment the previous verse number self.assertEqual(result, 15)
def parse_verse_number_invalid_verse_no_test(self): """ Test parse_verse_number when supplied with a invalid verse number """ # GIVEN: An instance of OpenSongBible, a non numeric string represented as a string importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') # WHEN: Calling parse_verse_number result = importer.parse_verse_number('invalid', 41) # THEN: parse_verse_number should increment the previous verse number self.assertEqual(result, 42)
def parse_verse_number_verse_range_test(self): """ Test parse_verse_number when supplied with a verse range """ # GIVEN: An instance of OpenSongBible, and the range 24-26 represented as a string importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') # WHEN: Calling parse_verse_number result = importer.parse_verse_number('24-26', 0) # THEN: parse_verse_number should return the first verse number in the range self.assertEqual(result, 24)
def parse_verse_number_valid_verse_no_test(self): """ Test parse_verse_number when supplied with a valid verse number """ # GIVEN: An instance of OpenSongBible, the number 15 represented as a string and an instance of OpenSongBible importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') # WHEN: Calling parse_verse_number result = importer.parse_verse_number('15', 0) # THEN: parse_verse_number should return the verse number self.assertEqual(result, 15)
def process_books_stop_import_test(self): """ Test process_books when stop_import is set to True """ # GIVEN: An instance of OpenSongBible importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') # WHEN: stop_import_flag is set to True importer.stop_import_flag = True importer.process_books(['Book']) # THEN: find_and_create_book should not have been called self.assertFalse(self.mocked_find_and_create_book.called)
def test_process_books_completes(self): """ Test process_books when it processes all books """ # GIVEN: An instance of OpenSongBible Importer and two mocked books self.mocked_find_and_create_book.side_effect = ['db_book1', 'db_book2'] with patch.object(OpenSongBible, 'process_chapters') as mocked_process_chapters: importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) book1 = MagicMock() book1.attrib = {'n': 'Name1'} book1.c = 'Chapter1' book2 = MagicMock() book2.attrib = {'n': 'Name2'} book2.c = 'Chapter2' importer.language_id = 10 importer.session = MagicMock() importer.stop_import_flag = False # WHEN: Calling process_books with the two books importer.process_books([book1, book2]) # THEN: find_and_create_book and process_books should be called with the details from the mocked books assert self.mocked_find_and_create_book.call_args_list == [ call('Name1', 2, 10), call('Name2', 2, 10) ] assert mocked_process_chapters.call_args_list == \ [call('db_book1', 'Chapter1'), call('db_book2', 'Chapter2')] assert importer.session.commit.call_count == 2
def process_chapters_completes_test(self, mocked_parse_chapter_number): """ Test process_chapters when it completes """ # GIVEN: An instance of OpenSongBible importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') importer.wizard = MagicMock() # WHEN: called with some valid data book = MagicMock() book.name = "Book" chapter1 = MagicMock() chapter1.attrib = {'n': '1'} chapter1.c = 'Chapter1' chapter1.v = ['Chapter1 Verses'] chapter2 = MagicMock() chapter2.attrib = {'n': '2'} chapter2.c = 'Chapter2' chapter2.v = ['Chapter2 Verses'] importer.process_verses = MagicMock() importer.stop_import_flag = False importer.process_chapters(book, [chapter1, chapter2]) # THEN: parse_chapter_number, process_verses and increment_process_bar should have been called self.assertEqual(mocked_parse_chapter_number.call_args_list, [call('1', 0), call('2', 1)]) self.assertEqual(importer.process_verses.call_args_list, [ call(book, 1, ['Chapter1 Verses']), call(book, 2, ['Chapter2 Verses']) ]) self.assertEqual( importer.wizard.increment_progress_bar.call_args_list, [call('Importing Book 1...'), call('Importing Book 2...')])
def test_parse_verse_number_invalid_type(self): """ Test parse_verse_number when the verse number is an invalid type) """ with patch.object(OpenSongBible, 'log_warning') as mocked_log_warning: # GIVEN: An instanceofOpenSongBible, a Tuple, and the previous verse number set as 12 importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) # WHEN: Calling parse_verse_number result = importer.parse_verse_number((1, 2, 3), 12) # THEN: parse_verse_number should log the verse number it was called with increment the previous verse # number mocked_log_warning.assert_called_once_with( 'Illegal verse number: (1, 2, 3)') assert result == 13
def test_do_import_completes(self): """ Test do_import when it completes successfully """ # GIVEN: An instance of OpenSongBible with patch.object(OpenSongBible, 'log_debug'), \ patch.object(OpenSongBible, 'validate_xml_file'), \ patch.object(OpenSongBible, 'parse_xml'), \ patch.object(OpenSongBible, 'get_language_id', return_value=10), \ patch.object(OpenSongBible, 'process_books'): importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) # WHEN: Calling do_import result = importer.do_import() # THEN: do_import should return True assert result is True
def test_do_import_parse_xml_fails(self): """ Test do_import when parse_xml fails (returns None) """ # GIVEN: An instance of OpenSongBible and a mocked parse_xml which returns False with patch.object(OpenSongBible, 'log_debug'), \ patch.object(OpenSongBible, 'validate_xml_file'), \ patch.object(OpenSongBible, 'parse_xml', return_value=None), \ patch.object(OpenSongBible, 'get_language_id') as mocked_language_id: importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) # WHEN: Calling do_import result = importer.do_import() # THEN: do_import should return False and get_language_id should have not been called assert result is False assert mocked_language_id.called is False
def test_do_import_no_language(self): """ Test do_import when the user cancels the language selection dialog """ # GIVEN: An instance of OpenSongBible and a mocked get_language which returns False with patch.object(OpenSongBible, 'log_debug'), \ patch.object(OpenSongBible, 'validate_xml_file'), \ patch.object(OpenSongBible, 'parse_xml'), \ patch.object(OpenSongBible, 'get_language_id', return_value=False), \ patch.object(OpenSongBible, 'process_books') as mocked_process_books: importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) # WHEN: Calling do_import result = importer.do_import() # THEN: do_import should return False and process_books should have not been called assert result is False assert mocked_process_books.called is False
def test_create_importer(self): """ Test creating an instance of the OpenSong file importer """ # GIVEN: A mocked out "manager" mocked_manager = MagicMock() # WHEN: An importer object is created importer = OpenSongBible(mocked_manager, path='.', name='.', file_path=None) # THEN: The importer should be an instance of BibleDB assert isinstance(importer, BibleImport)
def process_verses_stop_import_test(self): """ Test process_verses when stop_import is set to True """ # GIVEN: An isntance of OpenSongBible importer = OpenSongBible(MagicMock(), path='.', name='.', filename='') importer.parse_verse_number = MagicMock() # WHEN: stop_import_flag is set to True importer.stop_import_flag = True importer.process_verses('Book', 1, 'Verses') # THEN: importer.parse_verse_number not have been called self.assertFalse(importer.parse_verse_number.called)
def test_process_chapters_stop_import(self): """ Test process_chapters when stop_import is set to True """ # GIVEN: An isntance of OpenSongBible importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) importer.parse_chapter_number = MagicMock() # WHEN: stop_import_flag is set to True importer.stop_import_flag = True importer.process_chapters('Book', ['Chapter1']) # THEN: importer.parse_chapter_number not have been called assert importer.parse_chapter_number.called is False
def test_process_verses_completes(self): """ Test process_verses when it completes """ with patch('openlp.plugins.bibles.lib.importers.opensong.get_text', **{'side_effect': ['Verse1 Text', 'Verse2 Text']}) as mocked_get_text, \ patch.object(OpenSongBible, 'parse_verse_number', **{'side_effect': [1, 2]}) as mocked_parse_verse_number: # GIVEN: An instance of OpenSongBible importer = OpenSongBible(MagicMock(), path='.', name='.', file_path=None) importer.wizard = MagicMock() # WHEN: called with some valid data book = MagicMock() book.id = 1 verse1 = MagicMock() verse1.attrib = {'n': '1'} verse1.c = 'Chapter1' verse1.v = ['Chapter1 Verses'] verse2 = MagicMock() verse2.attrib = {'n': '2'} verse2.c = 'Chapter2' verse2.v = ['Chapter2 Verses'] importer.create_verse = MagicMock() importer.stop_import_flag = False importer.process_verses(book, 1, [verse1, verse2]) # THEN: parse_chapter_number, process_verses and increment_process_bar should have been called assert mocked_parse_verse_number.call_args_list == [ call('1', 0), call('2', 1) ] assert mocked_get_text.call_args_list == [ call(verse1), call(verse2) ] assert importer.create_verse.call_args_list == \ [call(1, 1, 1, 'Verse1 Text'), call(1, 1, 2, 'Verse2 Text')]
def test_file_import(self): """ Test the actual import of OpenSong Bible file """ # GIVEN: Test files with a mocked out "manager", "import_wizard", and mocked functions # get_book_ref_id_by_name, create_verse, create_book, session and get_language. test_data = load_external_result_data(TEST_PATH / 'dk1933.json') bible_file = 'opensong-dk1933.xml' with patch( 'openlp.plugins.bibles.lib.importers.opensong.OpenSongBible.application' ): mocked_manager = MagicMock() mocked_import_wizard = MagicMock() importer = OpenSongBible(mocked_manager, path='.', name='.', file_path=None) importer.wizard = mocked_import_wizard importer.get_book_ref_id_by_name = MagicMock() importer.create_verse = MagicMock() importer.create_book = MagicMock() importer.session = MagicMock() importer.get_language = MagicMock() importer.get_language.return_value = 'Danish' # WHEN: Importing bible file importer.file_path = TEST_PATH / bible_file importer.do_import() # THEN: The create_verse() method should have been called with each verse in the file. assert importer.create_verse.called is True for verse_tag, verse_text in test_data['verses']: importer.create_verse.assert_any_call( importer.create_book().id, 1, int(verse_tag), verse_text)