From 058bea7f4cee2c6715194d33b9ae88da2f0d24df Mon Sep 17 00:00:00 2001 From: Daniel Martin Date: Tue, 2 Feb 2021 09:28:20 +0000 Subject: [PATCH] Small fixes --- openlp/core/display/window.py | 5 +- openlp/core/lib/serviceitem.py | 12 +- .../openlp_core/display/test_window.py | 199 ++++++++++++------ .../openlp_core/lib/test_serviceitem.py | 12 +- 4 files changed, 144 insertions(+), 84 deletions(-) diff --git a/openlp/core/display/window.py b/openlp/core/display/window.py index 16a44f9c2..8ca547fd4 100644 --- a/openlp/core/display/window.py +++ b/openlp/core/display/window.py @@ -177,7 +177,10 @@ class DisplayWindow(QtWidgets.QWidget, RegistryProperties, LogMixin): image = self.settings.value('core/logo file') if path_to_str(image).startswith(':'): image = self.openlp_splash_screen_path - image_uri = image.as_uri() + try: + image_uri = image.as_uri() + except Exception: + image_uri = '' # if set to hide logo on startup, do not send the logo if self.settings.value('core/logo hide on startup'): image_uri = '' diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index f4f6d09e3..1f239cf97 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -910,12 +910,12 @@ class ServiceItem(RegistryProperties): item['chords'] = self.rendered_slides[index]['chords'] item['footer'] = self.rendered_slides[index]['footer'] elif self.is_image() and not frame.get('image', '') and \ - Registry().get('settings_thread').value('api/thumbnails'): - thumbnail_path = os.path.join('images', 'thumbnails', frame['title']) - full_thumbnail_path = AppLocation.get_data_path() / thumbnail_path - if not full_thumbnail_path.exists(): - create_thumb(Path(self.get_frame_path(index)), full_thumbnail_path, False) - item['img'] = image_to_data_uri(full_thumbnail_path) + Registry().get('settings_thread').value('api/thumbnails') and \ + self.is_capable(ItemCapabilities.HasThumbnails): + thumbnail_path = frame['thumbnail'] + if not thumbnail_path.exists(): + create_thumb(Path(self.get_frame_path(index)), thumbnail_path, False) + item['img'] = image_to_data_uri(thumbnail_path) item['text'] = str(frame['title']) item['html'] = str(frame['title']) else: diff --git a/tests/functional/openlp_core/display/test_window.py b/tests/functional/openlp_core/display/test_window.py index 28fb875bc..f77d14925 100644 --- a/tests/functional/openlp_core/display/test_window.py +++ b/tests/functional/openlp_core/display/test_window.py @@ -24,6 +24,7 @@ Package to test the openlp.core.display.window package. import sys import time import pytest +from pathlib import Path from unittest.mock import MagicMock, patch @@ -50,9 +51,18 @@ def mock_geometry(): screenlist_patcher.stop() -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_x11_override_on(mocked_webengine, mocked_addWidget, mock_settings): +@pytest.fixture +def display_window_env(): + box_layout_patcher = patch('openlp.core.display.window.QtWidgets.QVBoxLayout') + web_view_patcher = patch('openlp.core.display.webengine.WebEngineView') + box_layout_patcher.start() + web_view_patcher.start() + yield + box_layout_patcher.stop() + web_view_patcher.stop() + + +def test_x11_override_on(display_window_env, mock_settings): """ Test that the x11 override option bit is set """ @@ -67,9 +77,7 @@ def test_x11_override_on(mocked_webengine, mocked_addWidget, mock_settings): assert x11_bit == QtCore.Qt.X11BypassWindowManagerHint -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_x11_override_off(mocked_webengine, mocked_addWidget, mock_settings): +def test_x11_override_off(display_window_env, mock_settings): """ Test that the x11 override option bit is not set when setting if off """ @@ -84,8 +92,7 @@ def test_x11_override_off(mocked_webengine, mocked_addWidget, mock_settings): assert x11_bit != QtCore.Qt.X11BypassWindowManagerHint -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -def test_set_scale_not_initialised(mocked_addWidget, mock_settings): +def test_set_scale_not_initialised(display_window_env, mock_settings): """ Test that the scale js is not run if the page is not initialised """ @@ -101,13 +108,11 @@ def test_set_scale_not_initialised(mocked_addWidget, mock_settings): display_window.run_javascript.assert_not_called() -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_set_scale_initialised(mocked_webengine, mocked_addWidget, mock_settings): +def test_set_scale_initialised(display_window_env, mock_settings): """ - Test that the scale js is not run if the page is not initialised + Test that the scale js is run if the page is initialised """ - # GIVEN: A display window not yet initialised + # GIVEN: A initialised display window display_window = DisplayWindow() display_window._is_initialised = True display_window.run_javascript = MagicMock() @@ -119,9 +124,103 @@ def test_set_scale_initialised(mocked_webengine, mocked_addWidget, mock_settings display_window.run_javascript.assert_called_once_with('Display.setScale(50.0);') -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_after_loaded(mocked_webengine, mocked_addWidget, mock_settings): +def test_set_startup_screen(display_window_env, mock_settings): + """ + Test that the startup screen get set correctly + """ + # GIVEN: A display window and mocked settings with logo path + display_window = DisplayWindow() + display_window._is_initialised = True + display_window.run_javascript = MagicMock() + display_window.openlp_splash_screen_path = Path('/default/splash_screen.png') + settings = { + 'core/logo background color': 'red', + 'core/logo file': Path('/my/image.png'), + 'core/logo hide on startup': False + } + mock_settings.value.side_effect = lambda key: settings[key] + + # WHEN: set_startup_screen is run + display_window.set_startup_screen() + + # THEN: javascript should be run + display_window.run_javascript.assert_called_once_with( + 'Display.setStartupSplashScreen("red", "file:///my/image.png");') + + +def test_set_startup_screen_default_image(display_window_env, mock_settings): + """ + Test that the startup screen get set correctly + """ + # GIVEN: A display window and mocked settings with logo path + display_window = DisplayWindow() + display_window._is_initialised = True + display_window.run_javascript = MagicMock() + display_window.openlp_splash_screen_path = Path('/default/splash_screen.png') + settings = { + 'core/logo background color': 'blue', + 'core/logo file': Path(':/graphics/openlp-splash-screen.png'), + 'core/logo hide on startup': False + } + mock_settings.value.side_effect = lambda key: settings[key] + + # WHEN: set_startup_screen is run + display_window.set_startup_screen() + + # THEN: javascript should be run + display_window.run_javascript.assert_called_with( + 'Display.setStartupSplashScreen("blue", "file:///default/splash_screen.png");') + + +def test_set_startup_screen_missing(display_window_env, mock_settings): + """ + Test that the startup screen get set correctly + """ + # GIVEN: A display window and mocked settings with logo path missing + display_window = DisplayWindow() + display_window._is_initialised = True + display_window.run_javascript = MagicMock() + display_window.openlp_splash_screen_path = Path('/default/splash_screen.png') + settings = { + 'core/logo background color': 'green', + 'core/logo file': None, + 'core/logo hide on startup': False + } + mock_settings.value.side_effect = lambda key: settings[key] + + # WHEN: set_startup_screen is run + display_window.set_startup_screen() + + # THEN: javascript should be run + display_window.run_javascript.assert_called_with( + 'Display.setStartupSplashScreen("green", "");') + + +def test_set_startup_screen_hide(display_window_env, mock_settings): + """ + Test that the startup screen get set correctly + """ + # GIVEN: A display window and mocked settings with hide logo true + display_window = DisplayWindow() + display_window._is_initialised = True + display_window.run_javascript = MagicMock() + display_window.openlp_splash_screen_path = Path('/default/splash_screen.png') + settings = { + 'core/logo background color': 'orange', + 'core/logo file': Path('/my/image.png'), + 'core/logo hide on startup': True + } + mock_settings.value.side_effect = lambda key: settings[key] + + # WHEN: set_startup_screen is run + display_window.set_startup_screen() + + # THEN: javascript should be run + display_window.run_javascript.assert_called_once_with( + 'Display.setStartupSplashScreen("orange", "");') + + +def test_after_loaded(display_window_env, mock_settings): """ Test the correct steps are taken when the webview is loaded """ @@ -148,9 +247,7 @@ def test_after_loaded(mocked_webengine, mocked_addWidget, mock_settings): display_window.set_startup_screen.assert_called_once() -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_after_loaded_hide_mouse_not_display(mocked_webengine, mocked_addWidget, mock_settings): +def test_after_loaded_hide_mouse_not_display(display_window_env, mock_settings): """ Test the mouse is showing even if the `hide mouse` setting is set while is_display=false """ @@ -175,10 +272,8 @@ def test_after_loaded_hide_mouse_not_display(mocked_webengine, mocked_addWidget, '});') -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch.object(time, 'time') -def test_run_javascript_no_sync_no_wait(mock_time, mocked_webengine, mocked_addWidget, mock_settings): +def test_run_javascript_no_sync_no_wait(mock_time, display_window_env, mock_settings): """ test a script is run on the webview """ @@ -195,10 +290,8 @@ def test_run_javascript_no_sync_no_wait(mock_time, mocked_webengine, mocked_addW mock_time.sleep.assert_not_called() -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch.object(time, 'time') -def test_run_javascript_sync_no_wait(mock_time, mocked_webengine, mocked_addWidget, mock_settings): +def test_run_javascript_sync_no_wait(mock_time, display_window_env, mock_settings): """ test a synced script is run on the webview and immediately returns a result """ @@ -220,10 +313,8 @@ def test_run_javascript_sync_no_wait(mock_time, mocked_webengine, mocked_addWidg mock_time.sleep.assert_not_called() -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch('openlp.core.display.window.is_win') -def test_fix_font_bold_windows(mocked_is_win, mocked_webengine, mocked_layout, mock_settings): +def test_fix_font_bold_windows(mocked_is_win, display_window_env, mock_settings): """ Test that on Windows, fonts that end with "Bold" are handled """ @@ -241,10 +332,8 @@ def test_fix_font_bold_windows(mocked_is_win, mocked_webengine, mocked_layout, m assert result == 'Arial Rounded MT' -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch('openlp.core.display.window.is_win') -def test_fix_font_bold_not_windows(mocked_is_win, mocked_webengine, mocked_layout, mock_settings): +def test_fix_font_bold_not_windows(mocked_is_win, display_window_env, mock_settings): """ Test that on NOT Windows, fonts that end with "Bold" are ignored """ @@ -262,10 +351,8 @@ def test_fix_font_bold_not_windows(mocked_is_win, mocked_webengine, mocked_layou assert result == 'Arial Rounded MT Bold' -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch('openlp.core.display.window.is_win') -def test_fix_font_foundry(mocked_is_win, mocked_webengine, mocked_layout, mock_settings): +def test_fix_font_foundry(mocked_is_win, display_window_env, mock_settings): """ Test that a font with a foundry name in it has the foundry removed """ @@ -283,9 +370,7 @@ def test_fix_font_foundry(mocked_is_win, mocked_webengine, mocked_layout, mock_s assert result == 'CMG Sans' -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_set_theme_is_display_video(mocked_webengine, mocked_addWidget, mock_settings, mock_geometry): +def test_set_theme_is_display_video(display_window_env, mock_settings, mock_geometry): """ Test the set_theme function """ @@ -307,9 +392,7 @@ def test_set_theme_is_display_video(mocked_webengine, mocked_addWidget, mock_set is_sync=False) -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_set_theme_not_display_video(mocked_webengine, mocked_addWidget, mock_settings, mock_geometry): +def test_set_theme_not_display_video(display_window_env, mock_settings, mock_geometry): """ Test the set_theme function """ @@ -338,9 +421,7 @@ def test_set_theme_not_display_video(mocked_webengine, mocked_addWidget, mock_se is_sync=False) -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_set_theme_not_display_live(mocked_webengine, mocked_addWidget, mock_settings, mock_geometry): +def test_set_theme_not_display_live(display_window_env, mock_settings, mock_geometry): """ Test the set_theme function """ @@ -366,11 +447,9 @@ def test_set_theme_not_display_live(mocked_webengine, mocked_addWidget, mock_set is_sync=False) -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch('openlp.core.display.window.Registry.execute') @patch('openlp.core.display.window.ScreenList') -def test_show_display(mocked_screenlist, mocked_registry_execute, mocked_webengine, mocked_addWidget, mock_settings): +def test_show_display(mocked_screenlist, mocked_registry_execute, display_window_env, mock_settings): """ Test show_display function """ @@ -391,10 +470,8 @@ def test_show_display(mocked_screenlist, mocked_registry_execute, mocked_webengi mocked_registry_execute.assert_called_once_with('live_display_active') -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch('openlp.core.display.window.ScreenList') -def test_show_display_no_display(mocked_screenlist, mocked_webengine, mocked_addWidget, mock_settings): +def test_show_display_no_display(mocked_screenlist, display_window_env, mock_settings): """ Test show_display function when no displays are available """ @@ -412,9 +489,7 @@ def test_show_display_no_display(mocked_screenlist, mocked_webengine, mocked_add assert display_window.run_javascript.call_count == 0 -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_hide_display_to_screen(mocked_webengine, mocked_addWidget, mock_settings): +def test_hide_display_to_screen(display_window_env, mock_settings): """ Test hide to screen in the hide_display function """ @@ -432,9 +507,7 @@ def test_hide_display_to_screen(mocked_webengine, mocked_addWidget, mock_setting display_window.run_javascript.assert_called_once_with('Display.toTransparent();') -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_hide_display_to_blank(mocked_webengine, mocked_addWidget, mock_settings): +def test_hide_display_to_blank(display_window_env, mock_settings): """ Test hide to screen in the hide_display function """ @@ -450,9 +523,7 @@ def test_hide_display_to_blank(mocked_webengine, mocked_addWidget, mock_settings display_window.run_javascript.assert_called_once_with('Display.toBlack();') -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_hide_display_to_theme(mocked_webengine, mocked_addWidget, mock_settings): +def test_hide_display_to_theme(display_window_env, mock_settings): """ Test hide to screen in the hide_display function """ @@ -468,9 +539,7 @@ def test_hide_display_to_theme(mocked_webengine, mocked_addWidget, mock_settings display_window.run_javascript.assert_called_once_with('Display.toTheme();') -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_hide_display_to_transparent(mocked_webengine, mocked_addWidget, mock_settings): +def test_hide_display_to_transparent(display_window_env, mock_settings): """ Test hide to screen in the hide_display function """ @@ -488,9 +557,7 @@ def test_hide_display_to_transparent(mocked_webengine, mocked_addWidget, mock_se assert display_window.setVisible.call_count == 0 -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') -def test_hide_transparent_to_screen(mocked_webengine, mocked_addWidget, mock_settings): +def test_hide_transparent_to_screen(display_window_env, mock_settings): """ Test that when going transparent, and the disable transparent setting is enabled, the screen mode should be used. @@ -507,10 +574,8 @@ def test_hide_transparent_to_screen(mocked_webengine, mocked_addWidget, mock_set display_window.setVisible.assert_called_once_with(False) -@patch('openlp.core.display.window.QtWidgets.QVBoxLayout') -@patch('openlp.core.display.webengine.WebEngineView') @patch('openlp.core.display.window.ScreenList') -def test_hide_display_no_display(mocked_screenlist, mocked_webengine, mocked_addWidget, mock_settings): +def test_hide_display_no_display(mocked_screenlist, display_window_env, mock_settings): """ Test show_display function when no displays are available """ diff --git a/tests/functional/openlp_core/lib/test_serviceitem.py b/tests/functional/openlp_core/lib/test_serviceitem.py index ea27ec794..19eeaaefb 100644 --- a/tests/functional/openlp_core/lib/test_serviceitem.py +++ b/tests/functional/openlp_core/lib/test_serviceitem.py @@ -834,9 +834,7 @@ def test_to_dict_text_item(state_media, settings, service_item_env): assert result == expected_dict -@patch('openlp.core.lib.serviceitem.AppLocation.get_data_path') -@patch('openlp.core.lib.serviceitem.image_to_data_uri') -def test_to_dict_image_item(mocked_image_to_data_uri, mocked_get_data_path, state_media, settings, service_item_env): +def test_to_dict_image_item(state_media, settings, service_item_env): """ Test that the to_dict() method returns the correct data for the service item """ @@ -847,12 +845,7 @@ def test_to_dict_image_item(mocked_image_to_data_uri, mocked_get_data_path, stat service_item.add_icon = MagicMock() FormattingTags.load_tags() line = convert_file_service_item(TEST_PATH, 'serviceitem_image_2.osj') - mocked_get_data_path.return_value = Path('/path/to/') - mocked_image_to_data_uri.side_effect = lambda x: 'your image uri at: {}'.format(x.as_posix()) - - with patch('openlp.core.lib.serviceitem.sha256_file_hash') as mocked_sha256_file_hash: - mocked_sha256_file_hash.return_value = '3a7ccbdb0b5a3db169c4692d7aad0ec8' - service_item.set_from_service(line) + service_item.set_from_service(line) # WHEN: to_dict() is called result = service_item.to_dict() @@ -870,7 +863,6 @@ def test_to_dict_image_item(mocked_image_to_data_uri, mocked_get_data_path, stat 'slides': [ { 'html': 'image_1.jpg', - 'img': 'your image uri at: /path/to/images/thumbnails/image_1.jpg', 'selected': False, 'tag': 1, 'text': 'image_1.jpg',