forked from openlp/openlp
Added test for ews import.
This commit is contained in:
parent
0ee684d3a8
commit
5c405050f1
@ -91,17 +91,24 @@ class EasyWorshipSongImport(SongImport):
|
||||
Import the songs from service file
|
||||
The full spec of the ews files can be found here:
|
||||
https://github.com/meinders/lithium-ews/blob/master/docs/ews%20file%20format.md
|
||||
or here: http://wiki.openlp.org/Development:EasyWorship_EWS_Format
|
||||
|
||||
:return:
|
||||
"""
|
||||
# Open ews file if it exists
|
||||
if not os.path.isfile(self.import_source):
|
||||
log.debug('Given ews file does not exists.')
|
||||
return
|
||||
# Make sure there is room for at least a header and one entry
|
||||
if os.path.getsize(self.import_source) < 892:
|
||||
log.debug('Given ews file is to small to contain valid data.')
|
||||
return
|
||||
# Take a stab at how text is encoded
|
||||
self.encoding = 'cp1252'
|
||||
self.encoding = retrieve_windows_encoding(self.encoding)
|
||||
if not self.encoding:
|
||||
log.debug('No encoding set.')
|
||||
return
|
||||
self.ews_file = open(self.import_source, 'rb')
|
||||
# Get file version
|
||||
type, = struct.unpack('<38s', self.ews_file.read(38))
|
||||
@ -115,13 +122,14 @@ class EasyWorshipSongImport(SongImport):
|
||||
elif version == '1.6':
|
||||
file_pos = 40
|
||||
else:
|
||||
log.debug('Given ews file is of unknown version.')
|
||||
return
|
||||
entry_count = self.get_i32(file_pos)
|
||||
entry_length = self.get_i16(file_pos+4)
|
||||
file_pos += 6
|
||||
self.import_wizard.progress_bar.setMaximum(entry_count)
|
||||
# Loop over songs
|
||||
for x in range(1, entry_count):
|
||||
for i in range(entry_count):
|
||||
# Load entry metadata
|
||||
self.set_defaults()
|
||||
self.title = self.get_string(file_pos, 50)
|
||||
|
@ -69,6 +69,21 @@ SONG_TEST_DATA = [
|
||||
'Just to bow and receive a new blessing,\nIn the beautiful garden of prayer.', 'v3')],
|
||||
'verse_order_list': []}]
|
||||
|
||||
EWS_SONG_TEST_DATA =\
|
||||
{ 'title' : 'Vi pløjed og vi så\'de',
|
||||
'authors' : ['Matthias Claudius'],
|
||||
'verses' :
|
||||
[('Vi pløjed og vi så\'de\nvor sæd i sorten jord,\nså bad vi ham os hjælpe,\nsom højt i Himlen bor,\n'
|
||||
'og han lod snefald hegne\nmod frosten barsk og hård,\nhan lod det tø og regne\nog varme mildt i vår.',
|
||||
'v1'),
|
||||
('Alle gode gaver\nde kommer ovenned,\nså tak da Gud, ja, pris dog Gud\nfor al hans kærlighed!', 'c1'),
|
||||
('Han er jo den, hvis vilje\nopholder alle ting,\nhan klæder markens lilje\nog runder himlens ring,\n'
|
||||
'ham lyder vind og vove,\nham rører ravnes nød,\nhvi skulle ej hans småbørn\nda og få dagligt brød?', 'v2'),
|
||||
('Ja, tak, du kære Fader,\nså mild, så rig, så rund,\nfor korn i hæs og lader,\nfor godt i allen stund!\n'
|
||||
'Vi kan jo intet give,\nsom nogen ting er værd,\nmen tag vort stakkels hjerte,\nså ringe som det er!',
|
||||
'v3')],
|
||||
}
|
||||
|
||||
|
||||
class EasyWorshipSongImportLogger(EasyWorshipSongImport):
|
||||
"""
|
||||
@ -349,9 +364,9 @@ class TestEasyWorshipSongImport(TestCase):
|
||||
self.assertIsNone(importer.do_import(), 'do_import should return None when db_size is less than 0x800')
|
||||
mocked_retrieve_windows_encoding.assert_call(encoding)
|
||||
|
||||
def file_import_test(self):
|
||||
def db_file_import_test(self):
|
||||
"""
|
||||
Test the actual import of real song files and check that the imported data is correct.
|
||||
Test the actual import of real song database files and check that the imported data is correct.
|
||||
"""
|
||||
|
||||
# GIVEN: Test files with a mocked out SongImport class, a mocked out "manager", a mocked out "import_wizard",
|
||||
@ -402,3 +417,43 @@ class TestEasyWorshipSongImport(TestCase):
|
||||
self.assertEquals(importer.verse_order_list, verse_order_list, 'verse_order_list for %s should be %s'
|
||||
% (title, verse_order_list))
|
||||
mocked_finish.assert_called_with()
|
||||
|
||||
def ews_file_import_test(self):
|
||||
"""
|
||||
Test the actual import of song from ews file and check that the imported data is correct.
|
||||
"""
|
||||
|
||||
# GIVEN: Test files with a mocked out SongImport class, a mocked out "manager", a mocked out "import_wizard",
|
||||
# and mocked out "author", "add_copyright", "add_verse", "finish" methods.
|
||||
with patch('openlp.plugins.songs.lib.ewimport.SongImport'), \
|
||||
patch('openlp.plugins.songs.lib.ewimport.retrieve_windows_encoding') as mocked_retrieve_windows_encoding:
|
||||
mocked_retrieve_windows_encoding.return_value = 'cp1252'
|
||||
mocked_manager = MagicMock()
|
||||
mocked_import_wizard = MagicMock()
|
||||
mocked_add_author = MagicMock()
|
||||
mocked_add_verse = MagicMock()
|
||||
mocked_finish = MagicMock()
|
||||
mocked_title = MagicMock()
|
||||
mocked_finish.return_value = True
|
||||
importer = EasyWorshipSongImportLogger(mocked_manager)
|
||||
importer.import_wizard = mocked_import_wizard
|
||||
importer.stop_import_flag = False
|
||||
importer.add_author = mocked_add_author
|
||||
importer.add_verse = mocked_add_verse
|
||||
importer.title = mocked_title
|
||||
importer.finish = mocked_finish
|
||||
importer.topics = []
|
||||
|
||||
# WHEN: Importing ews file
|
||||
importer.import_source = os.path.join(TEST_PATH, 'test1.ews')
|
||||
|
||||
# THEN: do_import should return none, the song data should be as expected, and finish should have been
|
||||
# called.
|
||||
title = EWS_SONG_TEST_DATA['title']
|
||||
self.assertIsNone(importer.do_import(), 'do_import should return None when it has completed')
|
||||
self.assertIn(title, importer._title_assignment_list, 'title for should be "%s"' % title)
|
||||
mocked_add_author.assert_any_call(EWS_SONG_TEST_DATA['authors'][0])
|
||||
for verse_text, verse_tag in EWS_SONG_TEST_DATA['verses']:
|
||||
mocked_add_verse.assert_any_call(verse_text, verse_tag)
|
||||
mocked_finish.assert_called_with()
|
||||
|
||||
|
BIN
tests/resources/easyworshipsongs/test1.ews
Normal file
BIN
tests/resources/easyworshipsongs/test1.ews
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user