Patch changes from botched branch

This commit is contained in:
Phill Ridout 2014-10-06 19:09:47 +01:00
parent ba464e5faa
commit ddec0e00cd
2 changed files with 302 additions and 168 deletions

View File

@ -145,7 +145,7 @@ class PresentationMediaItem(MediaManagerItem):
if self.controllers[item].enabled(): if self.controllers[item].enabled():
self.display_type_combo_box.addItem(item) self.display_type_combo_box.addItem(item)
if self.display_type_combo_box.count() > 1: if self.display_type_combo_box.count() > 1:
self.display_type_combo_box.insertItem(0, self.automatic) self.display_type_combo_box.insertItem(0, self.automatic, userData='automatic')
self.display_type_combo_box.setCurrentIndex(0) self.display_type_combo_box.setCurrentIndex(0)
if Settings().value(self.settings_section + '/override app') == QtCore.Qt.Checked: if Settings().value(self.settings_section + '/override app') == QtCore.Qt.Checked:
self.presentation_widget.show() self.presentation_widget.show()
@ -313,7 +313,7 @@ class PresentationMediaItem(MediaManagerItem):
(path, name) = os.path.split(filename) (path, name) = os.path.split(filename)
service_item.title = name service_item.title = name
if os.path.exists(filename): if os.path.exists(filename):
if service_item.processor == self.automatic: if self.display_type_combo_box.itemData(self.display_type_combo_box.currentIndex()) == 'automatic':
service_item.processor = self.find_controller_by_type(filename) service_item.processor = self.find_controller_by_type(filename)
if not service_item.processor: if not service_item.processor:
return False return False

View File

