forked from openlp/openlp
Allow XML processing istructions in OpenLyrics importer
This commit is contained in:
parent
4ffd7f5a6f
commit
8edce313bc
@ -52,7 +52,7 @@ class OpenLyricsImport(SongImport):
|
||||
Imports the songs.
|
||||
"""
|
||||
self.import_wizard.progress_bar.setMaximum(len(self.import_source))
|
||||
parser = etree.XMLParser(remove_blank_text=True)
|
||||
parser = etree.XMLParser(remove_blank_text=True, remove_pis=True)
|
||||
for file_path in self.import_source:
|
||||
if self.stop_import_flag:
|
||||
return
|
||||
|
43
tests/functional/openlp_plugins/songs/test_openlyricsimport.py
Normal file → Executable file
43
tests/functional/openlp_plugins/songs/test_openlyricsimport.py
Normal file → Executable file
@ -32,6 +32,7 @@ from openlp.core.common.settings import Settings
|
||||
from openlp.plugins.songs.lib.importers.openlyrics import OpenLyricsImport
|
||||
from openlp.plugins.songs.lib.importers.songimport import SongImport
|
||||
from openlp.plugins.songs.lib.openlyricsxml import OpenLyrics
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
from tests.helpers.testmixin import TestMixin
|
||||
from tests.utils.constants import RESOURCE_PATH
|
||||
|
||||
@ -134,6 +135,48 @@ class TestOpenLyricsImport(TestCase, TestMixin):
|
||||
# THEN: The xml_to_song() method should have been called
|
||||
assert importer.open_lyrics.xml_to_song.called is True
|
||||
|
||||
def test_can_parse_file_having_a_processing_instruction(self):
|
||||
"""
|
||||
Test files having a processing instruction can be parsed
|
||||
"""
|
||||
# GIVEN: A OpenLyrics XML containing a processing instruction, an OpenLyrics importer with a mocked out
|
||||
# manager, import wizard and 'log_error' method, and a mocked out logger
|
||||
with patch('openlp.plugins.songs.lib.importers.openlyrics.log', autospec=True) as mocked_logger:
|
||||
mocked_manager = MagicMock()
|
||||
mocked_import_wizard = MagicMock()
|
||||
importer = OpenLyricsImport(mocked_manager, file_paths=[])
|
||||
importer.import_wizard = mocked_import_wizard
|
||||
importer.log_error = MagicMock()
|
||||
|
||||
# WHEN: Importing a file which contains a processing instruction
|
||||
importer.import_source = [TEST_PATH / 'Amazing Grace.xml']
|
||||
try:
|
||||
importer.do_import()
|
||||
except Exception as ex:
|
||||
# THEN: no uncaught exception escaped from importer.do_import() is etree.XMLSyntaxError
|
||||
assert ex is not etree.XMLSyntaxError
|
||||
# otherwise we don't care about it now (but should in other tests...)
|
||||
pass
|
||||
|
||||
# THEN: the importer's log_error method was never called with SongStrings.XMLSyntaxError as its second
|
||||
# positional argument
|
||||
if importer.log_error.called:
|
||||
for call_args in importer.log_error.call_args_list:
|
||||
args = call_args[0]
|
||||
# there are at least two positional arguments
|
||||
if len(args) > 1:
|
||||
assert args[1] is not SongStrings.XMLSyntaxError
|
||||
|
||||
# THEN: the logger's 'exception' method was never called with a first positional argument
|
||||
# which is a string and starts with 'XML syntax error in file'
|
||||
if mocked_logger.exception.called:
|
||||
for call_args in mocked_logger.exception.call_args_list:
|
||||
args = call_args[0]
|
||||
# there is at least one positional argument and it is a string
|
||||
if args and isinstance(args[0], str):
|
||||
error_message = args[0]
|
||||
assert not error_message.startswith('XML syntax error in file')
|
||||
|
||||
def test_process_formatting_tags(self):
|
||||
"""
|
||||
Test that _process_formatting_tags works
|
||||
|
18
tests/resources/songs/openlyrics/Amazing Grace.xml
Normal file
18
tests/resources/songs/openlyrics/Amazing Grace.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet href="openlyrics.css" type="text/css"?>
|
||||
<song xmlns="http://openlyrics.info/namespace/2009/song" xml:lang="en"
|
||||
version="0.8"
|
||||
createdIn="OpenLP 1.9.0"
|
||||
modifiedIn="MyApp 0.0.1"
|
||||
modifiedDate="2012-04-10T22:00:00+10:00">
|
||||
<properties>
|
||||
<titles>
|
||||
<title>Amazing Grace</title>
|
||||
</titles>
|
||||
</properties>
|
||||
<lyrics>
|
||||
<verse name="v1">
|
||||
<lines>Amazing grace how sweet the sound<br/>that saved a wretch like me;</lines>
|
||||
</verse>
|
||||
</lyrics>
|
||||
</song>
|
Loading…
Reference in New Issue
Block a user