From 2a1778c8785e499dbbd8daaa00e7715c852c2bdc Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Apr 2015 01:04:16 +0200 Subject: [PATCH 01/19] Add a test for the constructor --- .../openlp_core_ui_media/test_vlcplayer.py | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index b3ef0484a..5eb470a6c 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -28,13 +28,30 @@ import sys from unittest import TestCase from tests.functional import patch -from openlp.core.ui.media.vlcplayer import get_vlc +from openlp.core.ui.media.vlcplayer import AUDIO_EXT, VIDEO_EXT, VlcPlayer, get_vlc class TestVLCPlayer(TestCase): """ Test the functions in the :mod:`vlcplayer` module. """ + def init_test(self): + """ + Test that the VLC player class initialises correctly + """ + # GIVEN: A mocked out list of extensions + # TODO: figure out how to mock out the lists of extensions + + # WHEN: The VlcPlayer class is instantiated + vlc_player = VlcPlayer(None) + + # THEN: The correct variables are set + self.assertEqual('VLC', vlc_player.original_name) + self.assertEqual('&VLC', vlc_player.display_name) + self.assertIsNone(vlc_player.parent) + self.assertTrue(vlc_player.can_folder) + self.assertListEqual(AUDIO_EXT, vlc_player.audio_extensions_list) + self.assertListEqual(VIDEO_EXT, vlc_player.video_extensions_list) @patch('openlp.core.ui.media.vlcplayer.is_macosx') def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): @@ -74,4 +91,5 @@ class TestVLCPlayer(TestCase): # THEN: The extra environment variable should NOT be there self.assertNotIn('VLC_PLUGIN_PATH', os.environ, - 'The plugin path should NOT be in the environment variables') \ No newline at end of file + 'The plugin path should NOT be in the environment variables') + From fda7ab562cacc8eb3a5d1994188168ab81ec5e1b Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Apr 2015 16:01:09 +0200 Subject: [PATCH 02/19] Add some tests --- openlp/core/ui/media/vlcplayer.py | 2 +- tests/functional/__init__.py | 2 +- .../openlp_core_ui_media/test_vlcplayer.py | 262 +++++++++++++++++- 3 files changed, 259 insertions(+), 7 deletions(-) diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index e2c2ac066..8c2359faf 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -159,7 +159,7 @@ class VlcPlayer(MediaPlayer): # framework and not the old Carbon. display.vlc_media_player.set_nsobject(win_id) else: - # for Linux using the X Server + # for Linux/*BSD using the X Server display.vlc_media_player.set_xwindow(win_id) self.has_own_widget = True diff --git a/tests/functional/__init__.py b/tests/functional/__init__.py index 5948f480f..44d77a1ed 100644 --- a/tests/functional/__init__.py +++ b/tests/functional/__init__.py @@ -42,4 +42,4 @@ else: # Only one QApplication can be created. Use QtGui.QApplication.instance() when you need to "create" a QApplication. application = QtGui.QApplication([]) -__all__ = ['MagicMock', 'patch', 'mock_open', 'call', 'application'] +__all__ = ['ANY', 'MagicMock', 'patch', 'mock_open', 'call', 'application'] diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 5eb470a6c..05efcd87d 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -26,15 +26,25 @@ import os import sys from unittest import TestCase -from tests.functional import patch from openlp.core.ui.media.vlcplayer import AUDIO_EXT, VIDEO_EXT, VlcPlayer, get_vlc +from tests.functional import MagicMock, patch + class TestVLCPlayer(TestCase): """ Test the functions in the :mod:`vlcplayer` module. """ + def setUp(self): + """ + Common setup for all the tests + """ + if 'VLC_PLUGIN_PATH' in os.environ: + del os.environ['VLC_PLUGIN_PATH'] + if 'openlp.core.ui.media.vendor.vlc' in sys.modules: + del sys.modules['openlp.core.ui.media.vendor.vlc'] + def init_test(self): """ Test that the VLC player class initialises correctly @@ -53,6 +63,252 @@ class TestVLCPlayer(TestCase): self.assertListEqual(AUDIO_EXT, vlc_player.audio_extensions_list) self.assertListEqual(VIDEO_EXT, vlc_player.video_extensions_list) + @patch('openlp.core.ui.media.vlcplayer.is_win') + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.QtGui') + @patch('openlp.core.ui.media.vlcplayer.Settings') + def setup_test(self, MockedSettings, MockedQtGui, mocked_get_vlc, mocked_is_macosx, mocked_is_win): + """ + Test the setup method + """ + # GIVEN: A bunch of mocked out stuff and a VlcPlayer object + mocked_is_macosx.return_value = False + mocked_is_win.return_value = False + mocked_settings = MagicMock() + mocked_settings.value.return_value = True + MockedSettings.return_value = mocked_settings + mocked_qframe = MagicMock() + mocked_qframe.winId.return_value = 2 + MockedQtGui.QFrame.NoFrame = 1 + MockedQtGui.QFrame.return_value = mocked_qframe + mocked_media_player_new = MagicMock() + mocked_instance = MagicMock() + mocked_instance.media_player_new.return_value = mocked_media_player_new + mocked_vlc = MagicMock() + mocked_vlc.Instance.return_value = mocked_instance + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.has_audio = False + mocked_display.controller.is_live = True + mocked_display.size.return_value = (10, 10) + vlc_player = VlcPlayer(None) + + # WHEN: setup() is run + vlc_player.setup(mocked_display) + + # THEN: The VLC widget should be set up correctly + self.assertEqual(mocked_display.vlc_widget, mocked_qframe) + mocked_qframe.setFrameStyle.assert_called_with(1) + mocked_settings.value.assert_called_with('advanced/hide mouse') + mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show ' + '--mouse-hide-timeout=0') + self.assertEqual(mocked_display.vlc_instance, mocked_instance) + mocked_instance.media_player_new.assert_called_with() + self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) + mocked_display.size.assert_called_with() + mocked_qframe.resize.assert_called_with((10, 10)) + mocked_qframe.raise_.assert_called_with() + mocked_qframe.hide.assert_called_with() + mocked_media_player_new.set_xwindow.assert_called_with(2) + self.assertTrue(vlc_player.has_own_widget) + + @patch('openlp.core.ui.media.vlcplayer.is_win') + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.QtGui') + @patch('openlp.core.ui.media.vlcplayer.Settings') + def setup_has_audio_test(self, MockedSettings, MockedQtGui, mocked_get_vlc, mocked_is_macosx, mocked_is_win): + """ + Test the setup method when has_audio is True + """ + # GIVEN: A bunch of mocked out stuff and a VlcPlayer object + mocked_is_macosx.return_value = False + mocked_is_win.return_value = False + mocked_settings = MagicMock() + mocked_settings.value.return_value = True + MockedSettings.return_value = mocked_settings + mocked_qframe = MagicMock() + mocked_qframe.winId.return_value = 2 + MockedQtGui.QFrame.NoFrame = 1 + MockedQtGui.QFrame.return_value = mocked_qframe + mocked_media_player_new = MagicMock() + mocked_instance = MagicMock() + mocked_instance.media_player_new.return_value = mocked_media_player_new + mocked_vlc = MagicMock() + mocked_vlc.Instance.return_value = mocked_instance + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.has_audio = True + mocked_display.controller.is_live = True + mocked_display.size.return_value = (10, 10) + vlc_player = VlcPlayer(None) + + # WHEN: setup() is run + vlc_player.setup(mocked_display) + + # THEN: The VLC widget should be set up correctly + self.assertEqual(mocked_display.vlc_widget, mocked_qframe) + mocked_qframe.setFrameStyle.assert_called_with(1) + mocked_settings.value.assert_called_with('advanced/hide mouse') + mocked_vlc.Instance.assert_called_with('--no-video-title-show --mouse-hide-timeout=0') + self.assertEqual(mocked_display.vlc_instance, mocked_instance) + mocked_instance.media_player_new.assert_called_with() + self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) + mocked_display.size.assert_called_with() + mocked_qframe.resize.assert_called_with((10, 10)) + mocked_qframe.raise_.assert_called_with() + mocked_qframe.hide.assert_called_with() + mocked_media_player_new.set_xwindow.assert_called_with(2) + self.assertTrue(vlc_player.has_own_widget) + + @patch('openlp.core.ui.media.vlcplayer.is_win') + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.QtGui') + @patch('openlp.core.ui.media.vlcplayer.Settings') + def setup_visible_mouse_test(self, MockedSettings, MockedQtGui, mocked_get_vlc, mocked_is_macosx, mocked_is_win): + """ + Test the setup method when Settings().value("hide mouse") is False + """ + # GIVEN: A bunch of mocked out stuff and a VlcPlayer object + mocked_is_macosx.return_value = False + mocked_is_win.return_value = False + mocked_settings = MagicMock() + mocked_settings.value.return_value = False + MockedSettings.return_value = mocked_settings + mocked_qframe = MagicMock() + mocked_qframe.winId.return_value = 2 + MockedQtGui.QFrame.NoFrame = 1 + MockedQtGui.QFrame.return_value = mocked_qframe + mocked_media_player_new = MagicMock() + mocked_instance = MagicMock() + mocked_instance.media_player_new.return_value = mocked_media_player_new + mocked_vlc = MagicMock() + mocked_vlc.Instance.return_value = mocked_instance + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.has_audio = False + mocked_display.controller.is_live = True + mocked_display.size.return_value = (10, 10) + vlc_player = VlcPlayer(None) + + # WHEN: setup() is run + vlc_player.setup(mocked_display) + + # THEN: The VLC widget should be set up correctly + self.assertEqual(mocked_display.vlc_widget, mocked_qframe) + mocked_qframe.setFrameStyle.assert_called_with(1) + mocked_settings.value.assert_called_with('advanced/hide mouse') + mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show') + self.assertEqual(mocked_display.vlc_instance, mocked_instance) + mocked_instance.media_player_new.assert_called_with() + self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) + mocked_display.size.assert_called_with() + mocked_qframe.resize.assert_called_with((10, 10)) + mocked_qframe.raise_.assert_called_with() + mocked_qframe.hide.assert_called_with() + mocked_media_player_new.set_xwindow.assert_called_with(2) + self.assertTrue(vlc_player.has_own_widget) + + @patch('openlp.core.ui.media.vlcplayer.is_win') + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.QtGui') + @patch('openlp.core.ui.media.vlcplayer.Settings') + def setup_windows_test(self, MockedSettings, MockedQtGui, mocked_get_vlc, mocked_is_macosx, mocked_is_win): + """ + Test the setup method when running on Windows + """ + # GIVEN: A bunch of mocked out stuff and a VlcPlayer object + mocked_is_macosx.return_value = False + mocked_is_win.return_value = True + mocked_settings = MagicMock() + mocked_settings.value.return_value = False + MockedSettings.return_value = mocked_settings + mocked_qframe = MagicMock() + mocked_qframe.winId.return_value = 2 + MockedQtGui.QFrame.NoFrame = 1 + MockedQtGui.QFrame.return_value = mocked_qframe + mocked_media_player_new = MagicMock() + mocked_instance = MagicMock() + mocked_instance.media_player_new.return_value = mocked_media_player_new + mocked_vlc = MagicMock() + mocked_vlc.Instance.return_value = mocked_instance + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.has_audio = False + mocked_display.controller.is_live = True + mocked_display.size.return_value = (10, 10) + vlc_player = VlcPlayer(None) + + # WHEN: setup() is run + vlc_player.setup(mocked_display) + + # THEN: The VLC widget should be set up correctly + self.assertEqual(mocked_display.vlc_widget, mocked_qframe) + mocked_qframe.setFrameStyle.assert_called_with(1) + mocked_settings.value.assert_called_with('advanced/hide mouse') + mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show') + self.assertEqual(mocked_display.vlc_instance, mocked_instance) + mocked_instance.media_player_new.assert_called_with() + self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) + mocked_display.size.assert_called_with() + mocked_qframe.resize.assert_called_with((10, 10)) + mocked_qframe.raise_.assert_called_with() + mocked_qframe.hide.assert_called_with() + mocked_media_player_new.set_hwnd.assert_called_with(2) + self.assertTrue(vlc_player.has_own_widget) + + @patch('openlp.core.ui.media.vlcplayer.is_win') + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.QtGui') + @patch('openlp.core.ui.media.vlcplayer.Settings') + def setup_osx_test(self, MockedSettings, MockedQtGui, mocked_get_vlc, mocked_is_macosx, mocked_is_win): + """ + Test the setup method when running on OS X + """ + # GIVEN: A bunch of mocked out stuff and a VlcPlayer object + mocked_is_macosx.return_value = True + mocked_is_win.return_value = False + mocked_settings = MagicMock() + mocked_settings.value.return_value = False + MockedSettings.return_value = mocked_settings + mocked_qframe = MagicMock() + mocked_qframe.winId.return_value = 2 + MockedQtGui.QFrame.NoFrame = 1 + MockedQtGui.QFrame.return_value = mocked_qframe + mocked_media_player_new = MagicMock() + mocked_instance = MagicMock() + mocked_instance.media_player_new.return_value = mocked_media_player_new + mocked_vlc = MagicMock() + mocked_vlc.Instance.return_value = mocked_instance + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.has_audio = False + mocked_display.controller.is_live = True + mocked_display.size.return_value = (10, 10) + vlc_player = VlcPlayer(None) + + # WHEN: setup() is run + vlc_player.setup(mocked_display) + + # THEN: The VLC widget should be set up correctly + self.assertEqual(mocked_display.vlc_widget, mocked_qframe) + mocked_qframe.setFrameStyle.assert_called_with(1) + mocked_settings.value.assert_called_with('advanced/hide mouse') + mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show') + self.assertEqual(mocked_display.vlc_instance, mocked_instance) + mocked_instance.media_player_new.assert_called_with() + self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) + mocked_display.size.assert_called_with() + mocked_qframe.resize.assert_called_with((10, 10)) + mocked_qframe.raise_.assert_called_with() + mocked_qframe.hide.assert_called_with() + mocked_media_player_new.set_nsobject.assert_called_with(2) + self.assertTrue(vlc_player.has_own_widget) + @patch('openlp.core.ui.media.vlcplayer.is_macosx') def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): """ @@ -60,10 +316,6 @@ class TestVLCPlayer(TestCase): """ # GIVEN: We're on OS X and we don't have the VLC plugin path set mocked_is_macosx.return_value = True - if 'VLC_PLUGIN_PATH' in os.environ: - del os.environ['VLC_PLUGIN_PATH'] - if 'openlp.core.ui.media.vendor.vlc' in sys.modules: - del sys.modules['openlp.core.ui.media.vendor.vlc'] # WHEN: An checking if the player is available get_vlc() From 64695b9c3394b40f1c93c2ecd18b984940f92a1f Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Apr 2015 16:06:36 +0200 Subject: [PATCH 03/19] Strip out unnecessary asserts --- .../openlp_core_ui_media/test_vlcplayer.py | 56 ++----------------- 1 file changed, 4 insertions(+), 52 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 05efcd87d..0e0116af8 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -147,20 +147,8 @@ class TestVLCPlayer(TestCase): # WHEN: setup() is run vlc_player.setup(mocked_display) - # THEN: The VLC widget should be set up correctly - self.assertEqual(mocked_display.vlc_widget, mocked_qframe) - mocked_qframe.setFrameStyle.assert_called_with(1) - mocked_settings.value.assert_called_with('advanced/hide mouse') + # THEN: The VLC instance should be created with the correct options mocked_vlc.Instance.assert_called_with('--no-video-title-show --mouse-hide-timeout=0') - self.assertEqual(mocked_display.vlc_instance, mocked_instance) - mocked_instance.media_player_new.assert_called_with() - self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) - mocked_display.size.assert_called_with() - mocked_qframe.resize.assert_called_with((10, 10)) - mocked_qframe.raise_.assert_called_with() - mocked_qframe.hide.assert_called_with() - mocked_media_player_new.set_xwindow.assert_called_with(2) - self.assertTrue(vlc_player.has_own_widget) @patch('openlp.core.ui.media.vlcplayer.is_win') @patch('openlp.core.ui.media.vlcplayer.is_macosx') @@ -196,20 +184,8 @@ class TestVLCPlayer(TestCase): # WHEN: setup() is run vlc_player.setup(mocked_display) - # THEN: The VLC widget should be set up correctly - self.assertEqual(mocked_display.vlc_widget, mocked_qframe) - mocked_qframe.setFrameStyle.assert_called_with(1) - mocked_settings.value.assert_called_with('advanced/hide mouse') + # THEN: The VLC instance should be created with the correct options mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show') - self.assertEqual(mocked_display.vlc_instance, mocked_instance) - mocked_instance.media_player_new.assert_called_with() - self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) - mocked_display.size.assert_called_with() - mocked_qframe.resize.assert_called_with((10, 10)) - mocked_qframe.raise_.assert_called_with() - mocked_qframe.hide.assert_called_with() - mocked_media_player_new.set_xwindow.assert_called_with(2) - self.assertTrue(vlc_player.has_own_widget) @patch('openlp.core.ui.media.vlcplayer.is_win') @patch('openlp.core.ui.media.vlcplayer.is_macosx') @@ -245,20 +221,8 @@ class TestVLCPlayer(TestCase): # WHEN: setup() is run vlc_player.setup(mocked_display) - # THEN: The VLC widget should be set up correctly - self.assertEqual(mocked_display.vlc_widget, mocked_qframe) - mocked_qframe.setFrameStyle.assert_called_with(1) - mocked_settings.value.assert_called_with('advanced/hide mouse') - mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show') - self.assertEqual(mocked_display.vlc_instance, mocked_instance) - mocked_instance.media_player_new.assert_called_with() - self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) - mocked_display.size.assert_called_with() - mocked_qframe.resize.assert_called_with((10, 10)) - mocked_qframe.raise_.assert_called_with() - mocked_qframe.hide.assert_called_with() + # THEN: set_hwnd should be called mocked_media_player_new.set_hwnd.assert_called_with(2) - self.assertTrue(vlc_player.has_own_widget) @patch('openlp.core.ui.media.vlcplayer.is_win') @patch('openlp.core.ui.media.vlcplayer.is_macosx') @@ -294,20 +258,8 @@ class TestVLCPlayer(TestCase): # WHEN: setup() is run vlc_player.setup(mocked_display) - # THEN: The VLC widget should be set up correctly - self.assertEqual(mocked_display.vlc_widget, mocked_qframe) - mocked_qframe.setFrameStyle.assert_called_with(1) - mocked_settings.value.assert_called_with('advanced/hide mouse') - mocked_vlc.Instance.assert_called_with('--no-video-title-show --no-audio --no-video-title-show') - self.assertEqual(mocked_display.vlc_instance, mocked_instance) - mocked_instance.media_player_new.assert_called_with() - self.assertEqual(mocked_display.vlc_media_player, mocked_media_player_new) - mocked_display.size.assert_called_with() - mocked_qframe.resize.assert_called_with((10, 10)) - mocked_qframe.raise_.assert_called_with() - mocked_qframe.hide.assert_called_with() + # THEN: set_nsobject should be called mocked_media_player_new.set_nsobject.assert_called_with(2) - self.assertTrue(vlc_player.has_own_widget) @patch('openlp.core.ui.media.vlcplayer.is_macosx') def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): From d09c5acd0a9025a4f7167953b87edadcf264b7da Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Apr 2015 20:20:03 +0200 Subject: [PATCH 04/19] Silence a Phonon warning by providing an application name in the tests. --- tests/functional/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/functional/__init__.py b/tests/functional/__init__.py index 44d77a1ed..12005c16e 100644 --- a/tests/functional/__init__.py +++ b/tests/functional/__init__.py @@ -41,5 +41,6 @@ else: # Only one QApplication can be created. Use QtGui.QApplication.instance() when you need to "create" a QApplication. application = QtGui.QApplication([]) +application.setApplicationName('OpenLP') __all__ = ['ANY', 'MagicMock', 'patch', 'mock_open', 'call', 'application'] From 9deeab658afdbf8c879bfb7255a6450ca86514d4 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Apr 2015 22:23:58 +0200 Subject: [PATCH 05/19] Ignore KDevelop project files --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 5fd2beb79..903cfd461 100644 --- a/.bzrignore +++ b/.bzrignore @@ -42,3 +42,4 @@ __pycache__ *.~\?~ .coverage cover +vlc-tests.kdev4 From 54ce226ad864ef2781ee7c023096a5a8c0f9cdde Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 28 Apr 2015 22:27:55 +0200 Subject: [PATCH 06/19] Add tests for stop(), resize(), check_available() and volume() --- .../openlp_core_ui_media/test_vlcplayer.py | 99 ++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 0e0116af8..d7b2a9910 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -24,9 +24,9 @@ Package to test the openlp.core.ui.media.vlcplayer package. """ import os import sys - from unittest import TestCase +from openlp.core.ui.media import MediaState from openlp.core.ui.media.vlcplayer import AUDIO_EXT, VIDEO_EXT, VlcPlayer, get_vlc from tests.functional import MagicMock, patch @@ -261,6 +261,103 @@ class TestVLCPlayer(TestCase): # THEN: set_nsobject should be called mocked_media_player_new.set_nsobject.assert_called_with(2) + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def check_available_test(self, mocked_get_vlc): + """ + Check that when the "vlc" module is available, then VLC is set as available + """ + # GIVEN: A mocked out get_vlc() method and a VlcPlayer instance + mocked_get_vlc.return_value = MagicMock() + vlc_player = VlcPlayer(None) + + # WHEN: vlc + is_available = vlc_player.check_available() + + # THEN: VLC should be available + self.assertTrue(is_available) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def check_not_available_test(self, mocked_get_vlc): + """ + Check that when the "vlc" module is not available, then VLC is set as unavailable + """ + # GIVEN: A mocked out get_vlc() method and a VlcPlayer instance + mocked_get_vlc.return_value = None + vlc_player = VlcPlayer(None) + + # WHEN: vlc + is_available = vlc_player.check_available() + + # THEN: VLC should NOT be available + self.assertFalse(is_available) + + def resize_test(self): + """ + Test resizing the player + """ + # GIVEN: A display object and a VlcPlayer instance + display = MagicMock() + display.size.return_value = (10, 10) + vlc_player = VlcPlayer(None) + + # WHEN: resize is called + vlc_player.resize(display) + + # THEN: The right methods should have been called + display.size.assert_called_with() + display.vlc_widget.resize.assert_called_with((10, 10)) + + @patch('openlp.core.ui.media.vlcplayer.threading') + def stop_test(self, mocked_threading): + """ + Test stopping the current item + """ + # GIVEN: A display object and a VlcPlayer instance and some mocked threads + mocked_thread = MagicMock() + mocked_threading.Thread.return_value = mocked_thread + mocked_stop = MagicMock() + display = MagicMock() + display.vlc_media_player.stop = mocked_stop + vlc_player = VlcPlayer(None) + + # WHEN: stop is called + vlc_player.stop(display) + + # THEN: A thread should have been started to stop VLC + mocked_threading.Thread.assert_called_with(target=mocked_stop) + mocked_thread.start.assert_called_with() + self.assertEqual(MediaState.Stopped, vlc_player.state) + + def volume_test(self): + """ + Test setting the volume + """ + # GIVEN: A display object and a VlcPlayer instance + display = MagicMock() + display.has_audio = True + vlc_player = VlcPlayer(None) + + # WHEN: The volume is set + vlc_player.volume(display, 10) + + # THEN: The volume should have been set + display.vlc_media_player.audio_set_volume.assert_called_with(10) + + def volume_no_audio_test(self): + """ + Test setting the volume when there's no audio + """ + # GIVEN: A display object and a VlcPlayer instance + display = MagicMock() + display.has_audio = False + vlc_player = VlcPlayer(None) + + # WHEN: The volume is set + vlc_player.volume(display, 10) + + # THEN: The volume should NOT have been set + self.assertEqual(0, display.vlc_media_player.audio_set_volume.call_count) + @patch('openlp.core.ui.media.vlcplayer.is_macosx') def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): """ From dd9e12d2b551877e2fd69f88b43e901cc977c4e5 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 30 Apr 2015 23:14:23 +0200 Subject: [PATCH 07/19] Fixed an interface test, added some more VLC tests --- .../openlp_core_ui_media/test_vlcplayer.py | 129 +++++++++++++++--- .../media/forms/test_mediaclipselectorform.py | 4 +- 2 files changed, 114 insertions(+), 19 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index d7b2a9910..f520c3da5 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -24,15 +24,38 @@ Package to test the openlp.core.ui.media.vlcplayer package. """ import os import sys +from datetime import datetime, timedelta from unittest import TestCase +from openlp.core.common import Registry from openlp.core.ui.media import MediaState from openlp.core.ui.media.vlcplayer import AUDIO_EXT, VIDEO_EXT, VlcPlayer, get_vlc from tests.functional import MagicMock, patch +from tests.helpers.testmixin import TestMixin -class TestVLCPlayer(TestCase): +class MockDateTime(object): + _return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] + _counter = 0 + + @classmethod + def _revert(cls): + cls._return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] + cls._counter = 0 + + @classmethod + def now(cls): + print('%s, %s' % (len(cls._return_values), cls._counter)) + if len(cls._return_values) > cls._counter: + mocked_datetime = cls._return_values[cls._counter] + else: + mocked_datetime = cls._return_values[-1] + cls._counter += 1 + return mocked_datetime + + +class TestVLCPlayer(TestCase, TestMixin): """ Test the functions in the :mod:`vlcplayer` module. """ @@ -44,6 +67,7 @@ class TestVLCPlayer(TestCase): del os.environ['VLC_PLUGIN_PATH'] if 'openlp.core.ui.media.vendor.vlc' in sys.modules: del sys.modules['openlp.core.ui.media.vendor.vlc'] + MockDateTime._revert() def init_test(self): """ @@ -291,21 +315,92 @@ class TestVLCPlayer(TestCase): # THEN: VLC should NOT be available self.assertFalse(is_available) + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) + def media_state_wait_test(self, mocked_get_vlc): + """ + Check that waiting for a state change works + """ + # GIVEN: A mocked out get_vlc method + mocked_vlc = MagicMock() + mocked_vlc.State.Error = 1 + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.vlc_media.get_state.return_value = 2 + Registry.create() + mocked_application = MagicMock() + Registry().register('application', mocked_application) + vlc_player = VlcPlayer(None) + + # WHEN: media_state_wait() is called + result = vlc_player.media_state_wait(mocked_display, 2) + + # THEN: The results should be True + self.assertTrue(result) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) + def media_state_wait_error_test(self, mocked_get_vlc): + """ + Check that getting an error when waiting for a state change returns False + """ + # GIVEN: A mocked out get_vlc method + mocked_vlc = MagicMock() + mocked_vlc.State.Error = 1 + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.vlc_media.get_state.return_value = 1 + Registry.create() + mocked_application = MagicMock() + Registry().register('application', mocked_application) + vlc_player = VlcPlayer(None) + + # WHEN: media_state_wait() is called + result = vlc_player.media_state_wait(mocked_display, 2) + + # THEN: The results should be True + self.assertFalse(result) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) + def media_state_wait_times_out_test(self, mocked_get_vlc): + """ + Check that waiting for a state returns False when it times out after 60 seconds + """ + # GIVEN: A mocked out get_vlc method + timeout = MockDateTime._return_values[0] + timedelta(seconds=61) + MockDateTime._return_values.append(timeout) + mocked_vlc = MagicMock() + mocked_vlc.State.Error = 1 + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.vlc_media.get_state.return_value = 2 + Registry.create() + mocked_application = MagicMock() + Registry().register('application', mocked_application) + vlc_player = VlcPlayer(None) + + # WHEN: media_state_wait() is called + result = vlc_player.media_state_wait(mocked_display, 3) + + # THEN: The results should be True + self.assertFalse(result) + def resize_test(self): """ Test resizing the player """ # GIVEN: A display object and a VlcPlayer instance - display = MagicMock() - display.size.return_value = (10, 10) + mocked_display = MagicMock() + mocked_display.size.return_value = (10, 10) vlc_player = VlcPlayer(None) # WHEN: resize is called - vlc_player.resize(display) + vlc_player.resize(mocked_display) # THEN: The right methods should have been called - display.size.assert_called_with() - display.vlc_widget.resize.assert_called_with((10, 10)) + mocked_display.size.assert_called_with() + mocked_display.vlc_widget.resize.assert_called_with((10, 10)) @patch('openlp.core.ui.media.vlcplayer.threading') def stop_test(self, mocked_threading): @@ -316,12 +411,12 @@ class TestVLCPlayer(TestCase): mocked_thread = MagicMock() mocked_threading.Thread.return_value = mocked_thread mocked_stop = MagicMock() - display = MagicMock() - display.vlc_media_player.stop = mocked_stop + mocked_display = MagicMock() + mocked_display.vlc_media_player.stop = mocked_stop vlc_player = VlcPlayer(None) # WHEN: stop is called - vlc_player.stop(display) + vlc_player.stop(mocked_display) # THEN: A thread should have been started to stop VLC mocked_threading.Thread.assert_called_with(target=mocked_stop) @@ -333,30 +428,30 @@ class TestVLCPlayer(TestCase): Test setting the volume """ # GIVEN: A display object and a VlcPlayer instance - display = MagicMock() - display.has_audio = True + mocked_display = MagicMock() + mocked_display.has_audio = True vlc_player = VlcPlayer(None) # WHEN: The volume is set - vlc_player.volume(display, 10) + vlc_player.volume(mocked_display, 10) # THEN: The volume should have been set - display.vlc_media_player.audio_set_volume.assert_called_with(10) + mocked_display.vlc_media_player.audio_set_volume.assert_called_with(10) def volume_no_audio_test(self): """ Test setting the volume when there's no audio """ # GIVEN: A display object and a VlcPlayer instance - display = MagicMock() - display.has_audio = False + mocked_display = MagicMock() + mocked_display.has_audio = False vlc_player = VlcPlayer(None) # WHEN: The volume is set - vlc_player.volume(display, 10) + vlc_player.volume(mocked_display, 10) # THEN: The volume should NOT have been set - self.assertEqual(0, display.vlc_media_player.audio_set_volume.call_count) + self.assertEqual(0, mocked_display.vlc_media_player.audio_set_volume.call_count) @patch('openlp.core.ui.media.vlcplayer.is_macosx') def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): diff --git a/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py b/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py index 7f05eaa9b..0fc66d1cb 100644 --- a/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py +++ b/tests/interfaces/openlp_plugins/media/forms/test_mediaclipselectorform.py @@ -25,9 +25,9 @@ Module to test the MediaClipSelectorForm. import os from unittest import TestCase, SkipTest -from openlp.core.ui.media.vlcplayer import VLC_AVAILABLE +from openlp.core.ui.media.vlcplayer import get_vlc -if os.name == 'nt' and not VLC_AVAILABLE: +if os.name == 'nt' and not get_vlc(): raise SkipTest('Windows without VLC, skipping this test since it cannot run without vlc') from PyQt4 import QtGui, QtTest, QtCore From 9232e75582be21fcfb215e9704a811bb4ed39ff2 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 1 May 2015 15:05:38 +0200 Subject: [PATCH 08/19] Add tests around pausing --- .../openlp_core_ui_media/test_vlcplayer.py | 80 +++++++++++++++++-- 1 file changed, 75 insertions(+), 5 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index f520c3da5..a42624a19 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -37,13 +37,13 @@ from tests.helpers.testmixin import TestMixin class MockDateTime(object): _return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] - _counter = 0 - + _counter = 0 + @classmethod def _revert(cls): cls._return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] - cls._counter = 0 - + cls._counter = 0 + @classmethod def now(cls): print('%s, %s' % (len(cls._return_values), cls._counter)) @@ -368,7 +368,7 @@ class TestVLCPlayer(TestCase, TestMixin): Check that waiting for a state returns False when it times out after 60 seconds """ # GIVEN: A mocked out get_vlc method - timeout = MockDateTime._return_values[0] + timedelta(seconds=61) + timeout = MockDateTime._return_values[0] + timedelta(seconds=61) MockDateTime._return_values.append(timeout) mocked_vlc = MagicMock() mocked_vlc.State.Error = 1 @@ -402,6 +402,76 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_display.size.assert_called_with() mocked_display.vlc_widget.resize.assert_called_with((10, 10)) + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def pause_test(self, mocked_get_vlc): + """ + Test that the pause method works correctly + """ + # GIVEN: A mocked out get_vlc method + mocked_vlc = MagicMock() + mocked_vlc.State.Playing = 1 + mocked_vlc.State.Paused = 2 + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.vlc_media.get_state.return_value = 1 + vlc_player = VlcPlayer(None) + + # WHEN: The media is paused + with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + mocked_media_state_wait.return_value = True + vlc_player.pause(mocked_display) + + # THEN: The pause method should exit early + mocked_display.vlc_media.get_state.assert_called_with() + mocked_display.vlc_media_player.pause.assert_called_with() + mocked_media_state_wait.assert_called_with(mocked_display, 2) + self.assertEqual(MediaState.Paused, vlc_player.state) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def pause_not_playing_test(self, mocked_get_vlc): + """ + Test the pause method when the player is not playing + """ + # GIVEN: A mocked out get_vlc method + mocked_vlc = MagicMock() + mocked_vlc.State.Playing = 1 + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.vlc_media.get_state.return_value = 2 + vlc_player = VlcPlayer(None) + + # WHEN: The media is paused + vlc_player.pause(mocked_display) + + # THEN: The pause method should exit early + mocked_display.vlc_media.get_state.assert_called_with() + self.assertEqual(0, mocked_display.vlc_media_player.pause.call_count) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def pause_fail_test(self, mocked_get_vlc): + """ + Test the pause method when the player fails to pause the media + """ + # GIVEN: A mocked out get_vlc method + mocked_vlc = MagicMock() + mocked_vlc.State.Playing = 1 + mocked_vlc.State.Paused = 2 + mocked_get_vlc.return_value = mocked_vlc + mocked_display = MagicMock() + mocked_display.vlc_media.get_state.return_value = 1 + vlc_player = VlcPlayer(None) + + # WHEN: The media is paused + with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + mocked_media_state_wait.return_value = False + vlc_player.pause(mocked_display) + + # THEN: The pause method should exit early + mocked_display.vlc_media.get_state.assert_called_with() + mocked_display.vlc_media_player.pause.assert_called_with() + mocked_media_state_wait.assert_called_with(mocked_display, 2) + self.assertNotEqual(MediaState.Paused, vlc_player.state) + @patch('openlp.core.ui.media.vlcplayer.threading') def stop_test(self, mocked_threading): """ From f5b883d40b71daf8a0c4dfb7b7690df0329aa144 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 1 May 2015 17:05:42 +0200 Subject: [PATCH 09/19] Add tests around seeking --- .../openlp_core_ui_media/test_vlcplayer.py | 149 +++++++++++------- tests/helpers/__init__.py | 20 +++ 2 files changed, 116 insertions(+), 53 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index a42624a19..555dc9000 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -28,33 +28,14 @@ from datetime import datetime, timedelta from unittest import TestCase from openlp.core.common import Registry -from openlp.core.ui.media import MediaState +from openlp.core.ui.media import MediaState, MediaType from openlp.core.ui.media.vlcplayer import AUDIO_EXT, VIDEO_EXT, VlcPlayer, get_vlc from tests.functional import MagicMock, patch +from tests.helpers import MockDateTime from tests.helpers.testmixin import TestMixin -class MockDateTime(object): - _return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] - _counter = 0 - - @classmethod - def _revert(cls): - cls._return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] - cls._counter = 0 - - @classmethod - def now(cls): - print('%s, %s' % (len(cls._return_values), cls._counter)) - if len(cls._return_values) > cls._counter: - mocked_datetime = cls._return_values[cls._counter] - else: - mocked_datetime = cls._return_values[-1] - cls._counter += 1 - return mocked_datetime - - class TestVLCPlayer(TestCase, TestMixin): """ Test the functions in the :mod:`vlcplayer` module. @@ -67,7 +48,43 @@ class TestVLCPlayer(TestCase, TestMixin): del os.environ['VLC_PLUGIN_PATH'] if 'openlp.core.ui.media.vendor.vlc' in sys.modules: del sys.modules['openlp.core.ui.media.vendor.vlc'] - MockDateTime._revert() + MockDateTime.revert() + + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): + """ + Test that on OS X we set the VLC plugin path to fix a bug in the VLC module + """ + # GIVEN: We're on OS X and we don't have the VLC plugin path set + mocked_is_macosx.return_value = True + + # WHEN: An checking if the player is available + get_vlc() + + # THEN: The extra environment variable should be there + self.assertIn('VLC_PLUGIN_PATH', os.environ, + 'The plugin path should be in the environment variables') + self.assertEqual('/Applications/VLC.app/Contents/MacOS/plugins', os.environ['VLC_PLUGIN_PATH']) + + @patch.dict(os.environ) + @patch('openlp.core.ui.media.vlcplayer.is_macosx') + def not_osx_fix_vlc_22_plugin_path_test(self, mocked_is_macosx): + """ + Test that on Linux or some other non-OS X we do not set the VLC plugin path + """ + # GIVEN: We're not on OS X and we don't have the VLC plugin path set + mocked_is_macosx.return_value = False + if 'VLC_PLUGIN_PATH' in os.environ: + del os.environ['VLC_PLUGIN_PATH'] + if 'openlp.core.ui.media.vendor.vlc' in sys.modules: + del sys.modules['openlp.core.ui.media.vendor.vlc'] + + # WHEN: An checking if the player is available + get_vlc() + + # THEN: The extra environment variable should NOT be there + self.assertNotIn('VLC_PLUGIN_PATH', os.environ, + 'The plugin path should NOT be in the environment variables') def init_test(self): """ @@ -368,8 +385,8 @@ class TestVLCPlayer(TestCase, TestMixin): Check that waiting for a state returns False when it times out after 60 seconds """ # GIVEN: A mocked out get_vlc method - timeout = MockDateTime._return_values[0] + timedelta(seconds=61) - MockDateTime._return_values.append(timeout) + timeout = MockDateTime.return_values[0] + timedelta(seconds=61) + MockDateTime.return_values.append(timeout) mocked_vlc = MagicMock() mocked_vlc.State.Error = 1 mocked_get_vlc.return_value = mocked_vlc @@ -523,39 +540,65 @@ class TestVLCPlayer(TestCase, TestMixin): # THEN: The volume should NOT have been set self.assertEqual(0, mocked_display.vlc_media_player.audio_set_volume.call_count) - @patch('openlp.core.ui.media.vlcplayer.is_macosx') - def fix_vlc_22_plugin_path_test(self, mocked_is_macosx): + ''' + def seek(self, display, seek_value): """ - Test that on OS X we set the VLC plugin path to fix a bug in the VLC module + Go to a particular position """ - # GIVEN: We're on OS X and we don't have the VLC plugin path set - mocked_is_macosx.return_value = True - - # WHEN: An checking if the player is available - get_vlc() - - # THEN: The extra environment variable should be there - self.assertIn('VLC_PLUGIN_PATH', os.environ, - 'The plugin path should be in the environment variables') - self.assertEqual('/Applications/VLC.app/Contents/MacOS/plugins', os.environ['VLC_PLUGIN_PATH']) - - @patch.dict(os.environ) - @patch('openlp.core.ui.media.vlcplayer.is_macosx') - def not_osx_fix_vlc_22_plugin_path_test(self, mocked_is_macosx): + if display.controller.media_info.media_type == MediaType.CD \ + or display.controller.media_info.media_type == MediaType.DVD: + seek_value += int(display.controller.media_info.start_time * 1000) + if display.vlc_media_player.is_seekable(): + display.vlc_media_player.set_time(seek_value) + ''' + def seek_unseekable_media_test(self): """ - Test that on Linux or some other non-OS X we do not set the VLC plugin path + Test seeking something that can't be seeked """ - # GIVEN: We're not on OS X and we don't have the VLC plugin path set - mocked_is_macosx.return_value = False - if 'VLC_PLUGIN_PATH' in os.environ: - del os.environ['VLC_PLUGIN_PATH'] - if 'openlp.core.ui.media.vendor.vlc' in sys.modules: - del sys.modules['openlp.core.ui.media.vendor.vlc'] + # GIVEN: Unseekable media + mocked_display = MagicMock() + mocked_display.controller.media_info.media_type = MediaType.Audio + mocked_display.vlc_media_player.is_seekable.return_value = False + vlc_player = VlcPlayer(None) - # WHEN: An checking if the player is available - get_vlc() + # WHEN: seek() is called + vlc_player.seek(mocked_display, 100) - # THEN: The extra environment variable should NOT be there - self.assertNotIn('VLC_PLUGIN_PATH', os.environ, - 'The plugin path should NOT be in the environment variables') + # THEN: nothing should happen + mocked_display.vlc_media_player.is_seekable.assert_called_with() + self.assertEqual(0, mocked_display.vlc_media_player.set_time.call_count) + def seek_seekable_media_test(self): + """ + Test seeking something that is seekable, but not a DVD + """ + # GIVEN: Unseekable media + mocked_display = MagicMock() + mocked_display.controller.media_info.media_type = MediaType.Audio + mocked_display.vlc_media_player.is_seekable.return_value = True + vlc_player = VlcPlayer(None) + + # WHEN: seek() is called + vlc_player.seek(mocked_display, 100) + + # THEN: nothing should happen + mocked_display.vlc_media_player.is_seekable.assert_called_with() + mocked_display.vlc_media_player.set_time.assert_called_with(100) + + def seek_dvd_test(self): + """ + Test seeking a DVD + """ + # GIVEN: Unseekable media + mocked_display = MagicMock() + mocked_display.controller.media_info.media_type = MediaType.DVD + mocked_display.vlc_media_player.is_seekable.return_value = True + mocked_display.controller.media_info.start_time = 3 + vlc_player = VlcPlayer(None) + + # WHEN: seek() is called + vlc_player.seek(mocked_display, 2000) + + # THEN: nothing should happen + mocked_display.vlc_media_player.is_seekable.assert_called_with() + mocked_display.vlc_media_player.set_time.assert_called_with(5000) diff --git a/tests/helpers/__init__.py b/tests/helpers/__init__.py index 072f42291..edf3104b5 100644 --- a/tests/helpers/__init__.py +++ b/tests/helpers/__init__.py @@ -22,3 +22,23 @@ """ The :mod:`~tests.helpers` module provides helper classes for use in the tests. """ +from datetime import datetime + + +class MockDateTime(object): + return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] + call_counter = 0 + + @classmethod + def revert(cls): + cls.return_values = [datetime(2015, 4, 15, 18, 35, 21, 0)] + cls.call_counter = 0 + + @classmethod + def now(cls): + if len(cls.return_values) > cls.call_counter: + mocked_datetime = cls.return_values[cls.call_counter] + else: + mocked_datetime = cls.return_values[-1] + cls.call_counter += 1 + return mocked_datetime From f5301cc9f228dc8c39a732e37952f102a941c41c Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 1 May 2015 17:09:32 +0200 Subject: [PATCH 10/19] Add a test around reset --- .../openlp_core_ui_media/test_vlcplayer.py | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 555dc9000..6dc98b464 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -540,17 +540,6 @@ class TestVLCPlayer(TestCase, TestMixin): # THEN: The volume should NOT have been set self.assertEqual(0, mocked_display.vlc_media_player.audio_set_volume.call_count) - ''' - def seek(self, display, seek_value): - """ - Go to a particular position - """ - if display.controller.media_info.media_type == MediaType.CD \ - or display.controller.media_info.media_type == MediaType.DVD: - seek_value += int(display.controller.media_info.start_time * 1000) - if display.vlc_media_player.is_seekable(): - display.vlc_media_player.set_time(seek_value) - ''' def seek_unseekable_media_test(self): """ Test seeking something that can't be seeked @@ -602,3 +591,19 @@ class TestVLCPlayer(TestCase, TestMixin): # THEN: nothing should happen mocked_display.vlc_media_player.is_seekable.assert_called_with() mocked_display.vlc_media_player.set_time.assert_called_with(5000) + + def reset_test(self): + """ + Test the reset() method + """ + # GIVEN: Some mocked out stuff + mocked_display = MagicMock() + vlc_player = VlcPlayer(None) + + # WHEN: reset() is called + vlc_player.reset(mocked_display) + + # THEN: The media should be stopped and invsibile + mocked_display.vlc_media_player.stop.assert_called_with() + mocked_display.vlc_widget.setVisible.assert_called_with(False) + self.assertEqual(MediaState.Off, vlc_player.state) From 6126546977e61940a1a086519d85bea691e1ec8c Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 1 May 2015 17:15:14 +0200 Subject: [PATCH 11/19] Add tests around set_visible --- .../openlp_core_ui_media/test_vlcplayer.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 6dc98b464..4862ae18f 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -607,3 +607,33 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_display.vlc_media_player.stop.assert_called_with() mocked_display.vlc_widget.setVisible.assert_called_with(False) self.assertEqual(MediaState.Off, vlc_player.state) + + def set_visible_has_own_widget_test(self): + """ + Test the set_visible() method when the player has its own widget + """ + # GIVEN: Some mocked out stuff + mocked_display = MagicMock() + vlc_player = VlcPlayer(None) + vlc_player.has_own_widget = True + + # WHEN: reset() is called + vlc_player.set_visible(mocked_display, True) + + # THEN: The media should be stopped and invsibile + mocked_display.vlc_widget.setVisible.assert_called_with(True) + + def set_visible_no_widget_test(self): + """ + Test the set_visible() method when the player doesn't have a widget + """ + # GIVEN: Some mocked out stuff + mocked_display = MagicMock() + vlc_player = VlcPlayer(None) + vlc_player.has_own_widget = False + + # WHEN: reset() is called + vlc_player.set_visible(mocked_display, True) + + # THEN: The media should be stopped and invsibile + self.assertEqual(0, mocked_display.vlc_widget.setVisible.call_count) From fea79cf7dcbd3ada2f26c10cf320d7f31aae7a0f Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 1 May 2015 17:56:16 +0200 Subject: [PATCH 12/19] Add a test for get_info() --- .../openlp_core_ui_media/test_vlcplayer.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 4862ae18f..3bc818f91 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -637,3 +637,20 @@ class TestVLCPlayer(TestCase, TestMixin): # THEN: The media should be stopped and invsibile self.assertEqual(0, mocked_display.vlc_widget.setVisible.call_count) + + @patch('openlp.core.ui.media.vlcplayer.translate') + def get_info_test(self, mocked_translate): + """ + Test that get_info() returns some information about the VLC player + """ + # GIVEN: A VlcPlayer + mocked_translate.side_effect = lambda *x: x[1] + vlc_player = VlcPlayer(None) + + # WHEN: get_info() is run + info = vlc_player.get_info() + + # THEN: The information should be correct + self.assertEqual('VLC is an external player which supports a number of different formats.
' + 'Audio
' + str(AUDIO_EXT) + '
Video
' + + str(VIDEO_EXT) + '
', info) From 35d722f87276b4a22dfd87e23851f5a5d77e1746 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 1 May 2015 22:00:52 +0200 Subject: [PATCH 13/19] WIP: load tests --- .../openlp_core_ui_media/test_vlcplayer.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 3bc818f91..b9eac36fd 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -332,6 +332,85 @@ class TestVLCPlayer(TestCase, TestMixin): # THEN: VLC should NOT be available self.assertFalse(is_available) + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') + def load_test(self, mocked_normcase, mocked_get_vlc): + """ + Test loading a video into VLC + """ + # GIVEN: A mocked out get_vlc() method + media_path = '/path/to/media.mp4' + mocked_normcase.side_effect = lambda x: x + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.volume = 100 + mocked_controller.media_info.media_type = MediaType.Video + mocked_controller.media_info.file_info.absoluteFilePath.return_value = media_path + mocked_vlc_media = MagicMock() + mocked_media = MagicMock() + mocked_media.get_duration.return_value = 10000 + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + mocked_display.vlc_instance.media_new_path.return_value = mocked_vlc_media + mocked_display.vlc_media_player.get_media.return_value = mocked_media + vlc_player = VlcPlayer(None) + + # WHEN: A video is loaded into VLC + with patch.object(vlc_player, 'volume') as mocked_volume: + result = vlc_player.load(mocked_display) + + # THEN: The video should be loaded + mocked_normcase.assert_called_with(media_path) + mocked_display.vlc_instance.media_new_path.assert_called_with(media_path) + self.assertEqual(mocked_vlc_media, mocked_display.vlc_media) + mocked_display.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) + mocked_vlc_media.parse.assert_called_with() + mocked_volume.assert_called_with(mocked_display, 100) + self.assertEqual(10, mocked_controller.media_info.length) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') + def load_audio_cd_test(self, mocked_normcase, mocked_get_vlc): + """ + Test loading an audio CD into VLC + """ + # GIVEN: A mocked out get_vlc() method + media_path = '/dev/sr0' + mocked_normcase.side_effect = lambda x: x + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.volume = 100 + mocked_controller.media_info.media_type = MediaType.CD + mocked_controller.media_info.file_info.absoluteFilePath.return_value = media_path + mocked_controller.media_info.title_track = 1 + mocked_vlc_media = MagicMock() + mocked_media = MagicMock() + mocked_media.get_duration.return_value = 10000 + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + mocked_display.vlc_instance.media_new_location.return_value = mocked_vlc_media + mocked_display.vlc_media_player.get_media.return_value = mocked_media + mocked_subitems = MagicMock() + mocked_subitems.count.return_value = 1 + mocked_subitems.item_at_index.return_value = mocked_vlc_media + mocked_display.vlc_media.subitems.return_value = mocked_subitems + vlc_player = VlcPlayer(None) + + # WHEN: A video is loaded into VLC + with patch.object(vlc_player, 'volume') as mocked_volume: + result = vlc_player.load(mocked_display) + + # THEN: The video should be loaded + mocked_normcase.assert_called_with(media_path) + mocked_display.vlc_instance.media_new_path.assert_called_with(media_path) + self.assertEqual(mocked_vlc_media, mocked_display.vlc_media) + mocked_display.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) + mocked_vlc_media.parse.assert_called_with() + mocked_volume.assert_called_with(mocked_display, 100) + self.assertEqual(10, mocked_controller.media_info.length) + @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) def media_state_wait_test(self, mocked_get_vlc): From 822912e0a68a50d7e3faf8247f47e1d67e279ec8 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 2 May 2015 22:36:07 +0200 Subject: [PATCH 14/19] load tests --- .../openlp_core_ui_media/test_vlcplayer.py | 100 +++++++++++++++++- 1 file changed, 96 insertions(+), 4 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index b9eac36fd..e36ca95bd 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -368,6 +368,7 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_vlc_media.parse.assert_called_with() mocked_volume.assert_called_with(mocked_display, 100) self.assertEqual(10, mocked_controller.media_info.length) + self.assertTrue(result) @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') @@ -395,21 +396,112 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_subitems = MagicMock() mocked_subitems.count.return_value = 1 mocked_subitems.item_at_index.return_value = mocked_vlc_media - mocked_display.vlc_media.subitems.return_value = mocked_subitems + mocked_vlc_media.subitems.return_value = mocked_subitems vlc_player = VlcPlayer(None) - # WHEN: A video is loaded into VLC - with patch.object(vlc_player, 'volume') as mocked_volume: + # WHEN: An audio CD is loaded into VLC + with patch.object(vlc_player, 'volume') as mocked_volume, \ + patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: result = vlc_player.load(mocked_display) # THEN: The video should be loaded mocked_normcase.assert_called_with(media_path) - mocked_display.vlc_instance.media_new_path.assert_called_with(media_path) + mocked_display.vlc_instance.media_new_location.assert_called_with('cdda://' + media_path) self.assertEqual(mocked_vlc_media, mocked_display.vlc_media) mocked_display.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) mocked_vlc_media.parse.assert_called_with() mocked_volume.assert_called_with(mocked_display, 100) self.assertEqual(10, mocked_controller.media_info.length) + self.assertTrue(result) + + @patch('openlp.core.ui.media.vlcplayer.is_win') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') + def load_audio_cd_on_windows_test(self, mocked_normcase, mocked_get_vlc, mocked_is_win): + """ + Test loading an audio CD into VLC on Windows + """ + # GIVEN: A mocked out get_vlc() method + mocked_is_win.return_value = True + media_path = '/dev/sr0' + mocked_normcase.side_effect = lambda x: x + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.volume = 100 + mocked_controller.media_info.media_type = MediaType.CD + mocked_controller.media_info.file_info.absoluteFilePath.return_value = media_path + mocked_controller.media_info.title_track = 1 + mocked_vlc_media = MagicMock() + mocked_media = MagicMock() + mocked_media.get_duration.return_value = 10000 + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + mocked_display.vlc_instance.media_new_location.return_value = mocked_vlc_media + mocked_display.vlc_media_player.get_media.return_value = mocked_media + mocked_subitems = MagicMock() + mocked_subitems.count.return_value = 1 + mocked_subitems.item_at_index.return_value = mocked_vlc_media + mocked_vlc_media.subitems.return_value = mocked_subitems + vlc_player = VlcPlayer(None) + + # WHEN: An audio CD is loaded into VLC + with patch.object(vlc_player, 'volume') as mocked_volume, \ + patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + result = vlc_player.load(mocked_display) + + # THEN: The video should be loaded + mocked_normcase.assert_called_with(media_path) + mocked_display.vlc_instance.media_new_location.assert_called_with('cdda:///' + media_path) + self.assertEqual(mocked_vlc_media, mocked_display.vlc_media) + mocked_display.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) + mocked_vlc_media.parse.assert_called_with() + mocked_volume.assert_called_with(mocked_display, 100) + self.assertEqual(10, mocked_controller.media_info.length) + self.assertTrue(result) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') + def load_audio_cd_no_tracks_test(self, mocked_normcase, mocked_get_vlc): + """ + Test loading an audio CD that has no tracks into VLC + """ + # GIVEN: A mocked out get_vlc() method + media_path = '/dev/sr0' + mocked_normcase.side_effect = lambda x: x + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.volume = 100 + mocked_controller.media_info.media_type = MediaType.CD + mocked_controller.media_info.file_info.absoluteFilePath.return_value = media_path + mocked_controller.media_info.title_track = 1 + mocked_vlc_media = MagicMock() + mocked_media = MagicMock() + mocked_media.get_duration.return_value = 10000 + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + mocked_display.vlc_instance.media_new_location.return_value = mocked_vlc_media + mocked_display.vlc_media_player.get_media.return_value = mocked_media + mocked_subitems = MagicMock() + mocked_subitems.count.return_value = 0 + mocked_subitems.item_at_index.return_value = mocked_vlc_media + mocked_vlc_media.subitems.return_value = mocked_subitems + vlc_player = VlcPlayer(None) + + # WHEN: An audio CD is loaded into VLC + with patch.object(vlc_player, 'volume') as mocked_volume, \ + patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait: + result = vlc_player.load(mocked_display) + + # THEN: The video should be loaded + mocked_normcase.assert_called_with(media_path) + mocked_display.vlc_instance.media_new_location.assert_called_with('cdda://' + media_path) + self.assertEqual(mocked_vlc_media, mocked_display.vlc_media) + self.assertEqual(0, mocked_subitems.item_at_index.call_count) + mocked_display.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) + self.assertEqual(0, mocked_vlc_media.parse.call_count) + self.assertFalse(result) @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) From 4ae8250f77b800b0295821b02d358b3aa8dfe06a Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 2 May 2015 23:15:50 +0200 Subject: [PATCH 15/19] Update UI tests --- .../openlp_core_ui_media/test_vlcplayer.py | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index e36ca95bd..cb42bdbb4 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -31,7 +31,7 @@ from openlp.core.common import Registry from openlp.core.ui.media import MediaState, MediaType from openlp.core.ui.media.vlcplayer import AUDIO_EXT, VIDEO_EXT, VlcPlayer, get_vlc -from tests.functional import MagicMock, patch +from tests.functional import MagicMock, patch, call from tests.helpers import MockDateTime from tests.helpers.testmixin import TestMixin @@ -809,6 +809,72 @@ class TestVLCPlayer(TestCase, TestMixin): # THEN: The media should be stopped and invsibile self.assertEqual(0, mocked_display.vlc_widget.setVisible.call_count) + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def update_ui_test(self, mocked_get_vlc): + """ + Test updating the UI + """ + # GIVEN: A whole bunch of mocks + mocked_vlc = MagicMock() + mocked_vlc.State.Ended = 1 + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.end_time = 300 + mocked_controller.seek_slider.isSliderDown.return_value = False + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + mocked_display.vlc_media.get_state.return_value = 1 + mocked_display.vlc_media_player.get_time.return_value = 400000 + vlc_player = VlcPlayer(None) + + # WHEN: update_ui() is called + with patch.object(vlc_player, 'stop') as mocked_stop, \ + patch.object(vlc_player, 'set_visible') as mocked_set_visible: + vlc_player.update_ui(mocked_display) + + # THEN: Certain methods should be called + mocked_stop.assert_called_with(mocked_display) + self.assertEqual(2, mocked_stop.call_count) + mocked_display.vlc_media_player.get_time.assert_called_with() + mocked_set_visible.assert_called_with(mocked_display, False) + mocked_controller.seek_slider.setSliderPosition.assert_called_with(400000) + expected_calls = [call(True), call(False)] + self.assertEqual(expected_calls, mocked_controller.seek_slider.blockSignals.call_args_list) + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def update_ui_dvd_test(self, mocked_get_vlc): + """ + Test updating the UI for a CD or DVD + """ + # GIVEN: A whole bunch of mocks + mocked_vlc = MagicMock() + mocked_vlc.State.Ended = 1 + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.start_time = 100 + mocked_controller.media_info.end_time = 300 + mocked_controller.seek_slider.isSliderDown.return_value = False + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + mocked_display.vlc_media.get_state.return_value = 1 + mocked_display.vlc_media_player.get_time.return_value = 400000 + mocked_display.controller.media_info.media_type = MediaType.DVD + vlc_player = VlcPlayer(None) + + # WHEN: update_ui() is called + with patch.object(vlc_player, 'stop') as mocked_stop, \ + patch.object(vlc_player, 'set_visible') as mocked_set_visible: + vlc_player.update_ui(mocked_display) + + # THEN: Certain methods should be called + mocked_stop.assert_called_with(mocked_display) + self.assertEqual(2, mocked_stop.call_count) + mocked_display.vlc_media_player.get_time.assert_called_with() + mocked_set_visible.assert_called_with(mocked_display, False) + mocked_controller.seek_slider.setSliderPosition.assert_called_with(300000) + expected_calls = [call(True), call(False)] + self.assertEqual(expected_calls, mocked_controller.seek_slider.blockSignals.call_args_list) + @patch('openlp.core.ui.media.vlcplayer.translate') def get_info_test(self, mocked_translate): """ From 4bd385b902d33c63d366b0713d4e5a63aa22467e Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 3 May 2015 00:17:33 +0200 Subject: [PATCH 16/19] WIP: play test --- .../openlp_core_ui_media/test_vlcplayer.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index cb42bdbb4..7e648ffc3 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -590,6 +590,30 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_display.size.assert_called_with() mocked_display.vlc_widget.resize.assert_called_with((10, 10)) + @patch('openlp.core.ui.media.vlcplayer.threading') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def play_test(self, mocked_get_vlc, mocked_threading): + """ + Test the play() method + """ + # GIVEN: A bunch of mocked out things + mocked_thread = MagicMock() + mocked_threading.Thread.return_value = mocked_thread + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.start_time = 0 + mocked_display = MagicMock() + mocked_dispaly.controller = mocked_controller + vlc_player = VlcPlayer(None) + vlc_player.state = MediaState.Paused + + # WHEN: play() is called + vlc_player.play(mocked_display) + + # THEN: A bunch of things should happen to play the media + + @patch('openlp.core.ui.media.vlcplayer.get_vlc') def pause_test(self, mocked_get_vlc): """ From 08639493ee1f8162e39a2575ab62288e588d7170 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 5 May 2015 21:47:38 +0200 Subject: [PATCH 17/19] Initial stab at a test around the play() method --- .../openlp_core_ui_media/test_vlcplayer.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 7e648ffc3..5625b8543 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -603,16 +603,30 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_get_vlc.return_value = mocked_vlc mocked_controller = MagicMock() mocked_controller.media_info.start_time = 0 + mocked_controller.media_info.media_type = MediaType.Video + mocked_controller.media_info.volume = 100 + mocked_media = MagicMock() + mocked_media.get_duration.return_value = 50000 mocked_display = MagicMock() - mocked_dispaly.controller = mocked_controller + mocked_display.controller = mocked_controller + mocked_display.vlc_media_player.get_media.return_value = mocked_media vlc_player = VlcPlayer(None) vlc_player.state = MediaState.Paused # WHEN: play() is called - vlc_player.play(mocked_display) + with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait, \ + patch.object(vlc_player, 'volume') as mocked_volume: + mocked_media_state_wait.return_value = True + result = vlc_player.play(mocked_display) # THEN: A bunch of things should happen to play the media - + mocked_thread.start.assert_called_with() + self.assertEqual(50, mocked_controller.media_info.length) + mocked_volume.assert_called_with(mocked_display, 100) + mocked_controller.seek_slider.setMaximum.assert_called_with(50000) + self.assertEqual(MediaState.Playing, vlc_player.state) + mocked_display.vlc_widget.raise_.assert_called_with() + self.assertTrue(result, 'The value returned from play() should be True') @patch('openlp.core.ui.media.vlcplayer.get_vlc') def pause_test(self, mocked_get_vlc): From 167fd6cf4562279e0dbe5f7c1ec27f1eec813796 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 7 May 2015 18:44:55 +0200 Subject: [PATCH 18/19] Play tests pretty much done --- .../openlp_core_ui_media/test_vlcplayer.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 5625b8543..61b9dabac 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -628,6 +628,77 @@ class TestVLCPlayer(TestCase, TestMixin): mocked_display.vlc_widget.raise_.assert_called_with() self.assertTrue(result, 'The value returned from play() should be True') + @patch('openlp.core.ui.media.vlcplayer.threading') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def play_media_wait_state_not_playing_test(self, mocked_get_vlc, mocked_threading): + """ + Test the play() method when media_wait_state() returns False + """ + # GIVEN: A bunch of mocked out things + mocked_thread = MagicMock() + mocked_threading.Thread.return_value = mocked_thread + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.start_time = 0 + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + vlc_player = VlcPlayer(None) + vlc_player.state = MediaState.Paused + + # WHEN: play() is called + with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait, \ + patch.object(vlc_player, 'volume') as mocked_volume: + mocked_media_state_wait.return_value = False + result = vlc_player.play(mocked_display) + + # THEN: A thread should be started, but the method should return False + mocked_thread.start.assert_called_with() + self.assertFalse(result) + + @patch('openlp.core.ui.media.vlcplayer.threading') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') + def play_dvd_test(self, mocked_get_vlc, mocked_threading): + """ + Test the play() method with a DVD + """ + # GIVEN: A bunch of mocked out things + mocked_thread = MagicMock() + mocked_threading.Thread.return_value = mocked_thread + mocked_vlc = MagicMock() + mocked_get_vlc.return_value = mocked_vlc + mocked_controller = MagicMock() + mocked_controller.media_info.start_time = 0 + mocked_controller.media_info.end_time = 50 + mocked_controller.media_info.media_type = MediaType.DVD + mocked_controller.media_info.volume = 100 + mocked_controller.media_info.title_track = 1 + mocked_controller.media_info.audio_track = 1 + mocked_controller.media_info.subtitle_track = 1 + mocked_display = MagicMock() + mocked_display.controller = mocked_controller + vlc_player = VlcPlayer(None) + vlc_player.state = MediaState.Paused + + # WHEN: play() is called + with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait, \ + patch.object(vlc_player, 'volume') as mocked_volume: + mocked_media_state_wait.return_value = True + result = vlc_player.play(mocked_display) + + # THEN: A bunch of things should happen to play the media + mocked_thread.start.assert_called_with() + mocked_display.vlc_media_player.set_title.assert_called_with(1) + mocked_display.vlc_media_player.play.assert_called_with() + mocked_display.vlc_media_player.audio_set_track.assert_called_with(1) + mocked_display.vlc_media_player.video_set_spu.assert_called_with(1) + self.assertEqual(50, mocked_controller.media_info.length) + mocked_volume.assert_called_with(mocked_display, 100) + mocked_controller.seek_slider.setMaximum.assert_called_with(50000) + self.assertEqual(MediaState.Playing, vlc_player.state) + mocked_display.vlc_widget.raise_.assert_called_with() + self.assertTrue(result, 'The value returned from play() should be True') + @patch('openlp.core.ui.media.vlcplayer.get_vlc') def pause_test(self, mocked_get_vlc): """ From 6d8882d3024b0b56350ce1f3a107753016932c81 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 7 May 2015 23:53:19 +0200 Subject: [PATCH 19/19] Fix up some tests to dodge Windows --- tests/functional/openlp_core_ui_media/test_vlcplayer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/functional/openlp_core_ui_media/test_vlcplayer.py b/tests/functional/openlp_core_ui_media/test_vlcplayer.py index 61b9dabac..eccac6893 100644 --- a/tests/functional/openlp_core_ui_media/test_vlcplayer.py +++ b/tests/functional/openlp_core_ui_media/test_vlcplayer.py @@ -370,13 +370,15 @@ class TestVLCPlayer(TestCase, TestMixin): self.assertEqual(10, mocked_controller.media_info.length) self.assertTrue(result) + @patch('openlp.core.ui.media.vlcplayer.is_win') @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') - def load_audio_cd_test(self, mocked_normcase, mocked_get_vlc): + def load_audio_cd_test(self, mocked_normcase, mocked_get_vlc, mocked_is_win): """ Test loading an audio CD into VLC """ # GIVEN: A mocked out get_vlc() method + mocked_is_win.return_value = False media_path = '/dev/sr0' mocked_normcase.side_effect = lambda x: x mocked_vlc = MagicMock() @@ -460,13 +462,15 @@ class TestVLCPlayer(TestCase, TestMixin): self.assertEqual(10, mocked_controller.media_info.length) self.assertTrue(result) + @patch('openlp.core.ui.media.vlcplayer.is_win') @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') - def load_audio_cd_no_tracks_test(self, mocked_normcase, mocked_get_vlc): + def load_audio_cd_no_tracks_test(self, mocked_normcase, mocked_get_vlc, mocked_is_win): """ Test loading an audio CD that has no tracks into VLC """ # GIVEN: A mocked out get_vlc() method + mocked_is_win.return_value = False media_path = '/dev/sr0' mocked_normcase.side_effect = lambda x: x mocked_vlc = MagicMock()