Merge branch 'settings_2' into 'master'

Settings 2

See merge request openlp/openlp!91
This commit is contained in:
Raoul Snyman 2019-12-04 20:01:03 +00:00
commit 3094e6574d
4 changed files with 1045 additions and 1020 deletions

1
.gitignore vendored
View File

@ -25,6 +25,7 @@
.vscode
.eggs
.venv
.mypy_cache
OpenLP.egg-info
\#*\#
__pycache__

View File

@ -34,7 +34,6 @@ from openlp.core.common.actions import ActionList, CategoryOrder
from openlp.core.common.i18n import UiStrings, translate
from openlp.core.common.mixins import LogMixin, RegistryProperties
from openlp.core.common.registry import Registry, RegistryBase
from openlp.core.common.settings import Settings
from openlp.core.display.screens import ScreenList
from openlp.core.display.window import DisplayWindow
from openlp.core.lib import ServiceItemAction, image_to_byte
@ -324,7 +323,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.play_slides_once = create_action(self, 'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
icon=UiIcons().clock, checked=False, can_shortcuts=True,
category=self.category, triggers=self.on_play_slides_once)
if Settings().value(self.main_window.advanced_settings_section + '/slide limits') == SlideLimits.Wrap:
if self.settings.value(self.main_window.advanced_settings_section + '/slide limits') == SlideLimits.Wrap:
self.play_slides_menu.setDefaultAction(self.play_slides_loop)
else:
self.play_slides_menu.setDefaultAction(self.play_slides_once)
@ -697,13 +696,13 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
"""
Adjusts the value of the ``delay_spin_box`` to the given one.
"""
self.delay_spin_box.setValue(Settings().value('core/loop delay'))
self.delay_spin_box.setValue(self.settings.value('core/loop delay'))
def update_slide_limits(self):
"""
Updates the Slide Limits variable from the settings.
"""
self.slide_limits = Settings().value(self.main_window.advanced_settings_section + '/slide limits')
self.slide_limits = self.settings.value(self.main_window.advanced_settings_section + '/slide limits')
def enable_tool_bar(self, item):
"""
@ -737,7 +736,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.play_slides_loop.setIcon(UiIcons().clock)
self.play_slides_loop.setText(UiStrings().PlaySlidesInLoop)
if item.is_text():
if (Settings().value(self.main_window.songs_settings_section + '/display songbar') and
if (self.settings.value(self.main_window.songs_settings_section + '/display songbar') and
not self.song_menu.menu().isEmpty()):
self.toolbar.set_widget_visible('song_menu', True)
if item.is_capable(ItemCapabilities.CanLoop) and len(item.slides) > 1:
@ -1013,9 +1012,9 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.theme_screen.setChecked(False)
self.desktop_screen.setChecked(False)
if checked:
Settings().setValue(self.main_window.general_settings_section + '/screen blank', 'blanked')
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', 'blanked')
else:
Settings().remove(self.main_window.general_settings_section + '/screen blank')
self.settings.remove(self.main_window.general_settings_section + '/screen blank')
self.blank_plugin()
self.update_preview()
self.on_toggle_loop()
@ -1034,9 +1033,9 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.theme_screen.setChecked(checked)
self.desktop_screen.setChecked(False)
if checked:
Settings().setValue(self.main_window.general_settings_section + '/screen blank', 'themed')
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', 'themed')
else:
Settings().remove(self.main_window.general_settings_section + '/screen blank')
self.settings.remove(self.main_window.general_settings_section + '/screen blank')
self.blank_plugin()
self.update_preview()
self.on_toggle_loop()
@ -1056,9 +1055,9 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.theme_screen.setChecked(False)
self.desktop_screen.setChecked(checked)
if checked:
Settings().setValue(self.main_window.general_settings_section + '/screen blank', 'hidden')
self.settings.setValue(self.main_window.general_settings_section + '/screen blank', 'hidden')
else:
Settings().remove(self.main_window.general_settings_section + '/screen blank')
self.settings.remove(self.main_window.general_settings_section + '/screen blank')
self.hide_plugin(checked)
self.update_preview()
self.on_toggle_loop()
@ -1145,7 +1144,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
return
# If "click live slide to unblank" is enabled, unblank the display. And start = Item is sent to Live.
# Note: If this if statement is placed at the bottom of this function instead of top slide transitions are lost.
if self.is_live and Settings().value('core/click live slide to unblank'):
if self.is_live and self.settings.value('core/click live slide to unblank'):
if not start:
Registry().execute('slidecontroller_live_unblank')
row = self.preview_widget.current_slide_number()
@ -1353,7 +1352,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.play_slides_once.setText(UiStrings().PlaySlidesToEnd)
self.play_slides_menu.setDefaultAction(self.play_slides_loop)
self.play_slides_once.setChecked(False)
if Settings().value('core/click live slide to unblank'):
if self.settings.value('core/click live slide to unblank'):
Registry().execute('slidecontroller_live_unblank')
else:
self.play_slides_loop.setIcon(UiIcons().clock)
@ -1378,7 +1377,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
self.play_slides_loop.setText(UiStrings().PlaySlidesInLoop)
self.play_slides_menu.setDefaultAction(self.play_slides_once)
self.play_slides_loop.setChecked(False)
if Settings().value('core/click live slide to unblank'):
if self.settings.value('core/click live slide to unblank'):
Registry().execute('slidecontroller_live_unblank')
else:
self.play_slides_once.setIcon(UiIcons().clock)
@ -1423,7 +1422,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
Triggered when a preview slide item is double clicked
"""
if self.service_item:
if Settings().value('advanced/double click live') and Settings().value('core/auto unblank'):
if self.settings.value('advanced/double click live') and self.settings.value('core/auto unblank'):
# Live and Preview have issues if we have video or presentations
# playing in both at the same time.
if self.service_item.is_command():