@ -1,166 +1,300 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 # vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
############################################################################### ###############################################################################
# OpenLP - Open Source Lyrics Projection # # OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- # # --------------------------------------------------------------------------- #
# Copyright (c) 2008-2014 Raoul Snyman # # Copyright (c) 2008-2014 Raoul Snyman #
# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan # # Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # # Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # # Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # # Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # # Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # # Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # # Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
# --------------------------------------------------------------------------- # # --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it # # This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free # # under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. # # Software Foundation; version 2 of the License. #
# # # #
# This program is distributed in the hope that it will be useful, but WITHOUT # # This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. # # more details. #
# # # #
# You should have received a copy of the GNU General Public License along # # You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 # # with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
Functional tests to test the PresentationController and PresentationDocument Functional tests to test the PresentationController and PresentationDocument
classes and related methods. classes and related methods.
""" """
from unittest import TestCase from unittest import TestCase
import os import os
from openlp.plugins.presentations.lib.presentationcontroller import PresentationController, PresentationDocument from openlp.plugins.presentations.lib.presentationcontroller import PresentationController, PresentationDocument
from tests.functional import MagicMock, patch, mock_open from tests.functional import MagicMock, mock_open, patch
FOLDER_TO_PATCH = 'openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder' FOLDER_TO_PATCH = 'openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder'
class TestPresentationController(TestCase): class TestPresentationController(TestCase):
""" """
Test the PresentationController. Test the PresentationController.
""" """
def setUp(self): # TODO: Items left to test
mocked_plugin = MagicMock() # PresentationController
mocked_plugin.settings_section = 'presentations' # __init__
self.presentation = PresentationController(mocked_plugin) # enabled
self.document = PresentationDocument(self.presentation, '') # is_available
# check_available
def constructor_test(self): # start_process
""" # kill
Test the Constructor # add_document
""" # remove_doc
# GIVEN: A mocked plugin # close_presentation
# _get_plugin_manager
# WHEN: The PresentationController is created
def setUp(self):
# THEN: The name of the presentation controller should be correct mocked_plugin = MagicMock()
self.assertEqual('PresentationController', self.presentation.name, mocked_plugin.settings_section = 'presentations'
'The name of the presentation controller should be correct') self.presentation = PresentationController(mocked_plugin)
self.document = PresentationDocument(self.presentation, '')
def save_titles_and_notes_test(self):
""" def constructor_test(self):
Test PresentationDocument.save_titles_and_notes method with two valid lists """
""" Test the Constructor
# GIVEN: two lists of length==2 and a mocked open and get_thumbnail_folder """
mocked_open = mock_open() # GIVEN: A mocked plugin
with patch('builtins.open', mocked_open), patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder:
titles = ['uno', 'dos'] # WHEN: The PresentationController is created
notes = ['one', 'two']
# THEN: The name of the presentation controller should be correct
# WHEN: calling save_titles_and_notes self.assertEqual('PresentationController', self.presentation.name,
mocked_get_thumbnail_folder.return_value = 'test' 'The name of the presentation controller should be correct')
self.document.save_titles_and_notes(titles, notes)
def save_titles_and_notes_test(self):
# THEN: the last call to open should have been for slideNotes2.txt """
mocked_open.assert_any_call(os.path.join('test', 'titles.txt'), mode='w') Test PresentationDocument.save_titles_and_notes method with two valid lists
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') # GIVEN: two lists of length==2 and a mocked open and get_thumbnail_folder
self.assertEqual(mocked_open.call_count, 3, 'There should be exactly three files opened') mocked_open = mock_open()
mocked_open().writelines.assert_called_once_with(['uno', 'dos']) with patch('builtins.open', mocked_open), patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder:
mocked_open().write.assert_called_any('one') titles = ['uno', 'dos']
mocked_open().write.assert_called_any('two') notes = ['one', 'two']
def save_titles_and_notes_with_None_test(self): # WHEN: calling save_titles_and_notes
""" mocked_get_thumbnail_folder.return_value = 'test'
Test PresentationDocument.save_titles_and_notes method with no data self.document.save_titles_and_notes(titles, notes)
"""
# GIVEN: None and an empty list and a mocked open and get_thumbnail_folder # THEN: the last call to open should have been for slideNotes2.txt
with patch('builtins.open') as mocked_open, patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder: mocked_open.assert_any_call(os.path.join('test', 'titles.txt'), mode='w')
titles = None mocked_open.assert_any_call(os.path.join('test', 'slideNotes1.txt'), mode='w')
notes = None mocked_open.assert_any_call(os.path.join('test', 'slideNotes2.txt'), mode='w')
self.assertEqual(mocked_open.call_count, 3, 'There should be exactly three files opened')
# WHEN: calling save_titles_and_notes mocked_open().writelines.assert_called_once_with(['uno', 'dos'])
mocked_get_thumbnail_folder.return_value = 'test' mocked_open().write.assert_called_any('one')
self.document.save_titles_and_notes(titles, notes) mocked_open().write.assert_called_any('two')
# THEN: No file should have been created def save_titles_and_notes_with_None_test(self):
self.assertEqual(mocked_open.call_count, 0, 'No file should be created') """
Test PresentationDocument.save_titles_and_notes method with no data
def get_titles_and_notes_test(self): """
""" # GIVEN: None and an empty list and a mocked open and get_thumbnail_folder
Test PresentationDocument.get_titles_and_notes method with patch('builtins.open') as mocked_open, patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder:
""" titles = None
# GIVEN: A mocked open, get_thumbnail_folder and exists notes = None
with patch('builtins.open', mock_open(read_data='uno\ndos\n')) as mocked_open, \ # WHEN: calling save_titles_and_notes
patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder, \ mocked_get_thumbnail_folder.return_value = 'test'
patch('openlp.plugins.presentations.lib.presentationcontroller.os.path.exists') as mocked_exists: self.document.save_titles_and_notes(titles, notes)
mocked_get_thumbnail_folder.return_value = 'test'
mocked_exists.return_value = True # THEN: No file should have been created
self.assertEqual(mocked_open.call_count, 0, 'No file should be created')
# WHEN: calling get_titles_and_notes
result_titles, result_notes = self.document.get_titles_and_notes() def get_titles_and_notes_test(self):
"""
# THEN: it should return two items for the titles and two empty strings for the notes Test PresentationDocument.get_titles_and_notes method
self.assertIs(type(result_titles), list, 'result_titles should be of type list') """
self.assertEqual(len(result_titles), 2, 'There should be two items in the titles') # GIVEN: A mocked open, get_thumbnail_folder and exists
self.assertIs(type(result_notes), list, 'result_notes should be of type list')
self.assertEqual(len(result_notes), 2, 'There should be two items in the notes') with patch('builtins.open', mock_open(read_data='uno\ndos\n')) as mocked_open, \
self.assertEqual(mocked_open.call_count, 3, 'Three files should be opened') patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder, \
mocked_open.assert_any_call(os.path.join('test', 'titles.txt')) patch('openlp.plugins.presentations.lib.presentationcontroller.os.path.exists') as mocked_exists:
mocked_open.assert_any_call(os.path.join('test', 'slideNotes1.txt')) mocked_get_thumbnail_folder.return_value = 'test'
mocked_open.assert_any_call(os.path.join('test', 'slideNotes2.txt')) mocked_exists.return_value = True
self.assertEqual(mocked_exists.call_count, 3, 'Three files should have been checked')
# WHEN: calling get_titles_and_notes
def get_titles_and_notes_with_file_not_found_test(self): result_titles, result_notes = self.document.get_titles_and_notes()
"""
Test PresentationDocument.get_titles_and_notes method with file not found # THEN: it should return two items for the titles and two empty strings for the notes
""" self.assertIs(type(result_titles), list, 'result_titles should be of type list')
# GIVEN: A mocked open, get_thumbnail_folder and exists self.assertEqual(len(result_titles), 2, 'There should be two items in the titles')
with patch('builtins.open') as mocked_open, \ self.assertIs(type(result_notes), list, 'result_notes should be of type list')
patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder, \ self.assertEqual(len(result_notes), 2, 'There should be two items in the notes')
patch('openlp.plugins.presentations.lib.presentationcontroller.os.path.exists') as mocked_exists: self.assertEqual(mocked_open.call_count, 3, 'Three files should be opened')
mocked_get_thumbnail_folder.return_value = 'test' mocked_open.assert_any_call(os.path.join('test', 'titles.txt'))
mocked_exists.return_value = False mocked_open.assert_any_call(os.path.join('test', 'slideNotes1.txt'))
mocked_open.assert_any_call(os.path.join('test', 'slideNotes2.txt'))
# WHEN: calling get_titles_and_notes self.assertEqual(mocked_exists.call_count, 3, 'Three files should have been checked')
result_titles, result_notes = self.document.get_titles_and_notes()
def get_titles_and_notes_with_file_not_found_test(self):
# THEN: it should return two empty lists """
self.assertIs(type(result_titles), list, 'result_titles should be of type list') Test PresentationDocument.get_titles_and_notes method with file not found
self.assertEqual(len(result_titles), 0, 'there be no titles') """
self.assertIs(type(result_notes), list, 'result_notes should be a list') # GIVEN: A mocked open, get_thumbnail_folder and exists
self.assertEqual(len(result_notes), 0, 'but the list should be empty') with patch('builtins.open') as mocked_open, \
self.assertEqual(mocked_open.call_count, 0, 'No calls to open files') patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder, \
self.assertEqual(mocked_exists.call_count, 1, 'There should be one call to file exists') patch('openlp.plugins.presentations.lib.presentationcontroller.os.path.exists') as mocked_exists:
mocked_get_thumbnail_folder.return_value = 'test'
def get_titles_and_notes_with_file_error_test(self): mocked_exists.return_value = False
"""
Test PresentationDocument.get_titles_and_notes method with file errors # WHEN: calling get_titles_and_notes
""" result_titles, result_notes = self.document.get_titles_and_notes()
# GIVEN: A mocked open, get_thumbnail_folder and exists
with patch('builtins.open') as mocked_open, \ # THEN: it should return two empty lists
patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder, \ self.assertIs(type(result_titles), list, 'result_titles should be of type list')
patch('openlp.plugins.presentations.lib.presentationcontroller.os.path.exists') as mocked_exists: self.assertEqual(len(result_titles), 0, 'there be no titles')
mocked_get_thumbnail_folder.return_value = 'test' self.assertIs(type(result_notes), list, 'result_notes should be a list')
mocked_exists.return_value = True self.assertEqual(len(result_notes), 0, 'but the list should be empty')
mocked_open.side_effect = IOError() self.assertEqual(mocked_open.call_count, 0, 'No calls to open files')
self.assertEqual(mocked_exists.call_count, 1, 'There should be one call to file exists')
# WHEN: calling get_titles_and_notes
result_titles, result_notes = self.document.get_titles_and_notes() def get_titles_and_notes_with_file_error_test(self):
"""
# THEN: it should return two empty lists Test PresentationDocument.get_titles_and_notes method with file errors
self.assertIs(type(result_titles), list, 'result_titles should be a list') """
# GIVEN: A mocked open, get_thumbnail_folder and exists
with patch('builtins.open') as mocked_open, \
patch(FOLDER_TO_PATCH) as mocked_get_thumbnail_folder, \
patch('openlp.plugins.presentations.lib.presentationcontroller.os.path.exists') as mocked_exists:
mocked_get_thumbnail_folder.return_value = 'test'
mocked_exists.return_value = True
mocked_open.side_effect = IOError()
# WHEN: calling get_titles_and_notes
result_titles, result_notes = self.document.get_titles_and_notes()
# THEN: it should return two empty lists
self.assertIs(type(result_titles), list, 'result_titles should be a list')
class TestPresentationDocument(TestCase):
"""
Test the PresentationDocument Class
"""
# TODO: Items left to test
# PresentationDocument
# __init__
# presentation_deleted
# get_thumbnail_folder
# get_temp_folder
# check_thumbnails
# close_presentation
# is_active
# is_loaded
# blank_screen
# unblank_screen
# is_blank
# stop_presentation
# start_presentation
# get_slide_number
# get_slide_count
# goto_slide
# next_step
# previous_step
# convert_thumbnail
# get_thumbnail_path
# poll_slidenumber
# get_slide_text
# get_slide_notes
def setUp(self):
"""
Set up the patches and mocks need for all tests.
"""
self.check_directory_exists_patcher = \
patch('openlp.plugins.presentations.lib.presentationcontroller.check_directory_exists')
self.get_thumbnail_folder_patcher = \
patch('openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder')
self.os_patcher = patch('openlp.plugins.presentations.lib.presentationcontroller.os')
self._setup_patcher = \
patch('openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument._setup')
self.mock_check_directory_exists = self.check_directory_exists_patcher.start()
self.mock_get_thumbnail_folder = self.get_thumbnail_folder_patcher.start()
self.mock_os = self.os_patcher.start()
self.mock_setup = self._setup_patcher.start()
self.mock_controller = MagicMock()
self.mock_get_thumbnail_folder.return_value = 'returned/path/'
def tearDown(self):
"""
Stop the patches
"""
self.check_directory_exists_patcher.stop()
self.get_thumbnail_folder_patcher.stop()
self.os_patcher.stop()
self._setup_patcher.stop()
def initialise_presentation_document_test(self):
"""
Test the PresentationDocument __init__ method when initialising the PresentationDocument Class
"""
# GIVEN: A reset mock_setup and mocked controller
self.mock_setup.reset()
# WHEN: Creating an instance of PresentationDocument
PresentationDocument(self.mock_controller, 'Name')
# THEN: PresentationDocument.__init__ should have been called with the correct arguments
self.mock_setup.assert_called_once_with('Name')
def presentation_document_setup_test(self):
"""
Test the PresentationDocument _setup method when initialising the PresentationDocument Class
"""
self._setup_patcher.stop()
# GIVEN: A mocked controller, patched check_directory_exists_patcher and patched get_thumbnail_folder method
# WHEN: Creating an instance of PresentationDocument
PresentationDocument(self.mock_controller, 'Name')
# THEN: check_directory_exists should have been called with the correct arguments
self.mock_check_directory_exists.assert_called_once_with('returned/path/')
self._setup_patcher.start()
def load_presentation_test(self):
"""
Test the PresentationDocument load_presentation method.
"""
# GIVEN: An instance of PresentationDocument
instance = PresentationDocument(self.mock_controller, 'Name')
# WHEN: Calling load_presentation()
result = instance.load_presentation()
# THEN: False should be returned
self.assertFalse(result, "PresentationDocument.load_presentation should return false.")
def get_file_name_test(self):
"""
Test the get_file_name method.
"""
# GIVEN: A mocked out os.path.split with specified return value, an instance of PresentationDocument and
# arbitary file_path
self.mock_os.path.split.return_value = ['directory', 'file.ext']
instance = PresentationDocument(self.mock_controller, 'Name')
instance.file_path = 'filepath'
# WHEN: Calling get_file_name
result = instance.get_file_name()
# THEN: The file name should have been returned
self.assertEqual(result, 'file.ext')