# -*- coding: utf-8 -*- ########################################################################## # OpenLP - Open Source Lyrics Projection # # ---------------------------------------------------------------------- # # Copyright (c) 2008-2021 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 :mod:`~openlp.core.ui.style` module. """ from unittest import skipIf from unittest.mock import MagicMock, patch, call from openlp.core.ui.style import MEDIA_MANAGER_STYLE, UiThemes, WIN_REPAIR_STYLESHEET, get_application_stylesheet, \ get_library_stylesheet, has_ui_theme, is_ui_theme_dark, set_default_theme import openlp.core.ui.style @skipIf(not hasattr(openlp.core.ui.style, 'qdarkstyle'), 'qdarkstyle is not installed') @patch('openlp.core.ui.style.HAS_DARK_THEME', True) @patch('openlp.core.ui.style.qdarkstyle') def test_get_application_stylesheet_qdarkstyle(mocked_qdarkstyle, mock_settings): """Test that the QDarkStyle stylesheet is returned when available and enabled""" # GIVEN: Theme is QDarkStyle mock_settings.value.return_value = UiThemes.QDarkStyle mocked_qdarkstyle.load_stylesheet_pyqt5.return_value = 'dark_style' # WHEN: get_application_stylesheet() is called result = get_application_stylesheet() # THEN: the result should be QDarkStyle stylesheet assert result == 'dark_style' @skipIf(not hasattr(openlp.core.ui.style, 'qdarkstyle'), 'qdarkstyle is not installed') @patch('openlp.core.ui.style.HAS_DARK_THEME', True) def test_has_ui_theme_qdarkstyle_true_when_available(mock_settings): """Test that the QDarkStyle UI theme exists when qdarkstyle is available """ # GIVEN: Theme is QDarkStyle mock_settings.value.return_value = UiThemes.QDarkStyle # WHEN: has_ui_theme() is called result = has_ui_theme(UiThemes.QDarkStyle) # THEN: the result should be true assert result is True @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_has_ui_theme_qdarkstyle_false_when_unavailable(mock_settings): """Test that the QDarkStyle UI theme not exists when qdarkstyle is not available """ # GIVEN: Theme is QDarkStyle mock_settings.value.return_value = UiThemes.QDarkStyle # WHEN: has_ui_theme() is called result = has_ui_theme(UiThemes.QDarkStyle) # THEN: the result should be false assert result is False @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_win') @patch('openlp.core.app.QtWidgets.QApplication.palette') def test_get_application_stylesheet_not_alternate_rows(mocked_palette, mocked_is_win, mock_settings): """Test that the alternate rows stylesheet is returned when enabled in settings""" def settings_values(key): if key == 'advanced/ui_theme_name': return UiThemes.DefaultLight else: return False # GIVEN: We're not on Windows and UI theme is not QDarkStyle mocked_is_win.return_value = False mock_settings.value = MagicMock(side_effect=settings_values) mocked_palette.return_value.color.return_value.name.return_value = 'color' # WHEN: get_application_stylesheet() is called result = get_application_stylesheet() # THEN: result should match non-alternate-rows mock_settings.value.assert_has_calls([call('advanced/ui_theme_name'), call('advanced/alternate rows')]) assert result == 'QTableWidget, QListWidget, QTreeWidget {alternate-background-color: color;}\n', result @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_win') def test_get_application_stylesheet_win_repair(mocked_is_win, mock_settings): """Test that the Windows repair stylesheet is returned when on Windows""" def settings_values(key): if key == 'advanced/ui_theme_name': return UiThemes.DefaultLight else: return True # GIVEN: We're on Windows and Theme is not QDarkStyle mocked_is_win.return_value = True mock_settings.value = MagicMock(side_effect=settings_values) # WHEN: get_application_stylesheet() is called result = get_application_stylesheet() # THEN: result should return Windows repair stylesheet mock_settings.value.assert_has_calls([call('advanced/ui_theme_name'), call('advanced/alternate rows')]) assert result == WIN_REPAIR_STYLESHEET @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_win') def test_get_application_stylesheet_not_win_repair(mocked_is_win, mock_settings): """Test that the Windows repair stylesheet is not returned when not in Windows""" def settings_values(key): if key == 'advanced/ui_theme_name': return UiThemes.DefaultLight else: return True # GIVEN: We're on Windows and Theme is not QDarkStyle mocked_is_win.return_value = False mock_settings.value = MagicMock(side_effect=settings_values) # WHEN: get_application_stylesheet() is called result = get_application_stylesheet() # THEN: result should not return Windows repair stylesheet mock_settings.value.assert_has_calls([call('advanced/ui_theme_name'), call('advanced/alternate rows')]) assert result != WIN_REPAIR_STYLESHEET @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_get_library_stylesheet_automatic_ui_theme(mock_settings): """Test that the media manager stylesheet is returned for Automatic UI theme""" # GIVEN: UI theme is Automatic mock_settings.value.return_value = UiThemes.Automatic # WHEN: get_library_stylesheet() is called result = get_library_stylesheet() # THEN: the correct stylesheet should be returned assert result == MEDIA_MANAGER_STYLE @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_get_library_stylesheet_defaultlight_ui_theme(mock_settings): """Test that the media manager stylesheet is returned for Default Light UI theme""" # GIVEN: UI theme is DefaultLight mock_settings.value.return_value = UiThemes.DefaultLight # WHEN: get_library_stylesheet() is called result = get_library_stylesheet() # THEN: the correct stylesheet should be returned assert result == MEDIA_MANAGER_STYLE @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_get_library_stylesheet_defaultdark_ui_theme(mock_settings): """Test that the media manager stylesheet is returned for Default Dark UI theme""" # GIVEN: UI theme is DefaultDark mock_settings.value.return_value = UiThemes.DefaultDark # WHEN: get_library_stylesheet() is called result = get_library_stylesheet() # THEN: the correct stylesheet should be returned assert result == MEDIA_MANAGER_STYLE @skipIf(not hasattr(openlp.core.ui.style, 'qdarkstyle'), 'qdarkstyle is not installed') @patch('openlp.core.ui.style.HAS_DARK_THEME', True) def test_get_library_stylesheet_qdarktheme_ui_theme(mock_settings): """Test that the media manager stylesheet is not returned for QDarkStyle UI theme""" # GIVEN: UI theme is QDarkStyle mock_settings.value.return_value = UiThemes.QDarkStyle # WHEN: get_library_stylesheet() is called result = get_library_stylesheet() # THEN: The correct stylesheet should be returned assert result == '' @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_system_darkmode') def test_is_ui_theme_automatic_dark_when_system_dark(mocked_is_system_darkmode, mock_settings): """Test that the Automatic UI Theme is Dark on System Dark Theme""" # GIVEN: UI theme is Automatic and System Theme is Dark mock_settings.value.return_value = UiThemes.Automatic mocked_is_system_darkmode.return_value = True # WHEN: is_ui_theme_dark() is called result = is_ui_theme_dark() # THEN: the result should be true assert result is True @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_system_darkmode') def test_is_ui_theme_dark_automatic_light_when_system_light(mocked_is_system_darkmode, mock_settings): """Test that the Automatic UI Theme is not Dark on System Light Theme""" # GIVEN: UI theme is Automatic and System Theme is Light mocked_is_system_darkmode.return_value = False mock_settings.value.return_value = UiThemes.Automatic # WHEN: is_ui_theme_dark() is called result = is_ui_theme_dark() # THEN: the result should be false assert result is False @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_is_ui_theme_dark_defaultlight_not_dark(mock_settings): """Test that the DefaultLight UI Theme is not Dark""" # GIVEN: UI theme is DefaultLight mock_settings.value.return_value = UiThemes.DefaultLight # WHEN: is_ui_theme_dark() is called result = is_ui_theme_dark() # THEN: the result should be false assert result is False @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_is_ui_theme_dark_defaultdark_dark(mock_settings): """Test that the DefaultDark UI Theme is Dark""" # GIVEN: UI theme is DefaultDark mock_settings.value.return_value = UiThemes.DefaultDark # WHEN: is_ui_theme_dark() is called result = is_ui_theme_dark() # THEN: the result should be true assert result is True @skipIf(not hasattr(openlp.core.ui.style, 'qdarkstyle'), 'qdarkstyle is not installed') @patch('openlp.core.ui.style.HAS_DARK_THEME', True) def test_is_ui_theme_dark_qdarkstyle_dark(mock_settings): """Test that the QDarkStyle UI Theme is Dark""" # GIVEN: UI theme is DefaultDark mock_settings.value.return_value = UiThemes.QDarkStyle # WHEN: is_ui_theme_dark() is called result = is_ui_theme_dark() # THEN: the result should be true assert result is True @patch('openlp.core.ui.style.HAS_DARK_THEME', False) def test_set_default_theme_defaultdark_theme_sets_palette(mock_settings): """Test that the set_default_theme sets App Palette for DefaultDark UI theme""" # GIVEN: UI theme is DefaultDark mock_settings.value.return_value = UiThemes.DefaultDark mock_app = MagicMock() # WHEN: set_default_theme() is called set_default_theme(mock_app) # THEN: app palette should be changed mock_app.setPalette.assert_called_once() @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_system_darkmode') def test_set_default_theme_automatic_theme_system_dark_sets_palette(mocked_is_system_darkmode, mock_settings): """Test that the set_default_theme sets App Palette for Automatic UI theme on System with Dark Theme""" # GIVEN: UI theme is Automatic on System with Dark Theme mock_settings.value.return_value = UiThemes.Automatic mocked_is_system_darkmode.return_value = True mock_app = MagicMock() # WHEN: set_default_theme() is called set_default_theme(mock_app) # THEN: app palette should be changed mock_app.setPalette.assert_called_once() @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.set_default_darkmode') def test_set_default_theme_defaultdark_theme_calls_set_default_darkmode(mock_set_default_darkmode, mock_settings): """Test that the set_default_theme calls set_default_darkmode for DefaultDark UI theme""" # GIVEN: UI theme is DefaultDark mock_settings.value.return_value = UiThemes.DefaultDark mock_app = MagicMock() # WHEN: set_default_theme() is called set_default_theme(mock_app) # THEN: set_default_darkmode should be changed mock_set_default_darkmode.assert_called_once() @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.set_default_darkmode') @patch('openlp.core.ui.style.is_system_darkmode') def test_set_default_theme_automatic_theme_calls_set_default_darkmode(mock_is_system_darkmode, mock_set_default_darkmode, mock_settings): """Test that the set_default_theme calls set_default_darkmode for Automatic UI theme on system dark theme""" # GIVEN: UI theme is Automatic and System is using Dark Theme mock_settings.value.return_value = UiThemes.Automatic mock_app = MagicMock() mock_is_system_darkmode.return_value = True # WHEN: set_default_theme() is called set_default_theme(mock_app) # THEN: set_default_darkmode should be changed mock_set_default_darkmode.assert_called_once() @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.is_system_darkmode') def test_set_default_theme_automatic_theme_system_light_not_sets_palette(mocked_is_system_darkmode, mock_settings): """Test that the set_default_theme doesnt't set App Palette for Automatic UI theme on System Light Theme""" # GIVEN: UI theme is Automatic with System Light Theme mock_settings.value.return_value = UiThemes.Automatic mocked_is_system_darkmode.return_value = False mock_app = MagicMock() # WHEN: set_default_theme() is called set_default_theme(mock_app) # THEN: app palette should not be changed mock_app.setPalette.assert_not_called() @patch('openlp.core.ui.style.HAS_DARK_THEME', False) @patch('openlp.core.ui.style.set_default_lightmode') def test_set_default_theme_defaultlight_theme_calls_set_default_lightmode(mock_set_default_lightmode, mock_settings): """Test that the set_default_theme calls set_default_darkmode for DefaultLight UI theme""" # GIVEN: UI theme is DefaultLight mock_settings.value.return_value = UiThemes.DefaultLight mock_app = MagicMock() # WHEN: set_default_theme() is called set_default_theme(mock_app) # THEN: set_default_darkmode should be changed mock_set_default_lightmode.assert_called_once()