View File

@ -23,6 +23,7 @@ All the tests
"""
import os
from tempfile import mkstemp
from unittest.mock import MagicMock
import pytest
from PyQt5 import QtCore, QtWidgets
@ -39,24 +40,34 @@ def qapp():
del app
@pytest.fixture
def registry():
"""An instance of the Registry"""
Registry.create()
@pytest.yield_fixture
def settings(qapp):
def settings(qapp, registry):
"""A Settings() instance"""
fd, ini_file = mkstemp('.ini')
Settings.set_filename(ini_file)
Registry.create()
Settings().setDefaultFormat(QtCore.QSettings.IniFormat)
# Needed on windows to make sure a Settings object is available during the tests
sets = Settings()
sets.setValue('themes/global theme', 'my_theme')
Registry().register('settings', set)
Registry().register('settings', sets)
yield sets
del sets
os.close(fd)
os.unlink(Settings().fileName())
@pytest.fixture
def registry():
"""An instance of the Registry"""
Registry.create()
@pytest.yield_fixture
def mock_settings(registry):
"""A Mock Settings() instance"""
# Create and register a mock settings object to work with
mock_settings = MagicMock()
Registry().register('settings', mock_settings)
yield mock_settings
Registry().remove('settings')
del mock_settings

View File

@ -21,7 +21,6 @@
"""
Package to test the openlp.core.ui.slidecontroller package.
"""
from unittest import TestCase
from unittest.mock import MagicMock, patch
from PyQt5 import QtCore, QtGui
@ -32,15 +31,7 @@ from openlp.core.ui.slidecontroller import NON_TEXT_MENU, WIDE_MENU, InfoLabel,
SlideController
class TestSlideController(TestCase):
def setUp(self):
"""
Set up the components need for all tests.
"""
Registry.create()
def test_initial_slide_controller(self):
def test_initial_slide_controller(registry):
"""
Test the initial slide controller state .
"""
@ -51,7 +42,8 @@ class TestSlideController(TestCase):
# THEN: The controller should not be a live controller.
assert slide_controller.is_live is False, 'The base slide controller should not be a live controller'
def test_text_service_item_blank(self):
def test_text_service_item_blank():
"""
Test that loading a text-based service item into the slide controller sets the correct blank menu
"""
@ -70,7 +62,8 @@ class TestSlideController(TestCase):
# THEN: the call to set the visible items on the toolbar should be correct
toolbar.set_widget_visible.assert_called_with(WIDE_MENU, True)
def test_non_text_service_item_blank(self):
def test_non_text_service_item_blank():
"""
Test that loading a non-text service item into the slide controller sets the correct blank menu
"""
@ -89,14 +82,13 @@ class TestSlideController(TestCase):
# THEN: then call set up the toolbar to blank the display screen.
toolbar.set_widget_visible.assert_called_with(NON_TEXT_MENU, True)
@patch('openlp.core.ui.slidecontroller.Settings')
def test_receive_spin_delay(self, MockedSettings):
def test_receive_spin_delay(mock_settings):
"""
Test that the spin box is updated accordingly after a call to receive_spin_delay()
"""
# GIVEN: A new SlideController instance.
mocked_value = MagicMock(return_value=1)
MockedSettings.return_value = MagicMock(value=mocked_value)
mock_settings.value.return_value = 1
mocked_delay_spin_box = MagicMock()
slide_controller = SlideController(None)
slide_controller.delay_spin_box = mocked_delay_spin_box
@ -104,11 +96,13 @@ class TestSlideController(TestCase):
# WHEN: The receive_spin_delay() method is called
slide_controller.receive_spin_delay()
# THEN: The Settings()value() and delay_spin_box.setValue() methods should have been called correctly
mocked_value.assert_called_with('core/loop delay')
# THEN: The settings value() and delay_spin_box.setValue() methods should have been called correctly
msv = mock_settings.value
msv.assert_called_with('core/loop delay')
mocked_delay_spin_box.setValue.assert_called_with(1)
def test_toggle_display_blank(self):
def test_toggle_display_blank():
"""
Check that the toggle_display('blank') method calls the on_blank_display() method
"""
@ -129,7 +123,8 @@ class TestSlideController(TestCase):
assert 0 == mocked_on_theme_display.call_count, 'on_theme_display should not have been called'
assert 0 == mocked_on_hide_display.call_count, 'on_hide_display should not have been called'
def test_toggle_display_hide(self):
def test_toggle_display_hide():
"""
Check that the toggle_display('hide') method calls the on_blank_display() method
"""
@ -150,7 +145,8 @@ class TestSlideController(TestCase):
assert 0 == mocked_on_theme_display.call_count, 'on_theme_display should not have been called'
assert 0 == mocked_on_hide_display.call_count, 'on_hide_display should not have been called'
def test_toggle_display_theme(self):
def test_toggle_display_theme():
"""
Check that the toggle_display('theme') method calls the on_theme_display() method
"""
@ -171,7 +167,8 @@ class TestSlideController(TestCase):
assert 0 == mocked_on_blank_display.call_count, 'on_blank_display should not have been called'
assert 0 == mocked_on_hide_display.call_count, 'on_hide_display should not have been called'
def test_toggle_display_desktop(self):
def test_toggle_display_desktop():
"""
Check that the toggle_display('desktop') method calls the on_hide_display() method
"""
@ -192,7 +189,8 @@ class TestSlideController(TestCase):
assert 0 == mocked_on_blank_display.call_count, 'on_blank_display should not have been called'
assert 0 == mocked_on_theme_display.call_count, 'on_theme_display should not have been called'
def test_toggle_display_show(self):
def test_toggle_display_show():
"""
Check that the toggle_display('show') method calls all the on_X_display() methods
"""
@ -213,7 +211,8 @@ class TestSlideController(TestCase):
mocked_on_theme_display.assert_called_once_with(False)
mocked_on_hide_display.assert_called_once_with(False)
def test_on_go_live_preview_controller(self):
def test_on_go_live_preview_controller():
"""
Test that when the on_go_preview() method is called the message is sent to the preview controller and focus is
set correctly.
@ -240,7 +239,8 @@ class TestSlideController(TestCase):
# THEN: the preview controller should have the service item and the focus set to live
mocked_preview_controller.preview_widget.setFocus.assert_called_once_with()
def test_on_go_live_live_controller(self):
def test_on_go_live_live_controller():
"""
Test that when the on_go_live() method is called the message is sent to the live controller and focus is
set correctly.
@ -268,7 +268,8 @@ class TestSlideController(TestCase):
mocked_live_controller.add_service_manager_item.assert_called_once_with(mocked_service_item, 1)
mocked_live_controller.preview_widget.setFocus.assert_called_once_with()
def test_on_go_live_service_manager(self):
def test_on_go_live_service_manager():
"""
Test that when the on_go_live() method is called the message is sent to the live controller and focus is
set correctly.
@ -299,7 +300,8 @@ class TestSlideController(TestCase):
mocked_service_manager.preview_live.assert_called_once_with(42, 1)
mocked_live_controller.preview_widget.setFocus.assert_called_once_with()
def test_service_previous(self):
def test_service_previous():
"""
Check that calling the service_previous() method adds the previous key to the queue and processes the queue
"""
@ -317,7 +319,8 @@ class TestSlideController(TestCase):
mocked_keypress_queue.append.assert_called_once_with(ServiceItemAction.Previous)
mocked_process_queue.assert_called_once_with()
def test_service_next(self):
def test_service_next():
"""
Check that calling the service_next() method adds the next key to the queue and processes the queue
"""
@ -335,16 +338,14 @@ class TestSlideController(TestCase):
mocked_keypress_queue.append.assert_called_once_with(ServiceItemAction.Next)
mocked_process_queue.assert_called_once_with()
@patch('openlp.core.ui.slidecontroller.Settings')
def test_update_slide_limits(self, MockedSettings):
def test_update_slide_limits(mock_settings):
"""
Test that calling the update_slide_limits() method updates the slide limits
"""
# GIVEN: A mocked out Settings object, a new SlideController and a mocked out main_window
mocked_value = MagicMock(return_value=10)
MockedSettings.return_value = MagicMock(value=mocked_value)
mock_settings.value.return_value = 10
mocked_main_window = MagicMock(advanced_settings_section='advanced')
Registry.create()
Registry().register('main_window', mocked_main_window)
slide_controller = SlideController(None)
@ -352,10 +353,12 @@ class TestSlideController(TestCase):
slide_controller.update_slide_limits()
# THEN: The value of slide_limits should be 10
mocked_value.assert_called_once_with('advanced/slide limits')
msv = mock_settings.value
msv.assert_called_once_with('advanced/slide limits')
assert 10 == slide_controller.slide_limits, 'Slide limits should have been updated to 10'
def test_enable_tool_bar_live(self):
def test_enable_tool_bar_live():
"""
Check that when enable_tool_bar on a live slide controller is called, enable_live_tool_bar is called
"""
@ -375,7 +378,8 @@ class TestSlideController(TestCase):
mocked_enable_live_tool_bar.assert_called_once_with(mocked_service_item)
assert 0 == mocked_enable_preview_tool_bar.call_count, 'The preview method should not have been called'
def test_enable_tool_bar_preview(self):
def test_enable_tool_bar_preview():
"""
Check that when enable_tool_bar on a preview slide controller is called, enable_preview_tool_bar is called
"""
@ -395,7 +399,8 @@ class TestSlideController(TestCase):
mocked_enable_preview_tool_bar.assert_called_once_with(mocked_service_item)
assert 0 == mocked_enable_live_tool_bar.call_count, 'The live method should not have been called'
def test_refresh_service_item_text(self):
def test_refresh_service_item_text():
"""
Test that the refresh_service_item() method refreshes a text service item
"""
@ -418,7 +423,8 @@ class TestSlideController(TestCase):
mocked_service_item.render.assert_called_once_with()
mocked_process_item.assert_called_once_with(mocked_service_item, 5)
def test_refresh_service_item_image(self):
def test_refresh_service_item_image():
"""
Test that the refresh_service_item() method refreshes a image service item
"""
@ -441,7 +447,8 @@ class TestSlideController(TestCase):
mocked_service_item.render.assert_called_once_with()
mocked_process_item.assert_called_once_with(mocked_service_item, 5)
def test_refresh_service_item_not_image_or_text(self):
def test_refresh_service_item_not_image_or_text():
"""
Test that the refresh_service_item() method does not refresh a service item if it's neither text or an image
"""
@ -464,7 +471,8 @@ class TestSlideController(TestCase):
assert 0 == mocked_service_item.render.call_count, 'The render() method should not have been called'
assert 0 == mocked_process_item.call_count, 'The mocked_process_item() method should not have been called'
def test_add_service_item_with_song_edit(self):
def test_add_service_item_with_song_edit():
"""
Test the add_service_item() method when song_edit is True
"""
@ -483,7 +491,8 @@ class TestSlideController(TestCase):
assert slide_controller.song_edit is False, 'song_edit should be False'
mocked_process_item.assert_called_once_with(mocked_item, 2)
def test_add_service_item_without_song_edit(self):
def test_add_service_item_without_song_edit():
"""
Test the add_service_item() method when song_edit is False
"""
@ -502,7 +511,8 @@ class TestSlideController(TestCase):
assert slide_controller.song_edit is False, 'song_edit should be False'
mocked_process_item.assert_called_once_with(mocked_item, 0)
def test_replace_service_manager_item_different_items(self):
def test_replace_service_manager_item_different_items():
"""
Test that when the service items are not the same, nothing happens
"""
@ -523,7 +533,8 @@ class TestSlideController(TestCase):
assert 0 == mocked_preview_widget.current_slide_number.call_count, \
'The preview_widget current_slide_number.() method should not have been called'
def test_replace_service_manager_item_same_item(self):
def test_replace_service_manager_item_same_item():
"""
Test that when the service item is the same, the service item is reprocessed
"""
@ -544,7 +555,8 @@ class TestSlideController(TestCase):
mocked_preview_widget.current_slide_number.assert_called_with()
mocked_process_item.assert_called_once_with(mocked_item, 7)
def test_on_slide_blank(self):
def test_on_slide_blank():
"""
Test on_slide_blank
"""
@ -558,7 +570,8 @@ class TestSlideController(TestCase):
# THEN: on_blank_display should have been called with True
slide_controller.on_blank_display.assert_called_once_with(True)
def test_on_slide_unblank(self):
def test_on_slide_unblank():
"""
Test on_slide_unblank
"""
@ -572,7 +585,8 @@ class TestSlideController(TestCase):
# THEN: on_blank_display should have been called with False
slide_controller.on_blank_display.assert_called_once_with(False)
def test_on_slide_selected_index_no_service_item(self):
def test_on_slide_selected_index_no_service_item():
"""
Test that when there is no service item, the on_slide_selected_index() method returns immediately
"""
@ -587,8 +601,9 @@ class TestSlideController(TestCase):
# THEN: It should have exited early
assert 0 == mocked_item.is_command.call_count, 'The service item should have not been called'
@patch.object(Registry, 'execute')
def test_on_slide_selected_index_service_item_command(self, mocked_execute):
def test_on_slide_selected_index_service_item_command(mocked_execute):
"""
Test that when there is a command service item, the command is executed
"""
@ -617,8 +632,9 @@ class TestSlideController(TestCase):
assert 0 == mocked_preview_widget.change_slide.call_count, 'Change slide should not have been called'
assert 0 == mocked_slide_selected.call_count, 'slide_selected should not have been called'
@patch.object(Registry, 'execute')
def test_on_slide_selected_index_service_item_not_command(self, mocked_execute):
def test_on_slide_selected_index_service_item_not_command(mocked_execute):
"""
Test that when there is a service item but it's not a command, the preview widget is updated
"""
@ -646,8 +662,9 @@ class TestSlideController(TestCase):
mocked_preview_widget.change_slide.assert_called_once_with(7)
mocked_slide_selected.assert_called_once_with()
@patch.object(Registry, 'execute')
def test_process_item(self, mocked_execute):
def test_process_item(mocked_execute):
"""
Test that presentation service-items is closed when followed by a media service-item
"""
@ -667,8 +684,8 @@ class TestSlideController(TestCase):
mocked_media_item.is_image.return_value = False
mocked_media_item.from_service = False
mocked_media_item.get_frames.return_value = []
Registry.create()
mocked_main_window = MagicMock()
Registry.create()
Registry().register('main_window', mocked_main_window)
Registry().register('media_controller', MagicMock())
slide_controller = SlideController(None)
@ -693,7 +710,8 @@ class TestSlideController(TestCase):
assert 'mocked_presentation_item_stop' == mocked_execute.call_args_list[1][0][0], \
'The presentation should have been stopped.'
def test_live_stolen_focus_shortcuts(self):
def test_live_stolen_focus_shortcuts():
"""
Test that all the needed shortcuts are available in scenarios where Live has stolen focus.
These are found under def __add_actions_to_widget(self, widget): in slidecontroller.py
@ -721,20 +739,19 @@ class TestSlideController(TestCase):
slide_controller.theme_screen, slide_controller.blank_screen
])
@patch('openlp.core.ui.slidecontroller.Settings')
def test_on_preview_double_click_unblank_display(self, MockedSettings):
# GIVEN: A slide controller, actions needed, settins set to True.
def test_on_preview_double_click_unblank_display(mock_settings):
# GIVEN: A slide controller, actions needed, settings set to True.
slide_controller = SlideController(None)
mocked_settings = MagicMock()
mocked_settings.return_value = True
MockedSettings.return_value = mocked_settings
mock_settings.return_value = mocked_settings
slide_controller.service_item = MagicMock()
slide_controller.service_item.is_media = MagicMock()
slide_controller.on_media_close = MagicMock()
slide_controller.on_go_live = MagicMock()
slide_controller.on_preview_add_to_service = MagicMock()
slide_controller.media_reset = MagicMock()
Registry.create()
Registry().set_flag('has doubleclick added item to service', True)
# WHEN: on_preview_double_click is called
@ -744,20 +761,17 @@ class TestSlideController(TestCase):
assert 1 == slide_controller.on_go_live.call_count, 'on_go_live should have been called once.'
assert 0 == slide_controller.on_preview_add_to_service.call_count, 'Should have not been called.'
@patch('openlp.core.ui.slidecontroller.Settings')
def test_on_preview_double_click_add_to_service(self, MockedSettings):
# GIVEN: A slide controller, actions needed, settins set to False.
def test_on_preview_double_click_add_to_service(mock_settings):
# GIVEN: A slide controller, actions needed, settings set to False.
slide_controller = SlideController(None)
mocked_settings = MagicMock()
mocked_settings.value.return_value = False
MockedSettings.return_value = mocked_settings
mock_settings.value.return_value = False
slide_controller.service_item = MagicMock()
slide_controller.service_item.is_media = MagicMock()
slide_controller.on_media_close = MagicMock()
slide_controller.on_go_live = MagicMock()
slide_controller.on_preview_add_to_service = MagicMock()
slide_controller.media_reset = MagicMock()
Registry.create()
Registry().set_flag('has doubleclick added item to service', False)
# WHEN: on_preview_double_click is called
@ -767,9 +781,10 @@ class TestSlideController(TestCase):
assert 0 == slide_controller.on_go_live.call_count, 'on_go_live Should have not been called.'
assert 1 == slide_controller.on_preview_add_to_service.call_count, 'Should have been called once.'
@patch(u'openlp.core.ui.slidecontroller.SlideController.image_manager')
@patch(u'PyQt5.QtCore.QTimer.singleShot')
def test_update_preview_live(self, mocked_singleShot, mocked_image_manager):
def test_update_preview_live(mocked_singleShot, mocked_image_manager):
"""
Test that the preview screen is updated with a screen grab for live service items
"""
@ -809,9 +824,10 @@ class TestSlideController(TestCase):
assert 2 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should have been called 2 times'
assert 0 == mocked_image_manager.get_image.call_count, 'image_manager not be called'
@patch(u'openlp.core.ui.slidecontroller.SlideController.image_manager')
@patch(u'PyQt5.QtCore.QTimer.singleShot')
def test_update_preview_pres(self, mocked_singleShot, mocked_image_manager):
def test_update_preview_pres(mocked_singleShot, mocked_image_manager):
"""
Test that the preview screen is updated with the correct preview for presentation service items
"""
@ -849,11 +865,11 @@ class TestSlideController(TestCase):
# THEN: setPixmap and the image_manager should have been called
assert 1 == slide_controller.preview_display.set_single_image.call_count, 'set_single_image should be called'
assert 0 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should not be called'
# assert 1 == mocked_image_manager.get_image.call_count, 'image_manager should be called'
@patch(u'openlp.core.ui.slidecontroller.SlideController.image_manager')
@patch(u'PyQt5.QtCore.QTimer.singleShot')
def test_update_preview_media(self, mocked_singleShot, mocked_image_manager):
def test_update_preview_media(mocked_singleShot, mocked_image_manager):
"""
Test that the preview screen is updated with the correct preview for media service items
"""
@ -893,9 +909,10 @@ class TestSlideController(TestCase):
assert 0 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should not be called'
assert 0 == mocked_image_manager.get_image.call_count, 'image_manager should not be called'
@patch(u'openlp.core.ui.slidecontroller.SlideController.image_manager')
@patch(u'PyQt5.QtCore.QTimer.singleShot')
def test_update_preview_image(self, mocked_singleShot, mocked_image_manager):
def test_update_preview_image(mocked_singleShot, mocked_image_manager):
"""
Test that the preview screen is updated with the correct preview for image service items
"""
@ -935,14 +952,14 @@ class TestSlideController(TestCase):
assert 0 == mocked_image_manager.get_image.call_count, 'image_manager should not be called'
class TestInfoLabel(TestCase):
def test_paint_event_text_fits(self):
def test_paint_event_text_fits():
"""
Test the paintEvent method when text fits the label
"""
font = QtGui.QFont()
metrics = QtGui.QFontMetrics(font)
with patch('openlp.core.ui.slidecontroller.QtWidgets.QLabel'), \
patch('openlp.core.ui.slidecontroller.QtGui.QFontMetrics') as MockFontMetrics, \
patch('openlp.core.ui.slidecontroller.QtGui.QPainter') as mocked_qpainter:
# GIVEN: An instance of InfoLabel, with mocked text return, width and rect methods
@ -955,28 +972,28 @@ class TestInfoLabel(TestCase):
info_label.rect = mocked_rect
info_label.text = mocked_text
info_label.width = mocked_width
mocked_font_metrics = MagicMock()
mocked_font_metrics.elidedText.return_value = test_string
MockFontMetrics.return_value = mocked_font_metrics
# WHEN: The instance is wider than its text, and the paintEvent method is called
info_label.width.return_value = metrics.boundingRect(test_string).width() + 20
info_label.paintEvent(MagicMock())
# THEN: The text should be drawn centered with the complete test_string
mocked_qpainter().drawText.assert_called_once_with(mocked_rect(), QtCore.Qt.AlignCenter, test_string)
def test_paint_event_text_doesnt_fit(self):
def test_paint_event_text_doesnt_fit():
"""
Test the paintEvent method when text fits the label
"""
font = QtGui.QFont()
metrics = QtGui.QFontMetrics(font)
with patch('openlp.core.ui.slidecontroller.QtWidgets.QLabel'), \
patch('openlp.core.ui.slidecontroller.QtGui.QFontMetrics') as MockFontMetrics, \
patch('openlp.core.ui.slidecontroller.QtGui.QPainter') as mocked_qpainter:
# GIVEN: An instance of InfoLabel, with mocked text return, width and rect methods
info_label = InfoLabel()
test_string = 'Label Text'
elided_test_string = test_string[0:5] + '...'
mocked_rect = MagicMock()
mocked_text = MagicMock()
mocked_width = MagicMock()
@ -984,18 +1001,19 @@ class TestInfoLabel(TestCase):
info_label.rect = mocked_rect
info_label.text = mocked_text
info_label.width = mocked_width
mocked_font_metrics = MagicMock()
mocked_font_metrics.elidedText.return_value = elided_test_string
MockFontMetrics.return_value = mocked_font_metrics
# WHEN: The instance is narrower than its text, and the paintEvent method is called
label_width = metrics.boundingRect(test_string).width() - 20
info_label.width.return_value = label_width
info_label.paintEvent(MagicMock())
# THEN: The text should be drawn aligned left with an elided test_string
elided_test_string = metrics.elidedText(test_string, QtCore.Qt.ElideRight, label_width)
mocked_qpainter().drawText.assert_called_once_with(mocked_rect(), QtCore.Qt.AlignLeft, elided_test_string)
@patch('builtins.super')
def test_set_text(self, mocked_super):
def test_set_text(mocked_super):
"""
Test the reimplemented setText method
"""
@ -1012,9 +1030,7 @@ class TestInfoLabel(TestCase):
mocked_super().setText.assert_called_once_with('Label Text')
class TestLiveController(TestCase):
def test_initial_live_controller(self):
def test_initial_live_controller():
"""
Test the initial live slide controller state .
"""
@ -1027,9 +1043,7 @@ class TestLiveController(TestCase):
assert live_controller.is_live is True, 'The slide controller should be a live controller'
class TestPreviewLiveController(TestCase):
def test_initial_preview_controller(self):
def test_initial_preview_controller():
"""
Test the initial preview slide controller state.
"""