diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 46195478d..16008f7e9 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -34,6 +34,7 @@ if os.name == 'nt': from ctypes import cdll from ctypes.wintypes import RECT +from openlp.core.utils import AppLocation from openlp.core.lib import ScreenList from .presentationcontroller import PresentationController, PresentationDocument @@ -85,8 +86,8 @@ class PptviewController(PresentationController): if self.process: return log.debug('start PPTView') - dll_path = os.path.join( - self.plugin_manager.base_path, 'presentations', 'lib', 'pptviewlib', 'pptviewlib.dll') + dll_path = os.path.join(AppLocation.get_directory(AppLocation.AppDir), + 'presentations', 'lib', 'pptviewlib', 'pptviewlib.dll') self.process = cdll.LoadLibrary(dll_path) if log.isEnabledFor(logging.DEBUG): self.process.SetDebug(1) diff --git a/tests/functional/openlp_plugins/presentations/test_pptviewcontroller.py b/tests/functional/openlp_plugins/presentations/test_pptviewcontroller.py index 5f25c4d3a..1b43615f3 100644 --- a/tests/functional/openlp_plugins/presentations/test_pptviewcontroller.py +++ b/tests/functional/openlp_plugins/presentations/test_pptviewcontroller.py @@ -30,19 +30,78 @@ This module contains tests for the pptviewcontroller module of the Presentations plugin. """ import os +import shutil +if os.name == 'nt': + from ctypes import cdll + +from tempfile import mkdtemp from unittest import TestCase from tests.functional import MagicMock, patch +from tests.helpers.testmixin import TestMixin -from openlp.plugins.presentations.lib.pptviewcontroller import PptviewDocument +from openlp.plugins.presentations.lib.pptviewcontroller import PptviewDocument, PptviewController + +class TestPptviewController(TestCase, TestMixin): + """ + Test the PptviewController Class + """ #TODO: Items left to test # PptviewController -# __init__ -# check_availablecheck_installed # start_process(self) # kill + def setUp(self): + """ + Set up the patches and mocks need for all tests. + """ + self.get_application() + self.build_settings() + self.mock_plugin = MagicMock() + self.temp_folder = mkdtemp() + self.mock_plugin.settings_section = self.temp_folder + + def tearDown(self): + """ + Stop the patches + """ + self.destroy_settings() + shutil.rmtree(self.temp_folder) + + def constructor_test(self): + """ + Test the Constructor from the PptViewController + """ + # GIVEN: No presentation controller + controller = None + + # WHEN: The presentation controller object is created + controller = PptviewController(plugin=self.mock_plugin) + + # THEN: The name of the presentation controller should be correct + self.assertEqual('Powerpoint Viewer', controller.name, 'The name of the presentation controller should be correct') + + def check_available_test(self): + """ + Test check_available / check_installed + """ + # GIVEN: A mocked dll loader and a controller + with patch('ctypes.cdll.LoadLibrary') as mocked_load_library: + mocked_process = MagicMock() + mocked_process.CheckInstalled.return_value = True + mocked_load_library.return_value = mocked_process + controller = PptviewController(plugin=self.mock_plugin) + + # WHEN: check_available is called + available = controller.check_available() + + # THEN: On windows it should return True, on other platforms False + if os.name == 'nt': + self.assertTrue(available, 'check_available should return True on windows.') + else: + self.assertFalse(available, 'check_available should return False when not on windows.') + class TestPptviewDocument(TestCase): """ diff --git a/tests/helpers/testmixin.py b/tests/helpers/testmixin.py index bda6d7291..b4e8a5c59 100644 --- a/tests/helpers/testmixin.py +++ b/tests/helpers/testmixin.py @@ -53,13 +53,12 @@ class TestMixin(object): Build the settings Object and initialise it """ Settings.setDefaultFormat(Settings.IniFormat) - fd, self.ini_file = mkstemp('.ini') + self.fd, self.ini_file = mkstemp('.ini') Settings().set_filename(self.ini_file) def destroy_settings(self): """ Destroy the Settings Object """ - if hasattr(self, 'fd'): - os.close(self.fd) + os.close(self.fd) os.unlink(Settings().fileName()) diff --git a/tests/interfaces/openlp_core_lib/test_pluginmanager.py b/tests/interfaces/openlp_core_lib/test_pluginmanager.py index 2949a46fb..054aa6dc1 100644 --- a/tests/interfaces/openlp_core_lib/test_pluginmanager.py +++ b/tests/interfaces/openlp_core_lib/test_pluginmanager.py @@ -31,6 +31,7 @@ Package to test the openlp.core.lib.pluginmanager package. """ import sys import shutil +import gc from tempfile import mkdtemp from unittest import TestCase @@ -65,6 +66,9 @@ class TestPluginManager(TestCase, TestMixin): del self.main_window Settings().remove('advanced/data path') self.destroy_settings() + # On windows we need to manually garbage collect to close sqlalchemy files + # to avoid errors when temporary files are deleted. + gc.collect() shutil.rmtree(self.temp_dir) def find_plugins_test(self):