forked from openlp/openlp
Improved unit tests
This commit is contained in:
parent
8072188cdf
commit
5644e26a85
@ -326,7 +326,6 @@ class PowerpointDocument(PresentationDocument):
|
||||
"""
|
||||
titles = []
|
||||
notes = []
|
||||
num = 0
|
||||
for slide in self.presentation.Slides:
|
||||
try:
|
||||
text = slide.Shapes.Title.TextFrame.TextRange.Text
|
||||
@ -334,7 +333,6 @@ class PowerpointDocument(PresentationDocument):
|
||||
log.exception(e)
|
||||
text = ''
|
||||
titles.append(text.replace('\n',' ').replace('\x0b',' ') + '\n')
|
||||
num += 1
|
||||
note = _get_text_from_shapes(slide.NotesPage.Shapes)
|
||||
if len(note) == 0:
|
||||
note = ' '
|
||||
|
@ -157,9 +157,11 @@ class PptviewDocument(PresentationDocument):
|
||||
and the notes to 'slideNotes[x].txt'
|
||||
in the thumbnails directory
|
||||
"""
|
||||
titles = None
|
||||
notes = None
|
||||
filename = os.path.normpath(self.filepath)
|
||||
# let's make sure we have a valid zipped presentation
|
||||
if zipfile.is_zipfile(filename):
|
||||
if os.path.exists(filename) and zipfile.is_zipfile(filename):
|
||||
namespaces = {"p":
|
||||
"http://schemas.openxmlformats.org/presentationml/2006/main",
|
||||
"a": "http://schemas.openxmlformats.org/drawingml/2006/main"}
|
||||
|
@ -322,15 +322,16 @@ class PresentationDocument(object):
|
||||
Performs the actual persisting of titles to the titles.txt
|
||||
and notes to the slideNote%.txt
|
||||
"""
|
||||
if titles:
|
||||
titlesfile = os.path.join(self.get_thumbnail_folder(), 'titles.txt')
|
||||
with open(titlesfile, mode='w') as fo:
|
||||
fo.writelines(titles)
|
||||
for num in range(len(notes)):
|
||||
if notes:
|
||||
for slide_no, note in enumerate(notes):
|
||||
notesfile = os.path.join(self.get_thumbnail_folder(),
|
||||
'slideNotes%d.txt' % (num+1))
|
||||
'slideNotes%d.txt' % (slide_no+1))
|
||||
with open(notesfile, mode='w') as fn:
|
||||
fn.write(notes[num])
|
||||
|
||||
fn.write(notes[slide_no])
|
||||
|
||||
class PresentationController(object):
|
||||
"""
|
||||
|
@ -45,16 +45,6 @@ class TestLibModule(TestCase):
|
||||
self.ppc = ImpressController(mocked_plugin)
|
||||
self.doc = ImpressDocument(self.ppc,self.file_name)
|
||||
|
||||
def verify_installation(self):
|
||||
"""
|
||||
Test the installation of ImpressViewer
|
||||
"""
|
||||
# GIVEN: A boolean value set to true
|
||||
# WHEN: We "convert" it to a bool
|
||||
isInstalled = self.ppc.check_available()
|
||||
# THEN: We should get back a True bool
|
||||
assert isInstalled is True, 'The result should be True'
|
||||
|
||||
def create_titles_and_notes_test(self):
|
||||
"""
|
||||
Test ImpressDocument.create_titles_and_notes
|
||||
@ -76,38 +66,6 @@ class TestLibModule(TestCase):
|
||||
# THEN: save_titles_and_notes should have been called once with two arrays of two elements
|
||||
self.doc.save_titles_and_notes.assert_called_once_with(['\n','\n'],[' ',' '])
|
||||
|
||||
def _mock_a_LibreOffice_document(self,pageCount,noteCount,textCount):
|
||||
pages = MagicMock()
|
||||
page = MagicMock()
|
||||
pages.getByIndex.return_value = page
|
||||
notesPage = MagicMock()
|
||||
notesPage.getCount.return_value = noteCount
|
||||
shape = MagicMock()
|
||||
shape.supportsService.return_value = True
|
||||
shape.getString.return_value = 'Note'
|
||||
notesPage.getByIndex.return_value = shape
|
||||
page.getNotesPage.return_value = notesPage
|
||||
page.getCount.return_value = textCount
|
||||
#pageShape.getString.return_value = 'Title'
|
||||
#pageShape.getString.side_effect = self._get_string_side_effect
|
||||
#page.getByIndex.return_value = pageShape
|
||||
page.getByIndex.side_effect = self._get_page_shape_side_effect
|
||||
pages.getCount.return_value = pageCount
|
||||
document = MagicMock()
|
||||
document.getDrawPages.return_value = pages
|
||||
document.getByIndex.return_value = page
|
||||
return document
|
||||
|
||||
def _get_page_shape_side_effect(*args, **kwargs):
|
||||
pageShape = MagicMock()
|
||||
pageShape.supportsService.return_value = True
|
||||
if args[1] == 0:
|
||||
pageShape.getShapeType.return_value = 'com.sun.star.presentation.TitleTextShape'
|
||||
pageShape.getString.return_value = 'Title'
|
||||
else:
|
||||
pageShape.getString.return_value = 'String'
|
||||
return pageShape
|
||||
|
||||
def get_text_from_page_out_of_bound_test(self):
|
||||
"""
|
||||
Test ImpressDocument.__get_text_from_page with out-of-bounds index
|
||||
@ -158,3 +116,32 @@ class TestLibModule(TestCase):
|
||||
result = self.doc._ImpressDocument__get_text_from_page(1,TextType.SlideText)
|
||||
# THEN: result should be 'Title\nString\nString\n'
|
||||
assert result == 'Title\nString\nString\n', 'Result should be exactly \'Title\\nString\\nString\\n\''
|
||||
|
||||
def _mock_a_LibreOffice_document(self,pageCount,noteCount,textCount):
|
||||
pages = MagicMock()
|
||||
page = MagicMock()
|
||||
pages.getByIndex.return_value = page
|
||||
notesPage = MagicMock()
|
||||
notesPage.getCount.return_value = noteCount
|
||||
shape = MagicMock()
|
||||
shape.supportsService.return_value = True
|
||||
shape.getString.return_value = 'Note'
|
||||
notesPage.getByIndex.return_value = shape
|
||||
page.getNotesPage.return_value = notesPage
|
||||
page.getCount.return_value = textCount
|
||||
page.getByIndex.side_effect = self._get_page_shape_side_effect
|
||||
pages.getCount.return_value = pageCount
|
||||
document = MagicMock()
|
||||
document.getDrawPages.return_value = pages
|
||||
document.getByIndex.return_value = page
|
||||
return document
|
||||
|
||||
def _get_page_shape_side_effect(*args, **kwargs):
|
||||
pageShape = MagicMock()
|
||||
pageShape.supportsService.return_value = True
|
||||
if args[1] == 0:
|
||||
pageShape.getShapeType.return_value = 'com.sun.star.presentation.TitleTextShape'
|
||||
pageShape.getString.return_value = 'Title'
|
||||
else:
|
||||
pageShape.getString.return_value = 'String'
|
||||
return pageShape
|
||||
|
@ -32,7 +32,7 @@ Functional tests to test the PowerPointController class and related methods.
|
||||
from unittest import TestCase
|
||||
import os
|
||||
from mock import MagicMock, patch
|
||||
from openlp.plugins.presentations.lib.powerpointcontroller import PowerpointController, PowerpointDocument
|
||||
from openlp.plugins.presentations.lib.powerpointcontroller import PowerpointController, PowerpointDocument, _get_text_from_shapes
|
||||
|
||||
TEST_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'resources'))
|
||||
|
||||
@ -44,9 +44,9 @@ class TestLibModule(TestCase):
|
||||
self.ppc = PowerpointController(mocked_plugin)
|
||||
self.file_name = os.path.join(TEST_PATH,"test.pptx")
|
||||
self.doc = PowerpointDocument(self.ppc,self.file_name)
|
||||
self.doc.presentation_deleted()
|
||||
|
||||
def verify_installation_test(self):
|
||||
# add _test to the name to enable
|
||||
def verify_installation(self):
|
||||
"""
|
||||
Test the installation of Powerpoint
|
||||
"""
|
||||
@ -70,20 +70,58 @@ class TestLibModule(TestCase):
|
||||
# THEN: result should be true
|
||||
assert result is True, u'The result should be True'
|
||||
|
||||
def verify_titles_test(self):
|
||||
def create_titles_and_notes_test(self):
|
||||
"""
|
||||
Test reading the titles from PowerPoint
|
||||
Test creating the titles from PowerPoint
|
||||
"""
|
||||
# GIVEN:
|
||||
# GIVEN: mocked save_titles_and_notes, _get_text_from_shapes and two mocked slides
|
||||
self.doc = PowerpointDocument(self.ppc,self.file_name)
|
||||
self.doc.load_presentation()
|
||||
self.doc.create_titles_and_notes()
|
||||
#self.doc.load_presentation()
|
||||
self.doc.save_titles_and_notes = MagicMock()
|
||||
self.doc._PowerpointDocument__get_text_from_shapes = MagicMock()
|
||||
slide = MagicMock()
|
||||
slide.Shapes.Title.TextFrame.TextRange.Text = 'SlideText'
|
||||
pres = MagicMock()
|
||||
pres.Slides = [slide,slide]
|
||||
self.doc.presentation = pres
|
||||
# WHEN reading the titles and notes
|
||||
titles,notes = self.doc.get_titles_and_notes()
|
||||
print("titles: ".join(titles))
|
||||
print("notes: ".join(notes))
|
||||
# THEN there should be exactly 5 titles and 5 notes
|
||||
assert len(titles)==5, u'There should be five titles'
|
||||
assert len(notes)==5, u'Theres should be five notes'
|
||||
self.doc.create_titles_and_notes()
|
||||
# THEN the save should have been called exactly once with 2 titles and 2 notes
|
||||
self.doc.save_titles_and_notes.assert_called_once_with(['SlideText\n', 'SlideText\n'], [' ', ' '])
|
||||
|
||||
def create_titles_and_notes_with_no_slides_test(self):
|
||||
"""
|
||||
Test creating the titles from PowerPoint when it returns no slides
|
||||
"""
|
||||
# GIVEN: mocked save_titles_and_notes, _get_text_from_shapes and two mocked slides
|
||||
self.doc = PowerpointDocument(self.ppc,self.file_name)
|
||||
self.doc.save_titles_and_notes = MagicMock()
|
||||
self.doc._PowerpointDocument__get_text_from_shapes = MagicMock()
|
||||
pres = MagicMock()
|
||||
pres.Slides = []
|
||||
self.doc.presentation = pres
|
||||
# WHEN reading the titles and notes
|
||||
self.doc.create_titles_and_notes()
|
||||
# THEN the save should have been called exactly once with empty titles and notes
|
||||
self.doc.save_titles_and_notes.assert_called_once_with([], [])
|
||||
|
||||
def get_text_from_shapes_test(self):
|
||||
"""
|
||||
Test getting text from powerpoint shapes
|
||||
"""
|
||||
# GIVEN: mocked
|
||||
shape = MagicMock()
|
||||
shape.PlaceholderFormat.Type = 2
|
||||
shape.HasTextFrame = shape.TextFrame.HasText = True
|
||||
shape.TextFrame.TextRange.Text = 'slideText'
|
||||
shapes = [shape,shape]
|
||||
result = _get_text_from_shapes(shapes)
|
||||
assert result == 'slideText\nslideText\n'
|
||||
|
||||
def get_text_from_shapes_with_no_shapes_test(self):
|
||||
"""
|
||||
Test getting text from powerpoint shapes with no shapes
|
||||
"""
|
||||
# GIVEN: mocked
|
||||
shapes = []
|
||||
result = _get_text_from_shapes(shapes)
|
||||
assert result == ''
|
||||
|
@ -31,7 +31,7 @@ Functional tests to test the PptviewController class and related methods.
|
||||
"""
|
||||
from unittest import TestCase
|
||||
import os
|
||||
from mock import MagicMock, patch
|
||||
from mock import MagicMock, patch, mock_open
|
||||
from openlp.plugins.presentations.lib.pptviewcontroller import PptviewController, PptviewDocument
|
||||
|
||||
TEST_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'resources'))
|
||||
@ -44,10 +44,8 @@ class TestLibModule(TestCase):
|
||||
self.ppc = PptviewController(mocked_plugin)
|
||||
self.file_name = os.path.join(TEST_PATH,"test.pptx")
|
||||
self.doc = PptviewDocument(self.ppc,self.file_name)
|
||||
self.doc.presentation_deleted()
|
||||
|
||||
#add _test to the function
|
||||
# I don't haver powerpointviewer to verify
|
||||
#add _test to the function name to enable test
|
||||
def verify_installation(self):
|
||||
"""
|
||||
Test the installation of PowerpointViewer
|
||||
@ -58,7 +56,7 @@ class TestLibModule(TestCase):
|
||||
# THEN: We should get back a True bool
|
||||
assert isInstalled is True, u'The result should be True'
|
||||
|
||||
# add _test to the following if necessary
|
||||
# add _test to the following if necessary to enable test
|
||||
# I don't have powerpointviewer to verify
|
||||
def verify_loading_document(self):
|
||||
"""
|
||||
@ -71,9 +69,10 @@ class TestLibModule(TestCase):
|
||||
self.doc.load_presentation()
|
||||
result = self.doc.is_loaded()
|
||||
# THEN: result should be true
|
||||
assert result is True, u'The result should be True'
|
||||
assert result is True, 'The result should be True'
|
||||
|
||||
def verify_titles_test(self):
|
||||
# disabled
|
||||
def verify_titles(self):
|
||||
"""
|
||||
Test reading the titles from PowerpointViewer
|
||||
"""
|
||||
@ -85,6 +84,52 @@ class TestLibModule(TestCase):
|
||||
print("titles: ".join(titles))
|
||||
print("notes: ".join(notes))
|
||||
# THEN there should be exactly 5 titles and 5 notes
|
||||
assert len(titles)==5, u'There should be five titles'
|
||||
assert len(notes)==5, u'Theres should be five notes'
|
||||
assert len(titles)==5, 'There should be five titles'
|
||||
assert len(notes)==5, 'Theres should be five notes'
|
||||
|
||||
def create_titles_and_notes_test(self):
|
||||
"""
|
||||
Test PowerpointController.create_titles_and_notes
|
||||
"""
|
||||
# GIVEN: mocked PresentationController.save_titles_and_notes
|
||||
self.doc.save_titles_and_notes = MagicMock()
|
||||
# WHEN reading the titles and notes
|
||||
self.doc.create_titles_and_notes()
|
||||
# THEN save_titles_and_notes should have been called once with empty arrays
|
||||
self.doc.save_titles_and_notes.assert_called_once_with(['Test 1\n', '\n', 'Test 2\n', 'Test 4\n', 'Test 3\n'], ['Notes for slide 1', 'Inserted', 'Notes for slide 2', 'Notes \nfor slide 4', 'Notes for slide 3'])
|
||||
|
||||
def create_titles_and_notes_nonexistent_file_test(self):
|
||||
"""
|
||||
Test PowerpointController.create_titles_and_notes with nonexistent file
|
||||
"""
|
||||
# GIVEN: mocked PresentationController.save_titles_and_notes and an nonexistent file
|
||||
with patch('builtins.open') as mocked_open, \
|
||||
patch('openlp.plugins.presentations.lib.pptviewcontroller.os.path.exists') as mocked_exists:
|
||||
mocked_exists.return_value = False
|
||||
self.doc = PptviewDocument(self.ppc,'Idontexist.pptx')
|
||||
self.doc.save_titles_and_notes = MagicMock()
|
||||
# WHEN: reading the titles and notes
|
||||
self.doc.create_titles_and_notes()
|
||||
# THEN:
|
||||
self.doc.save_titles_and_notes.assert_called_once_with(None,None)
|
||||
mocked_exists.assert_any_call('Idontexist.pptx')
|
||||
|
||||
def create_titles_and_notes_invalid_file_test(self):
|
||||
"""
|
||||
Test PowerpointController.create_titles_and_notes with invalid file
|
||||
"""
|
||||
# GIVEN: mocked PresentationController.save_titles_and_notes and an invalid file
|
||||
with patch('builtins.open', mock_open(read_data='this is a test')) as mocked_open, \
|
||||
patch('openlp.plugins.presentations.lib.pptviewcontroller.os.path.exists') as mocked_exists, \
|
||||
patch('openlp.plugins.presentations.lib.pptviewcontroller.zipfile.is_zipfile') as mocked_is_zf:
|
||||
mocked_is_zf.return_value = False
|
||||
mocked_exists.return_value = True
|
||||
mocked_open.filesize = 10
|
||||
self.doc = PptviewDocument(self.ppc,os.path.join(TEST_PATH,"test.ppt"))
|
||||
self.doc.save_titles_and_notes = MagicMock()
|
||||
# WHEN: reading the titles and notes
|
||||
self.doc.create_titles_and_notes()
|
||||
# THEN:
|
||||
self.doc.save_titles_and_notes.assert_called_once_with(None,None)
|
||||
assert mocked_is_zf.call_count == 1
|
||||
|
@ -27,7 +27,8 @@
|
||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
"""
|
||||
Functional tests to test the Impress class and related methods.
|
||||
Functional tests to test the PresentationController and PresentationDocument
|
||||
classes and related methods.
|
||||
"""
|
||||
from unittest import TestCase
|
||||
import os
|
||||
@ -48,20 +49,25 @@ class TestLibModule(TestCase):
|
||||
Test PresentationDocument.save_titles_and_notes method with two valid lists
|
||||
"""
|
||||
# GIVEN: two lists of length==2 and a mocked open and get_thumbnail_folder
|
||||
with patch('builtins.open') as mocked_open, \
|
||||
mocked_open = mock_open()
|
||||
with patch('builtins.open', mocked_open), \
|
||||
patch('openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder') \
|
||||
as mocked_get_thumbnail_folder:
|
||||
t = ['uno', 'dos']
|
||||
n = ['one', 'two']
|
||||
titles = ['uno', 'dos']
|
||||
notes = ['one', 'two']
|
||||
# WHEN: calling save_titles_and_notes
|
||||
mocked_get_thumbnail_folder.return_value = 'test'
|
||||
self.document.save_titles_and_notes(t,n)
|
||||
self.document.save_titles_and_notes(titles,notes)
|
||||
# THEN: the last call to open should have been for slideNotes2.txt
|
||||
mocked_open.assert_called_with(
|
||||
os.path.join('test','slideNotes2.txt'), mode='w')
|
||||
mocked_open.assert_any_call(os.path.join('test','titles.txt'), mode='w')
|
||||
mocked_open.assert_any_call(os.path.join('test','slideNotes1.txt'), mode='w')
|
||||
mocked_open.assert_any_call(os.path.join('test','slideNotes2.txt'), mode='w')
|
||||
assert mocked_open.call_count == 3, 'There should be exactly three files opened'
|
||||
mocked_open().writelines.assert_called_once_with(['uno','dos'])
|
||||
mocked_open().write.assert_called_any('one')
|
||||
mocked_open().write.assert_called_any('two')
|
||||
|
||||
def save_titles_and_notes_with_None_and_empty_test(self):
|
||||
def save_titles_and_notes_with_None_test(self):
|
||||
"""
|
||||
Test PresentationDocument.save_titles_and_notes method with no data
|
||||
"""
|
||||
@ -69,14 +75,13 @@ class TestLibModule(TestCase):
|
||||
with patch('builtins.open') as mocked_open, \
|
||||
patch('openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder') \
|
||||
as mocked_get_thumbnail_folder:
|
||||
t = None
|
||||
n = []
|
||||
titles = None
|
||||
notes = None
|
||||
# WHEN: calling save_titles_and_notes
|
||||
mocked_get_thumbnail_folder.return_value = 'test'
|
||||
self.document.save_titles_and_notes(t,n)
|
||||
# THEN: the one and only call to open should have been for titles.txt
|
||||
mocked_open.assert_called_once_with(
|
||||
os.path.join('test','titles.txt'), mode='w')
|
||||
self.document.save_titles_and_notes(titles,notes)
|
||||
# THEN: No file should have been created
|
||||
assert mocked_open.call_count == 0, 'No file should be created'
|
||||
|
||||
|
||||
def get_titles_and_notes_test(self):
|
||||
@ -97,9 +102,11 @@ class TestLibModule(TestCase):
|
||||
assert len(result_titles) == 2
|
||||
assert type(result_notes) is list
|
||||
assert len(result_notes) == 2
|
||||
assert mocked_open.call_count == 3
|
||||
mocked_open.assert_called_with(os.path.join('test','slideNotes2.txt'))
|
||||
assert mocked_exists.call_count == 3
|
||||
assert mocked_open.call_count == 3, 'Three files should be opened'
|
||||
mocked_open.assert_any_call(os.path.join('test','titles.txt'))
|
||||
mocked_open.assert_any_call(os.path.join('test','slideNotes1.txt'))
|
||||
mocked_open.assert_any_call(os.path.join('test','slideNotes2.txt'))
|
||||
assert mocked_exists.call_count == 3, 'Three files should have been checked'
|
||||
|
||||
def get_titles_and_notes_with_file_not_found_test(self):
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user