# -*- coding: utf-8 -*- ########################################################################## # OpenLP - Open Source Lyrics Projection # # ---------------------------------------------------------------------- # # Copyright (c) 2008-2022 OpenLP Developers # # ---------------------------------------------------------------------- # # 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 Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # ########################################################################## """ Package to test the openlp.core.ui.media.vlcplayer package. """ import os import sys import pytest from datetime import timedelta from unittest import skipIf from unittest.mock import MagicMock, call, patch, ANY from openlp.core.common import is_macosx from openlp.core.common.registry import Registry from openlp.core.ui.media import ItemMediaInfo, MediaState, MediaType from openlp.core.ui.media.vlcplayer import VlcPlayer, get_vlc from tests.helpers import MockDateTime @pytest.fixture def vlc_env(): """Local test setup""" 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'] yield MockDateTime.revert() @skipIf(is_macosx(), 'Test doesn\'t apply to macOS') @patch.dict(os.environ) @patch('openlp.core.ui.media.vlcplayer.is_macosx') def test_not_osx_fix_vlc_22_plugin_path(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 # WHEN: An checking if the player is available get_vlc() # THEN: The extra environment variable should NOT be there assert 'VLC_PLUGIN_PATH' not in os.environ, 'The plugin path should NOT be in the environment variables' def test_init(mock_settings): """ 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 assert 'VLC' == vlc_player.original_name assert '&VLC' == vlc_player.display_name assert vlc_player.parent is None assert vlc_player.can_folder is True @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.QtWidgets') def test_setup(MockedQtWidgets, mocked_get_vlc, mocked_is_macosx, mocked_is_win, mock_settings): """ 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 mock_settings.value.return_value = '' mocked_qframe = MagicMock() mocked_qframe.winId.return_value = 2 MockedQtWidgets.QFrame.NoFrame = 1 MockedQtWidgets.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_output_display = MagicMock() mocked_controller = MagicMock() mocked_controller.is_live = True mocked_output_display.size.return_value = (10, 10) vlc_player = VlcPlayer(None) # WHEN: setup() is run vlc_player.setup(mocked_output_display, mocked_controller) # THEN: The VLC widget should be set up correctly assert mocked_output_display.vlc_widget == mocked_qframe mocked_qframe.setFrameStyle.assert_called_with(1) mock_settings.value.assert_any_call('advanced/hide mouse') mock_settings.value.assert_any_call('media/vlc arguments') mocked_vlc.Instance.assert_called_with('--no-video-title-show --input-repeat=99999999 ') assert mocked_output_display.vlc_instance == mocked_instance mocked_instance.media_player_new.assert_called_with() assert mocked_output_display.vlc_media_player == mocked_media_player_new mocked_output_display.size.assert_called_with() mocked_qframe.resize.assert_called_with((10, 10)) mocked_qframe.hide.assert_called_with() mocked_media_player_new.set_xwindow.assert_called_with(2) assert vlc_player.has_own_widget is True @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.QtWidgets') def test_setup_has_audio(MockedQtWidgets, mocked_get_vlc, mocked_is_macosx, mocked_is_win, mock_settings): """ 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 mock_settings.value.return_value = '' mocked_qframe = MagicMock() mocked_qframe.winId.return_value = 2 MockedQtWidgets.QFrame.NoFrame = 1 MockedQtWidgets.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_output_display = MagicMock() mocked_controller = MagicMock() mocked_controller.is_live = True mocked_output_display.size.return_value = (10, 10) vlc_player = VlcPlayer(None) # WHEN: setup() is run vlc_player.setup(mocked_output_display, mocked_controller) # THEN: The VLC instance should be created with the correct options mocked_vlc.Instance.assert_called_with('--no-video-title-show --input-repeat=99999999 ') @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.QtWidgets') def test_setup_visible_mouse(MockedQtWidgets, mocked_get_vlc, mocked_is_macosx, mocked_is_win, mock_settings): """ 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 mock_settings.value.return_value = '' mocked_qframe = MagicMock() mocked_qframe.winId.return_value = 2 MockedQtWidgets.QFrame.NoFrame = 1 MockedQtWidgets.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_output_display = MagicMock() mocked_controller = MagicMock() mocked_controller.is_live = True mocked_output_display.size.return_value = (10, 10) vlc_player = VlcPlayer(None) # WHEN: setup() is run vlc_player.setup(mocked_output_display, mocked_controller) # THEN: The VLC instance should be created with the correct options mocked_vlc.Instance.assert_called_with('--no-video-title-show --input-repeat=99999999 ') @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.QtWidgets') def test_setup_windows(MockedQtWidgets, mocked_get_vlc, mocked_is_macosx, mocked_is_win, mock_settings): """ 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 mock_settings.value.return_value = False mocked_qframe = MagicMock() mocked_qframe.winId.return_value = 2 MockedQtWidgets.QFrame.NoFrame = 1 MockedQtWidgets.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_output_display = MagicMock() mocked_controller = MagicMock() mocked_controller.is_live = True mocked_output_display.size.return_value = (10, 10) vlc_player = VlcPlayer(None) # WHEN: setup() is run vlc_player.setup(mocked_output_display, mocked_controller) # THEN: set_hwnd should be called mocked_media_player_new.set_hwnd.assert_called_with(2) @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.QtWidgets') def test_setup_osx(MockedQtWidgets, mocked_get_vlc, mocked_is_macosx, mocked_is_win, mock_settings): """ 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 mock_settings.value.return_value = False mocked_qframe = MagicMock() mocked_qframe.winId.return_value = 2 MockedQtWidgets.QFrame.NoFrame = 1 MockedQtWidgets.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_output_display = MagicMock() mocked_controller = MagicMock() mocked_controller.is_live = True mocked_output_display.size.return_value = (10, 10) vlc_player = VlcPlayer(None) # WHEN: setup() is run vlc_player.setup(mocked_output_display, mocked_controller) # 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 test_check_available(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 assert is_available is True @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_check_not_available(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 assert is_available is False @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.os.path.normcase') def test_load(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_display = MagicMock() 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_controller.vlc_instance.media_new_path.return_value = mocked_vlc_media mocked_controller.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_controller, mocked_display, media_path) # THEN: The video should be loaded mocked_normcase.assert_called_with(media_path) mocked_controller.vlc_instance.media_new_path.assert_called_with(media_path) assert mocked_vlc_media == mocked_controller.vlc_media mocked_controller.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) mocked_vlc_media.parse.assert_called_with() mocked_volume.assert_called_with(mocked_controller, 100) assert result is True @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 test_load_audio_cd(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() mocked_get_vlc.return_value = mocked_vlc mocked_display = MagicMock() mocked_controller = MagicMock() mocked_controller.media_info.volume = 100 mocked_controller.media_info.media_type = MediaType.CD mocked_controller.media_info.title_track = 1 mocked_vlc_media = MagicMock() mocked_media = MagicMock() mocked_controller.media_info.volume = 100 mocked_controller.media_info.start_time = 20000 mocked_controller.media_info.end_time = 30000 mocked_controller.media_info.length = 10000 mocked_controller.vlc_instance.media_new_location.return_value = mocked_vlc_media mocked_controller.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_controller, mocked_display, media_path) # THEN: The video should be loaded mocked_normcase.assert_called_with(media_path) mocked_controller.vlc_instance.media_new_location.assert_called_with('cdda://' + media_path) assert mocked_vlc_media == mocked_controller.vlc_media mocked_controller.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) mocked_vlc_media.parse.assert_called_with() mocked_volume.assert_called_with(mocked_controller, 100) mocked_media_state_wait.assert_called_with(mocked_controller, ANY) mocked_controller.seek_slider.setMinimum.assert_called_with(20000) mocked_controller.seek_slider.setMaximum.assert_called_with(30000) assert result is True @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 test_load_audio_cd_on_windows(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_display = MagicMock() 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_controller.vlc_instance.media_new_location.return_value = mocked_vlc_media mocked_controller.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_controller, mocked_display, media_path) # THEN: The video should be loaded mocked_normcase.assert_called_with(media_path) mocked_controller.vlc_instance.media_new_location.assert_called_with('cdda:///' + media_path) assert mocked_vlc_media == mocked_controller.vlc_media mocked_controller.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) mocked_vlc_media.parse.assert_called_with() mocked_volume.assert_called_with(mocked_controller, 100) mocked_media_state_wait.assert_called_with(mocked_controller, ANY) assert result is True @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 test_load_audio_cd_no_tracks(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() mocked_get_vlc.return_value = mocked_vlc mocked_display = MagicMock() 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_vlc_media_player = MagicMock() mocked_controller.vlc_media = mocked_vlc_media mocked_controller.vlc_media_player = mocked_vlc_media_player mocked_media = MagicMock() mocked_media.get_duration.return_value = 10000 mocked_controller.vlc_instance.media_new_location.return_value = mocked_vlc_media mocked_controller.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'), patch.object(vlc_player, 'media_state_wait'): result = vlc_player.load(mocked_controller, mocked_display, media_path) # THEN: The video should be loaded mocked_normcase.assert_called_with(media_path) mocked_controller.vlc_instance.media_new_location.assert_called_with('cdda://' + media_path) assert mocked_vlc_media == mocked_controller.vlc_media assert 0 == mocked_subitems.item_at_index.call_count mocked_controller.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) assert 0 == mocked_vlc_media.parse.call_count assert result is False @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 test_load_dvd(mocked_normcase, mocked_get_vlc, mocked_is_win): """ Test loading a DVD 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() mocked_get_vlc.return_value = mocked_vlc mocked_display = MagicMock() mocked_controller = MagicMock() mocked_controller.media_info.volume = 100 mocked_controller.media_info.media_type = MediaType.DVD mocked_controller.media_info.title_track = '2' mocked_controller.media_info.audio_track = 2 mocked_controller.media_info.subtitle_track = 4 mocked_vlc_media = MagicMock() mocked_media = MagicMock() mocked_controller.media_info.volume = 100 mocked_controller.media_info.start_time = 20000 mocked_controller.media_info.end_time = 30000 mocked_controller.media_info.length = 10000 mocked_controller.vlc_instance.media_new_location.return_value = mocked_vlc_media mocked_controller.vlc_media_player.get_media.return_value = mocked_media vlc_player = VlcPlayer(None) # WHEN: A DVD clip 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_controller, mocked_display, media_path) # THEN: The video should be loaded mocked_normcase.assert_called_with(media_path) mocked_controller.vlc_instance.media_new_location.assert_called_with('dvd://' + media_path + '#2') assert mocked_vlc_media == mocked_controller.vlc_media mocked_controller.vlc_media_player.set_media.assert_called_with(mocked_vlc_media) mocked_controller.vlc_media_player.audio_set_track.assert_called_with(2) mocked_controller.vlc_media_player.video_set_spu.assert_called_with(4) mocked_vlc_media.parse.assert_called_with() mocked_volume.assert_called_with(mocked_controller, 100) mocked_media_state_wait.assert_called_with(mocked_controller, ANY) mocked_controller.seek_slider.setMinimum.assert_called_with(20000) mocked_controller.seek_slider.setMaximum.assert_called_with(30000) assert result is True @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) def test_media_state_wait(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_controller = MagicMock() mocked_controller.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_controller, 2) # THEN: The results should be True assert result is True @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) def test_media_state_wait_error(mocked_get_vlc, vlc_env): """ 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_controller = MagicMock() mocked_controller.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_controller, 2) # THEN: The results should be True assert result is False @patch('openlp.core.ui.media.vlcplayer.get_vlc') @patch('openlp.core.ui.media.vlcplayer.datetime', MockDateTime) def test_media_state_wait_times_out(mocked_get_vlc, vlc_env): """ 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_controller = MagicMock() mocked_controller.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_controller, 3) # THEN: The results should be True assert result is False def test_resize(): """ Test resizing the player """ # GIVEN: A display object and a VlcPlayer instance mocked_controller = MagicMock() mocked_controller.preview_display.size.return_value = (10, 10) mocked_controller.is_live = False vlc_player = VlcPlayer(None) # WHEN: resize is called vlc_player.resize(mocked_controller) # THEN: The right methods should have been called mocked_controller.preview_display.size.assert_called_with() mocked_controller.vlc_widget.resize.assert_called_with((10, 10)) @patch('openlp.core.ui.media.vlcplayer.threading') @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_play(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_display = MagicMock() mocked_controller = MagicMock() mocked_media = MagicMock() mocked_controller.media_info.volume = 100 mocked_controller.vlc_media_player.get_media.return_value = mocked_media vlc_player = VlcPlayer(None) vlc_player.set_state(MediaState.Paused, mocked_controller) # 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_controller, mocked_display) # THEN: A bunch of things should happen to play the media mocked_thread.start.assert_called_with() mocked_volume.assert_called_with(mocked_controller, 100) assert MediaState.Playing == vlc_player.get_live_state() assert result is True, 'The value returned from play() should be True' @patch('openlp.core.ui.media.vlcplayer.threading') @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_play_media_wait_state_not_playing(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_output_display = MagicMock() vlc_player = VlcPlayer(None) vlc_player.set_state(MediaState.Paused, mocked_output_display) # WHEN: play() is called with patch.object(vlc_player, 'media_state_wait') as mocked_media_state_wait, \ patch.object(vlc_player, 'volume'): mocked_media_state_wait.return_value = False result = vlc_player.play(mocked_controller, mocked_output_display) # THEN: A thread should be started, but the method should return False mocked_thread.start.assert_called_with() assert result is False @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_pause(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) assert MediaState.Paused == vlc_player.get_live_state() @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_pause_not_playing(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() assert 0 == mocked_display.vlc_media_player.pause.call_count @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_pause_fail(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) assert MediaState.Paused is not vlc_player.state @patch('openlp.core.ui.media.vlcplayer.threading') def test_stop(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() mocked_display = MagicMock() mocked_display.vlc_media_player.stop = mocked_stop vlc_player = VlcPlayer(None) # WHEN: stop is called vlc_player.stop(mocked_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() assert MediaState.Stopped == vlc_player.get_live_state() def test_volume(): """ Test setting the volume """ # GIVEN: A display object and a VlcPlayer instance mocked_display = MagicMock() mocked_display.has_audio = True vlc_player = VlcPlayer(None) # WHEN: The volume is set vlc_player.volume(mocked_display, 10) # THEN: The volume should have been set mocked_display.vlc_media_player.audio_set_volume.assert_called_with(10) def test_seek_unseekable_media(): """ Test seeking something that can't be seeked """ # 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: seek() is called vlc_player.seek(mocked_display, 100) # THEN: nothing should happen mocked_display.vlc_media_player.is_seekable.assert_called_with() assert 0 == mocked_display.vlc_media_player.set_time.call_count def test_seek_seekable_media(): """ 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 test_seek_dvd(): """ 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 = 3000 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(2000) def test_reset(): """ 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 invisible mocked_display.vlc_media_player.stop.assert_called_with() mocked_display.vlc_widget.setVisible.assert_not_called() assert MediaState.Off == vlc_player.get_live_state() def test_set_visible_has_own_widget(): """ 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) @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_update_ui(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_controller.vlc_media.get_state.return_value = 1 mocked_controller.vlc_media_player.get_time.return_value = 400000 vlc_player = VlcPlayer(None) # WHEN: update_ui() is called vlc_player.update_ui(mocked_controller, mocked_display) # THEN: Certain methods should be called mocked_controller.vlc_media_player.get_time.assert_called_with() mocked_controller.seek_slider.setSliderPosition.assert_called_with(400000) expected_calls = [call(True), call(False)] assert expected_calls == mocked_controller.seek_slider.blockSignals.call_args_list @patch('openlp.core.ui.media.vlcplayer.get_vlc') def test_update_ui_dvd(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 = ItemMediaInfo() 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_controller.vlc_media.get_state.return_value = 1 mocked_controller.vlc_media_player.get_time.return_value = 200 mocked_controller.media_info.media_type = MediaType.DVD vlc_player = VlcPlayer(None) # WHEN: update_ui() is called vlc_player.update_ui(mocked_controller, mocked_display) # THEN: Certain methods should be called mocked_controller.vlc_media_player.get_time.assert_called_with() mocked_controller.seek_slider.setSliderPosition.assert_called_with(200) expected_calls = [call(True), call(False)] assert expected_calls == mocked_controller.seek_slider.blockSignals.call_args_list