forked from openlp/openlp
Merge branch 'projector-manager-tests' into 'master'
refactor tests for projector manager 2022-02-21 See merge request openlp/openlp!420
This commit is contained in:
commit
6ee7c33805
@ -332,9 +332,9 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
NOTE: Check if PJLinkUDP port needs to be started when adding
|
NOTE: Check if PJLinkUDP port needs to be started when adding
|
||||||
"""
|
"""
|
||||||
if port in self.pjlink_udp:
|
if port in self.pjlink_udp:
|
||||||
log.warning('UDP Listener for port {port} already added - skipping'.format(port=port))
|
log.warning(f'UDP Listener for port {port} already added - skipping')
|
||||||
else:
|
else:
|
||||||
log.debug('Adding UDP listener on port {port}'.format(port=port))
|
log.debug(f'Adding UDP listener on port {port}')
|
||||||
self.pjlink_udp[port] = PJLinkUDP(port=port)
|
self.pjlink_udp[port] = PJLinkUDP(port=port)
|
||||||
Registry().execute('udp_broadcast_add', port=port, callback=self.pjlink_udp[port].check_settings)
|
Registry().execute('udp_broadcast_add', port=port, callback=self.pjlink_udp[port].check_settings)
|
||||||
|
|
||||||
@ -344,20 +344,20 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
|
|
||||||
NOTE: Check if PJLinkUDP port needs to be closed/stopped when deleting
|
NOTE: Check if PJLinkUDP port needs to be closed/stopped when deleting
|
||||||
"""
|
"""
|
||||||
log.debug('Checking for UDP port {port} listener deletion'.format(port=port))
|
log.debug(f'Checking for UDP port {port} listener deletion')
|
||||||
if port not in self.pjlink_udp:
|
if port not in self.pjlink_udp:
|
||||||
log.warning('UDP listener for port {port} not there - skipping delete'.format(port=port))
|
log.warning(f'UDP listener for port {port} not there - skipping delete')
|
||||||
return
|
return
|
||||||
keep_port = False
|
keep_port = False
|
||||||
for item in self.projector_list:
|
for item in self.projector_list:
|
||||||
if port == item.link.port:
|
if port == item.link.port:
|
||||||
keep_port = True
|
keep_port = True
|
||||||
if keep_port:
|
if keep_port:
|
||||||
log.warning('UDP listener for port {port} needed for other projectors - skipping delete'.format(port=port))
|
log.warning(f'UDP listener for port {port} needed for other projectors - skipping delete')
|
||||||
return
|
return
|
||||||
Registry().execute('udp_broadcast_remove', port=port)
|
Registry().execute('udp_broadcast_remove', port=port)
|
||||||
del self.pjlink_udp[port]
|
del self.pjlink_udp[port]
|
||||||
log.debug('UDP listener for port {port} deleted'.format(port=port))
|
log.debug(f'UDP listener for port {port} deleted')
|
||||||
|
|
||||||
def get_settings(self):
|
def get_settings(self):
|
||||||
"""
|
"""
|
||||||
@ -382,7 +382,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
real_projector = item.data(QtCore.Qt.UserRole)
|
real_projector = item.data(QtCore.Qt.UserRole)
|
||||||
projector_name = str(item.text())
|
projector_name = str(item.text())
|
||||||
visible = real_projector.link.status_connect >= S_CONNECTED
|
visible = real_projector.link.status_connect >= S_CONNECTED
|
||||||
log.debug('({name}) Building menu - visible = {visible}'.format(name=projector_name, visible=visible))
|
log.debug(f'({projector_name}) Building menu - visible = {visible}')
|
||||||
self.delete_action.setVisible(True)
|
self.delete_action.setVisible(True)
|
||||||
self.edit_action.setVisible(True)
|
self.edit_action.setVisible(True)
|
||||||
self.connect_action.setVisible(not visible)
|
self.connect_action.setVisible(not visible)
|
||||||
@ -424,7 +424,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
projectordb=self.projectordb,
|
projectordb=self.projectordb,
|
||||||
edit=edit)
|
edit=edit)
|
||||||
source = source_select_form.exec(projector.link)
|
source = source_select_form.exec(projector.link)
|
||||||
log.debug('({ip}) source_select_form() returned {data}'.format(ip=projector.link.ip, data=source))
|
log.debug(f'({projector.link.ip}) source_select_form() returned {source}')
|
||||||
if source is not None and source > 0:
|
if source is not None and source > 0:
|
||||||
projector.link.set_input_source(str(source))
|
projector.link.set_input_source(str(source))
|
||||||
return
|
return
|
||||||
@ -465,10 +465,10 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
projector = item.data(QtCore.Qt.UserRole)
|
projector = item.data(QtCore.Qt.UserRole)
|
||||||
if QSOCKET_STATE[projector.link.state()] != S_CONNECTED:
|
if QSOCKET_STATE[projector.link.state()] != S_CONNECTED:
|
||||||
try:
|
try:
|
||||||
log.debug('ProjectorManager: Calling connect_to_host() on "{ip}"'.format(ip=projector.link.ip))
|
log.debug(f'ProjectorManager: Calling connect_to_host() on "{projector.link.ip}"')
|
||||||
projector.link.connect_to_host()
|
projector.link.connect_to_host()
|
||||||
except Exception:
|
except Exception:
|
||||||
log.debug('ProjectorManager: "{ip}" already connected - skipping'.format(ip=projector.link.ip))
|
log.debug(f'ProjectorManager: "{projector.link.ip}" already connected - skipping')
|
||||||
return
|
return
|
||||||
|
|
||||||
def on_connect_projector(self, opt=None):
|
def on_connect_projector(self, opt=None):
|
||||||
@ -501,9 +501,9 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
projector = list_item.data(QtCore.Qt.UserRole)
|
projector = list_item.data(QtCore.Qt.UserRole)
|
||||||
msg = QtWidgets.QMessageBox()
|
msg = QtWidgets.QMessageBox()
|
||||||
msg.setText(translate('OpenLP.ProjectorManager',
|
msg.setText(translate('OpenLP.ProjectorManager',
|
||||||
'Delete projector ({ip}) {name}?'.format(ip=projector.link.ip,
|
f'Delete projector ({projector.link.ip}) {projector.link.name}?'))
|
||||||
name=projector.link.name)))
|
msg.setInformativeText(translate('OpenLP.ProjectorManager',
|
||||||
msg.setInformativeText(translate('OpenLP.ProjectorManager', 'Are you sure you want to delete this projector?'))
|
'Are you sure you want to delete this projector?'))
|
||||||
msg.setStandardButtons(msg.Cancel | msg.Ok)
|
msg.setStandardButtons(msg.Cancel | msg.Ok)
|
||||||
msg.setDefaultButton(msg.Cancel)
|
msg.setDefaultButton(msg.Cancel)
|
||||||
ans = msg.exec()
|
ans = msg.exec()
|
||||||
@ -541,16 +541,16 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
new_list = []
|
new_list = []
|
||||||
for item in self.projector_list:
|
for item in self.projector_list:
|
||||||
if item.link.db_item.id == projector.link.db_item.id:
|
if item.link.db_item.id == projector.link.db_item.id:
|
||||||
log.debug('Removing projector "{item}"'.format(item=item.link.name))
|
log.debug(f'Removing projector "{item.link.name}"')
|
||||||
continue
|
continue
|
||||||
new_list.append(item)
|
new_list.append(item)
|
||||||
self.projector_list = new_list
|
self.projector_list = new_list
|
||||||
list_item = self.projector_list_widget.takeItem(self.projector_list_widget.currentRow())
|
list_item = self.projector_list_widget.takeItem(self.projector_list_widget.currentRow())
|
||||||
list_item = None
|
list_item = None
|
||||||
if not self.projectordb.delete_projector(projector.db_item):
|
if not self.projectordb.delete_projector(projector.db_item):
|
||||||
log.warning('Delete projector {item} failed'.format(item=projector.db_item))
|
log.warning(f'Delete projector {projector.db_item} failed')
|
||||||
for item in self.projector_list:
|
for item in self.projector_list:
|
||||||
log.debug('New projector list - item: {ip} {name}'.format(ip=item.link.ip, name=item.link.name))
|
log.debug(f'New projector list - item: {item.link.ip} {item.link.name}')
|
||||||
self.udp_listen_delete(old_port)
|
self.udp_listen_delete(old_port)
|
||||||
|
|
||||||
def on_disconnect_projector(self, opt=None):
|
def on_disconnect_projector(self, opt=None):
|
||||||
@ -760,7 +760,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
if start:
|
if start:
|
||||||
item.link.connect_to_host()
|
item.link.connect_to_host()
|
||||||
for item in self.projector_list:
|
for item in self.projector_list:
|
||||||
log.debug('New projector list - item: ({ip}) {name}'.format(ip=item.link.ip, name=item.link.name))
|
log.debug(f'New projector list - item: ({item.link.ip}) {item.link.name}')
|
||||||
|
|
||||||
@QtCore.pyqtSlot(str)
|
@QtCore.pyqtSlot(str)
|
||||||
def add_projector_from_wizard(self, ip, opts=None):
|
def add_projector_from_wizard(self, ip, opts=None):
|
||||||
@ -770,7 +770,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
:param ip: IP address of new record item to find
|
:param ip: IP address of new record item to find
|
||||||
:param opts: Needed by PyQt5
|
:param opts: Needed by PyQt5
|
||||||
"""
|
"""
|
||||||
log.debug('add_projector_from_wizard(ip={ip})'.format(ip=ip))
|
log.debug(f'add_projector_from_wizard(ip={ip})')
|
||||||
item = self.projectordb.get_projector_by_ip(ip)
|
item = self.projectordb.get_projector_by_ip(ip)
|
||||||
self.add_projector(item)
|
self.add_projector(item)
|
||||||
|
|
||||||
@ -781,7 +781,7 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
|
|
||||||
:param projector: Projector() instance of projector with updated information
|
:param projector: Projector() instance of projector with updated information
|
||||||
"""
|
"""
|
||||||
log.debug('edit_projector_from_wizard(ip={ip})'.format(ip=projector.ip))
|
log.debug(f'edit_projector_from_wizard(ip={projector.ip})')
|
||||||
old_port = self.old_projector.link.port
|
old_port = self.old_projector.link.port
|
||||||
old_ip = self.old_projector.link.ip
|
old_ip = self.old_projector.link.ip
|
||||||
self.old_projector.link.name = projector.name
|
self.old_projector.link.name = projector.name
|
||||||
@ -836,22 +836,22 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
item = list_item
|
item = list_item
|
||||||
break
|
break
|
||||||
if item is None:
|
if item is None:
|
||||||
log.error('ProjectorManager: Unknown item "{ip}" - not updating status'.format(ip=ip))
|
log.error(f'ProjectorManager: Unknown item "{ip}" - not updating status')
|
||||||
return
|
return
|
||||||
elif item.status == status:
|
elif item.status == status:
|
||||||
log.debug('ProjectorManager: No status change for "{ip}" - not updating status'.format(ip=ip))
|
log.debug(f'ProjectorManager: No status change for "{ip}" - not updating status')
|
||||||
return
|
return
|
||||||
|
|
||||||
item.status = status
|
item.status = status
|
||||||
item.icon = self.status_icons[status]
|
item.icon = self.status_icons[status]
|
||||||
log.debug('({name}) Updating icon with {code}'.format(name=item.link.name, code=STATUS_CODE[status]))
|
log.debug(f'({item.link.name}) Updating icon with {STATUS_CODE[status]}')
|
||||||
item.widget.setIcon(item.icon)
|
item.widget.setIcon(item.icon)
|
||||||
return self.update_icons()
|
return self.update_icons()
|
||||||
|
|
||||||
def get_toolbar_item(self, name, enabled=False, hidden=False):
|
def get_toolbar_item(self, name, enabled=False, hidden=False):
|
||||||
item = self.one_toolbar.findChild(QtWidgets.QAction, name)
|
item = self.one_toolbar.findChild(QtWidgets.QAction, name)
|
||||||
if item == 0:
|
if item == 0:
|
||||||
log.debug('No item found with name "{name}"'.format(name=name))
|
log.debug(f'No item found with name "{name}"')
|
||||||
return
|
return
|
||||||
item.setVisible(False if hidden else True)
|
item.setVisible(False if hidden else True)
|
||||||
item.setEnabled(True if enabled else False)
|
item.setEnabled(True if enabled else False)
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
# -*- 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 <https://www.gnu.org/licenses/>. #
|
|
||||||
##########################################################################
|
|
||||||
"""
|
|
||||||
:mod tests/openlp_core/projectors: Tests for projector code
|
|
||||||
"""
|
|
@ -1,23 +0,0 @@
|
|||||||
# -*- 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 <https://www.gnu.org/licenses/>. #
|
|
||||||
##########################################################################
|
|
||||||
"""
|
|
||||||
:mod tests/openlp_core/projectors/commands: Tests for PJLink commands
|
|
||||||
"""
|
|
@ -19,12 +19,63 @@
|
|||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||||
##########################################################################
|
##########################################################################
|
||||||
"""
|
"""
|
||||||
Package to test the openlp.core.projectors.pjlink command routing.
|
Fixtures for projector tests
|
||||||
"""
|
"""
|
||||||
import pytest
|
import pytest
|
||||||
from openlp.core.projectors.db import Projector
|
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from openlp.core.projectors.db import Projector, ProjectorDB
|
||||||
|
from openlp.core.projectors.manager import ProjectorManager
|
||||||
from openlp.core.projectors.pjlink import PJLink
|
from openlp.core.projectors.pjlink import PJLink
|
||||||
from tests.resources.projector.data import TEST1_DATA
|
from tests.resources.projector.data import TEST_DB, TEST1_DATA
|
||||||
|
|
||||||
|
'''
|
||||||
|
NOTE: Since Registry is a singleton, sleight of hand allows us to verify
|
||||||
|
calls to Registry.methods()
|
||||||
|
|
||||||
|
@patch(path.to.imported.Registry)
|
||||||
|
def test_function(mock_registry):
|
||||||
|
mocked_registry = MagicMock()
|
||||||
|
mock_registry.return_value = mocked_registry
|
||||||
|
...
|
||||||
|
assert mocked_registry.method.has_call(...)
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def projector_manager(settings):
|
||||||
|
with patch('openlp.core.projectors.db.init_url') as mocked_init_url:
|
||||||
|
mocked_init_url.return_value = 'sqlite:///%s' % TEST_DB
|
||||||
|
projectordb = ProjectorDB()
|
||||||
|
proj_manager = ProjectorManager(projectordb=projectordb)
|
||||||
|
yield proj_manager
|
||||||
|
projectordb.session.close()
|
||||||
|
del proj_manager
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def projector_manager_nodb(settings):
|
||||||
|
proj_manager = ProjectorManager(projectordb=None)
|
||||||
|
yield proj_manager
|
||||||
|
del proj_manager
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def projector_manager_mtdb(settings):
|
||||||
|
with patch('openlp.core.projectors.db.init_url') as mock_url:
|
||||||
|
mock_url.return_value = 'sqlite:///%s' % TEST_DB
|
||||||
|
t_db = ProjectorDB()
|
||||||
|
# Ensure we have an empty DB at the beginning of the test
|
||||||
|
for itm in t_db.get_projector_all():
|
||||||
|
t_db.delete_projector(itm)
|
||||||
|
t_db.session.commit()
|
||||||
|
|
||||||
|
t_manager = ProjectorManager(projectordb=t_db)
|
||||||
|
yield t_manager
|
||||||
|
t_db.session.close()
|
||||||
|
del t_db
|
||||||
|
del t_manager
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
|
153
tests/openlp_core/projectors/manager/test_boostrap.py
Normal file
153
tests/openlp_core/projectors/manager/test_boostrap.py
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
# -*- 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 <https://www.gnu.org/licenses/>. #
|
||||||
|
##########################################################################
|
||||||
|
"""
|
||||||
|
Test ProjectorManager.bootstrap_* methods
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
import openlp.core.projectors.manager
|
||||||
|
|
||||||
|
from unittest.mock import DEFAULT, MagicMock, patch
|
||||||
|
|
||||||
|
test_module = openlp.core.projectors.manager.__name__
|
||||||
|
|
||||||
|
|
||||||
|
@patch('openlp.core.projectors.manager.ProjectorDB')
|
||||||
|
def test_bootstrap_initialise(mock_db, projector_manager, caplog):
|
||||||
|
"""
|
||||||
|
Test ProjectorManager initializes with existing ProjectorDB instance
|
||||||
|
"""
|
||||||
|
# GIVEN: Test setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
logs = [(test_module, logging.DEBUG, 'Using existing ProjectorDB() instance')]
|
||||||
|
|
||||||
|
with patch.multiple(projector_manager,
|
||||||
|
setup_ui=DEFAULT,
|
||||||
|
get_settings=DEFAULT) as mock_manager:
|
||||||
|
|
||||||
|
# WHEN: we call bootstrap_initialise
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.bootstrap_initialise()
|
||||||
|
|
||||||
|
# THEN: Appropriate entries and actions
|
||||||
|
assert caplog.record_tuples == logs, 'Invalid log entries'
|
||||||
|
mock_manager['setup_ui'].assert_called_once()
|
||||||
|
mock_manager['get_settings'].assert_called_once()
|
||||||
|
mock_db.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
|
@patch('openlp.core.projectors.manager.ProjectorDB')
|
||||||
|
def test_bootstrap_initialise_nodb(mock_db, projector_manager_nodb, caplog):
|
||||||
|
"""
|
||||||
|
Test ProjectorManager initializes with a new ProjectorDB instance
|
||||||
|
"""
|
||||||
|
# GIVEN: Test setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
logs = [(test_module, logging.DEBUG, 'Creating new ProjectorDB() instance')]
|
||||||
|
|
||||||
|
with patch.multiple(projector_manager_nodb,
|
||||||
|
setup_ui=DEFAULT,
|
||||||
|
get_settings=DEFAULT) as mock_manager:
|
||||||
|
|
||||||
|
# WHEN: we call bootstrap_initialise
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager_nodb.bootstrap_initialise()
|
||||||
|
|
||||||
|
# THEN: Appropriate entries and actions
|
||||||
|
assert caplog.record_tuples == logs, 'Invalid log entries'
|
||||||
|
mock_manager['setup_ui'].assert_called_once()
|
||||||
|
mock_manager['get_settings'].assert_called_once()
|
||||||
|
mock_db.assert_called_once()
|
||||||
|
|
||||||
|
|
||||||
|
@patch('openlp.core.projectors.manager.ProjectorEditForm')
|
||||||
|
@patch('openlp.core.projectors.manager.QtCore.QTimer')
|
||||||
|
def test_bootstrap_post_set_up_autostart_false(mock_timer, mocked_edit, projector_manager, settings, caplog):
|
||||||
|
"""
|
||||||
|
Test post-initialize calls proper setups
|
||||||
|
"""
|
||||||
|
# GIVEN: Test setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
logs = [(test_module, logging.DEBUG, 'Loading all projectors')]
|
||||||
|
|
||||||
|
mock_newProjector = MagicMock()
|
||||||
|
mock_editProjector = MagicMock()
|
||||||
|
mock_edit = MagicMock()
|
||||||
|
mock_edit.newProjector = mock_newProjector
|
||||||
|
mock_edit.editProjector = mock_editProjector
|
||||||
|
mocked_edit.return_value = mock_edit
|
||||||
|
|
||||||
|
settings.setValue('projector/connect on start', False)
|
||||||
|
projector_manager.bootstrap_initialise()
|
||||||
|
|
||||||
|
with patch.multiple(projector_manager,
|
||||||
|
_load_projectors=DEFAULT,
|
||||||
|
projector_list_widget=DEFAULT) as mock_manager:
|
||||||
|
|
||||||
|
# WHEN: Call to initialize is run
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.bootstrap_post_set_up()
|
||||||
|
|
||||||
|
# THEN: verify calls and logs
|
||||||
|
mock_timer.assert_not_called()
|
||||||
|
mock_newProjector.connect.assert_called_once()
|
||||||
|
mock_editProjector.connect.assert_called_once()
|
||||||
|
mock_manager['_load_projectors'].assert_called_once(),
|
||||||
|
mock_manager['projector_list_widget'].itemSelectionChanged.connect.assert_called_once()
|
||||||
|
assert caplog.record_tuples == logs, 'Invalid log entries'
|
||||||
|
|
||||||
|
|
||||||
|
@patch('openlp.core.projectors.manager.ProjectorEditForm')
|
||||||
|
@patch('openlp.core.projectors.manager.QtCore.QTimer')
|
||||||
|
def test_bootstrap_post_set_up_autostart_true(mock_timer, mocked_edit, projector_manager, settings, caplog):
|
||||||
|
"""
|
||||||
|
Test post-initialize calls proper setups
|
||||||
|
"""
|
||||||
|
# GIVEN: Test setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
logs = [(test_module, logging.DEBUG, 'Delaying 1.5 seconds before loading all projectors')]
|
||||||
|
|
||||||
|
mock_newProjector = MagicMock()
|
||||||
|
mock_editProjector = MagicMock()
|
||||||
|
mock_edit = MagicMock()
|
||||||
|
mock_edit.newProjector = mock_newProjector
|
||||||
|
mock_edit.editProjector = mock_editProjector
|
||||||
|
|
||||||
|
settings.setValue('projector/connect on start', True)
|
||||||
|
projector_manager.bootstrap_initialise()
|
||||||
|
|
||||||
|
with patch.multiple(projector_manager,
|
||||||
|
_load_projectors=DEFAULT,
|
||||||
|
projector_list_widget=DEFAULT) as mock_manager:
|
||||||
|
mocked_edit.return_value = mock_edit
|
||||||
|
|
||||||
|
# WHEN: Call to initialize is run
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.bootstrap_post_set_up()
|
||||||
|
|
||||||
|
# THEN: verify calls and logs
|
||||||
|
mock_timer.assert_called_once()
|
||||||
|
mock_timer.return_value.singleShot.assert_called_once_with(1500, projector_manager._load_projectors)
|
||||||
|
|
||||||
|
mock_newProjector.connect.assert_called_once()
|
||||||
|
mock_editProjector.connect.assert_called_once()
|
||||||
|
mock_manager['_load_projectors'].assert_not_called(),
|
||||||
|
mock_manager['projector_list_widget'].itemSelectionChanged.connect.assert_called_once()
|
||||||
|
assert caplog.record_tuples == logs, 'Invalid log entries'
|
157
tests/openlp_core/projectors/manager/test_misc_manager.py
Normal file
157
tests/openlp_core/projectors/manager/test_misc_manager.py
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
# -*- 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 <https://www.gnu.org/licenses/>. #
|
||||||
|
##########################################################################
|
||||||
|
"""
|
||||||
|
Test misc. functions with few test paths
|
||||||
|
"""
|
||||||
|
from unittest.mock import DEFAULT, patch
|
||||||
|
|
||||||
|
from openlp.core.projectors.db import Projector
|
||||||
|
|
||||||
|
from tests.resources.projector.data import TEST1_DATA, TEST2_DATA, TEST3_DATA
|
||||||
|
|
||||||
|
|
||||||
|
def test_private_load_projectors(projector_manager_mtdb):
|
||||||
|
"""
|
||||||
|
Test that _load_projectors() retrieves all entries from projector database
|
||||||
|
"""
|
||||||
|
# GIVEN: Test environment
|
||||||
|
t_db = projector_manager_mtdb.projectordb # Shortcut helper
|
||||||
|
for itm in (TEST1_DATA, TEST2_DATA, TEST3_DATA):
|
||||||
|
t_db.add_projector(Projector(**itm))
|
||||||
|
t_db.session.commit()
|
||||||
|
|
||||||
|
t_list = t_db.get_projector_all()
|
||||||
|
|
||||||
|
# Mock to keep from getting event not registered error in Registry()
|
||||||
|
# during bootstrap_post_set_up()
|
||||||
|
# Although we're testing _load_projectors, need to mock
|
||||||
|
# it first to get past bootstrap_post_set_up() before test
|
||||||
|
with patch.multiple(projector_manager_mtdb,
|
||||||
|
udp_listen_add=DEFAULT,
|
||||||
|
udp_listen_delete=DEFAULT,
|
||||||
|
_load_projectors=DEFAULT) as mock_manager:
|
||||||
|
# Satisfy Flake8 linting
|
||||||
|
mock_manager['udp_listen_add'].return_value = None
|
||||||
|
projector_manager_mtdb.bootstrap_initialise()
|
||||||
|
projector_manager_mtdb.bootstrap_post_set_up()
|
||||||
|
|
||||||
|
# WHEN: Called
|
||||||
|
projector_manager_mtdb._load_projectors()
|
||||||
|
|
||||||
|
assert len(projector_manager_mtdb.projector_list) == len(t_list), \
|
||||||
|
'Invalid number of entries between check and list'
|
||||||
|
|
||||||
|
# Isolate the DB entries used to create projector_manager.projector_list
|
||||||
|
t_chk = []
|
||||||
|
for dbitem in projector_manager_mtdb.projector_list:
|
||||||
|
t_chk.append(dbitem.db_item)
|
||||||
|
|
||||||
|
assert t_chk == t_list, 'projector_list DB items do not match test items'
|
||||||
|
|
||||||
|
|
||||||
|
def test_on_edit_input(projector_manager):
|
||||||
|
"""
|
||||||
|
Test calling edit projector input GUI from input selection icon makes appropriate calls
|
||||||
|
"""
|
||||||
|
# GIVEN: Test environment
|
||||||
|
with patch.object(projector_manager, 'on_select_input') as mock_edit:
|
||||||
|
|
||||||
|
# WHEN: Called
|
||||||
|
projector_manager.on_edit_input()
|
||||||
|
|
||||||
|
# THEN: select input called with edit option
|
||||||
|
mock_edit.assert_called_with(opt=None, edit=True)
|
||||||
|
|
||||||
|
|
||||||
|
def test_on_add_projector(projector_manager):
|
||||||
|
"""
|
||||||
|
Test add new projector edit GUI is called properly
|
||||||
|
"""
|
||||||
|
# GIVEN: Test environment
|
||||||
|
# Mock to keep from getting event not registered error in Registry()
|
||||||
|
# during bootstrap_post_set_up()
|
||||||
|
with patch.multiple(projector_manager,
|
||||||
|
udp_listen_add=DEFAULT,
|
||||||
|
udp_listen_delete=DEFAULT) as mock_manager:
|
||||||
|
# Satisfy Flake8 linting
|
||||||
|
mock_manager['udp_listen_add'].return_value = None
|
||||||
|
projector_manager.bootstrap_initialise()
|
||||||
|
projector_manager.bootstrap_post_set_up()
|
||||||
|
|
||||||
|
with patch.object(projector_manager, 'projector_form') as mock_form:
|
||||||
|
|
||||||
|
# WHEN called
|
||||||
|
projector_manager.on_add_projector()
|
||||||
|
|
||||||
|
# THEN: projector form called
|
||||||
|
mock_form.exec.assert_called_once()
|
||||||
|
|
||||||
|
|
||||||
|
def test_add_projector_from_wizard(projector_manager):
|
||||||
|
"""
|
||||||
|
Test when add projector from GUI, appropriate method is called correctly
|
||||||
|
"""
|
||||||
|
# GIVEN: Test environment
|
||||||
|
with patch.multiple(projector_manager,
|
||||||
|
projectordb=DEFAULT,
|
||||||
|
add_projector=DEFAULT) as mock_manager:
|
||||||
|
t_item = Projector(**TEST1_DATA)
|
||||||
|
|
||||||
|
mock_manager['projectordb'].get_projector_by_ip.return_value = t_item
|
||||||
|
|
||||||
|
# WHEN: Called
|
||||||
|
projector_manager.add_projector_from_wizard(ip=t_item.ip)
|
||||||
|
|
||||||
|
# THEN: appropriate calls made
|
||||||
|
mock_manager['add_projector'].assert_called_with(t_item)
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_projector_list(projector_manager_mtdb):
|
||||||
|
"""
|
||||||
|
Test get_projector_list() returns valid entries
|
||||||
|
"""
|
||||||
|
# GIVEN: Test environment
|
||||||
|
t_db = projector_manager_mtdb.projectordb # Shortcut helper
|
||||||
|
for itm in (TEST1_DATA, TEST2_DATA, TEST3_DATA):
|
||||||
|
t_db.add_projector(Projector(**itm))
|
||||||
|
t_list = t_db.get_projector_all()
|
||||||
|
|
||||||
|
# Mock to keep from getting event not registered error in Registry()
|
||||||
|
# during bootstrap_post_set_up()
|
||||||
|
with patch.multiple(projector_manager_mtdb,
|
||||||
|
udp_listen_add=DEFAULT,
|
||||||
|
udp_listen_delete=DEFAULT) as mock_manager:
|
||||||
|
# Satisfy Flake8 linting
|
||||||
|
mock_manager['udp_listen_add'].return_value = None
|
||||||
|
projector_manager_mtdb.bootstrap_initialise()
|
||||||
|
projector_manager_mtdb.bootstrap_post_set_up()
|
||||||
|
|
||||||
|
# WHEN: Called
|
||||||
|
t_chk = projector_manager_mtdb.get_projector_list()
|
||||||
|
|
||||||
|
# THEN: DB items for both t_list and projector_list are the same
|
||||||
|
assert len(t_chk) == len(t_list), 'projector_list length mismatch with test items length'
|
||||||
|
|
||||||
|
# Isolate the DB entries used to create projector_manager.projector_list
|
||||||
|
t_chk_list = []
|
||||||
|
for dbitem in t_chk:
|
||||||
|
t_chk_list.append(dbitem.db_item)
|
||||||
|
assert t_list == t_chk_list, 'projector_list DB items do not match test items'
|
133
tests/openlp_core/projectors/manager/test_udp.py
Normal file
133
tests/openlp_core/projectors/manager/test_udp.py
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
# -*- 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 <https://www.gnu.org/licenses/>. #
|
||||||
|
##########################################################################
|
||||||
|
"""
|
||||||
|
Test ProjectorManager udp methods
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
|
|
||||||
|
from tests.resources.projector.data import FakePJLinkUDP, FakeProjector
|
||||||
|
|
||||||
|
|
||||||
|
def test_udp_listen_add_duplicate(projector_manager, caplog):
|
||||||
|
"""
|
||||||
|
Test adding UDP port listener to port already registered
|
||||||
|
"""
|
||||||
|
# GIVEN: Initial setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
log_entries = ['UDP Listener for port 10 already added - skipping']
|
||||||
|
port_list = {10: 'port1', 20: 'port2'}
|
||||||
|
projector_manager.pjlink_udp = port_list
|
||||||
|
|
||||||
|
# WHEN: udp_listen_add is called with duplicate port number
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.udp_listen_add(port=10)
|
||||||
|
|
||||||
|
# THEN: Verify log entry and registry entry not called
|
||||||
|
assert projector_manager.pjlink_udp == port_list, "Invalid ports in list"
|
||||||
|
assert caplog.messages == log_entries, "Invalid log entries"
|
||||||
|
|
||||||
|
|
||||||
|
@patch('openlp.core.projectors.manager.PJLinkUDP')
|
||||||
|
@patch('openlp.core.projectors.manager.Registry')
|
||||||
|
def test_udp_listen_add_new(mock_registry, mock_udp, projector_manager, caplog):
|
||||||
|
"""
|
||||||
|
Test adding new UDP port listener
|
||||||
|
"""
|
||||||
|
# GIVEN: Initial setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
mocked_registry = MagicMock()
|
||||||
|
mock_registry.return_value = mocked_registry
|
||||||
|
mock_udp.return_value = FakePJLinkUDP()
|
||||||
|
log_entries = ['Adding UDP listener on port 20']
|
||||||
|
projector_manager.pjlink_udp = {10: 'port1'}
|
||||||
|
# WHEN: Adding new listener
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.udp_listen_add(port=20)
|
||||||
|
# THEN: Appropriate listener and log entries
|
||||||
|
assert 20 in projector_manager.pjlink_udp, "Port not added"
|
||||||
|
assert 2 == len(projector_manager.pjlink_udp), "Invalid ports in list"
|
||||||
|
assert type(projector_manager.pjlink_udp[20]) == FakePJLinkUDP, \
|
||||||
|
'PJLinkUDP instance should have been added'
|
||||||
|
assert mocked_registry.execute.has_call('udp_broadcast_add', port=20)
|
||||||
|
assert caplog.messages == log_entries, 'Invalid log entries'
|
||||||
|
|
||||||
|
|
||||||
|
def test_udp_listen_delete_missing(projector_manager, caplog):
|
||||||
|
"""
|
||||||
|
Test deleting UDP port listener not in list
|
||||||
|
"""
|
||||||
|
# GIVEN: Initial setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
projector_manager.pjlink_udp = {10: 'port1'}
|
||||||
|
log_entries = ['Checking for UDP port 20 listener deletion',
|
||||||
|
'UDP listener for port 20 not there - skipping delete']
|
||||||
|
# WHEN: Deleting port listener from dictinary
|
||||||
|
projector_manager.udp_listen_delete(port=20)
|
||||||
|
# THEN: Log missing port and exit method
|
||||||
|
assert projector_manager.pjlink_udp == {10: 'port1'}, "Invalid ports in list"
|
||||||
|
assert caplog.messages == log_entries, "Invalid log entries"
|
||||||
|
|
||||||
|
|
||||||
|
@patch('openlp.core.projectors.manager.Registry')
|
||||||
|
def test_udp_listen_delete_single(mock_registry, projector_manager, caplog):
|
||||||
|
"""
|
||||||
|
Test deleting UDP listener
|
||||||
|
"""
|
||||||
|
# GIVEN: Initial setup
|
||||||
|
mocked_registry = MagicMock()
|
||||||
|
mock_registry.return_value = mocked_registry
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
log_entries = ['Checking for UDP port 10 listener deletion',
|
||||||
|
'UDP listener for port 10 deleted']
|
||||||
|
port_list = {20: 'port2'}
|
||||||
|
projector_manager.pjlink_udp = {10: 'port1', **port_list}
|
||||||
|
projector_manager.projector_list = [FakeProjector(port=20)]
|
||||||
|
# WHEN: deleting a listener
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.udp_listen_delete(port=10)
|
||||||
|
# THEN: pjlink_udp and logs should have appropriate entries
|
||||||
|
assert caplog.messages == log_entries, 'Invalid log entries'
|
||||||
|
assert projector_manager.pjlink_udp == port_list, 'Invalid ports in list'
|
||||||
|
assert mocked_registry.execute.has_call('udp_broadcast_delete', port=10)
|
||||||
|
|
||||||
|
|
||||||
|
def test_udp_listen_delete_skip(projector_manager, caplog):
|
||||||
|
"""
|
||||||
|
Test not deleting UDP listener
|
||||||
|
"""
|
||||||
|
# GIVEN: Initial setup
|
||||||
|
caplog.set_level(logging.DEBUG)
|
||||||
|
log_entries = ['Checking for UDP port 10 listener deletion',
|
||||||
|
'UDP listener for port 10 needed for other projectors - skipping delete']
|
||||||
|
port_list = {10: 'port1', 20: 'port2'}
|
||||||
|
projector_manager.pjlink_udp = port_list
|
||||||
|
projector_manager.projector_list = [FakeProjector(port=10),
|
||||||
|
FakeProjector(port=20)]
|
||||||
|
# WHEN: deleting a listener
|
||||||
|
caplog.clear()
|
||||||
|
projector_manager.udp_listen_delete(port=10)
|
||||||
|
|
||||||
|
# THEN: pjlink_udp and logs should have appropriate entries
|
||||||
|
assert caplog.messages == log_entries, 'Invalid log entries'
|
||||||
|
assert projector_manager.pjlink_udp == port_list, 'Invalid ports in list'
|
@ -1,251 +0,0 @@
|
|||||||
# -*- 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 <https://www.gnu.org/licenses/>. #
|
|
||||||
##########################################################################
|
|
||||||
"""
|
|
||||||
Interface tests to test the themeManager class and related methods.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from unittest.mock import MagicMock, patch
|
|
||||||
|
|
||||||
from openlp.core.projectors.db import ProjectorDB
|
|
||||||
from openlp.core.projectors.editform import ProjectorEditForm
|
|
||||||
from openlp.core.projectors.manager import ProjectorManager
|
|
||||||
from tests.resources.projector.data import TEST_DB
|
|
||||||
|
|
||||||
'''
|
|
||||||
NOTE: Since Registry is a singleton, sleight of hand allows us to verify
|
|
||||||
calls to Registry.methods()
|
|
||||||
|
|
||||||
@patch(path.to.imported.Registry)
|
|
||||||
def test_function(mock_registry):
|
|
||||||
mocked_registry = MagicMock()
|
|
||||||
mock_registry.return_value = mocked_registry
|
|
||||||
...
|
|
||||||
assert mocked_registry.method.has_call(...)
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
class FakeProjector(object):
|
|
||||||
"""
|
|
||||||
Helper test class
|
|
||||||
"""
|
|
||||||
def __init__(self, port=4352, name="Faker"):
|
|
||||||
self.link = self
|
|
||||||
self.port = port
|
|
||||||
self.name = name
|
|
||||||
|
|
||||||
|
|
||||||
class FakePJLinkUDP(object):
|
|
||||||
"""
|
|
||||||
Helper test class
|
|
||||||
"""
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def check_settings(self, *args, **kwargs):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def projector_manager(settings):
|
|
||||||
with patch('openlp.core.projectors.db.init_url') as mocked_init_url:
|
|
||||||
mocked_init_url.return_value = 'sqlite:///%s' % TEST_DB
|
|
||||||
projectordb = ProjectorDB()
|
|
||||||
proj_manager = ProjectorManager(projectordb=projectordb)
|
|
||||||
yield proj_manager
|
|
||||||
projectordb.session.close()
|
|
||||||
del proj_manager
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def projector_manager_nodb(settings):
|
|
||||||
proj_manager = ProjectorManager(projectordb=None)
|
|
||||||
yield proj_manager
|
|
||||||
del proj_manager
|
|
||||||
|
|
||||||
|
|
||||||
def test_bootstrap_initialise(projector_manager):
|
|
||||||
"""
|
|
||||||
Test initialize calls correct startup functions
|
|
||||||
"""
|
|
||||||
# WHEN: we call bootstrap_initialise
|
|
||||||
projector_manager.bootstrap_initialise()
|
|
||||||
# THEN: ProjectorDB is setup
|
|
||||||
assert type(projector_manager.projectordb) == ProjectorDB, \
|
|
||||||
'Initialization should have created a ProjectorDB() instance'
|
|
||||||
|
|
||||||
|
|
||||||
def test_bootstrap_initialise_nodb(projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test log entry creating new projector DB
|
|
||||||
"""
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
log_entries = 'Creating new ProjectorDB() instance'
|
|
||||||
# WHEN: ProjectorManager created with no DB set
|
|
||||||
caplog.clear()
|
|
||||||
projector_manager_nodb.bootstrap_initialise()
|
|
||||||
# THEN: Log should indicate new DB being created
|
|
||||||
assert caplog.messages[3] == log_entries, "ProjectorManager should have indicated a new DB being created"
|
|
||||||
|
|
||||||
|
|
||||||
def test_bootstrap_post_set_up(projector_manager):
|
|
||||||
"""
|
|
||||||
Test post-initialize calls proper setups
|
|
||||||
"""
|
|
||||||
# GIVEN: setup mocks
|
|
||||||
projector_manager._load_projectors = MagicMock()
|
|
||||||
|
|
||||||
# WHEN: Call to initialize is run
|
|
||||||
projector_manager.bootstrap_initialise()
|
|
||||||
projector_manager.bootstrap_post_set_up()
|
|
||||||
|
|
||||||
# THEN: verify calls to retrieve saved projectors and edit page initialized
|
|
||||||
assert 1 == projector_manager._load_projectors.call_count, \
|
|
||||||
'Initialization should have called load_projectors()'
|
|
||||||
assert type(projector_manager.projector_form) == ProjectorEditForm, \
|
|
||||||
'Initialization should have created a Projector Edit Form'
|
|
||||||
assert projector_manager.projectordb is projector_manager.projector_form.projectordb, \
|
|
||||||
'ProjectorEditForm should be using same ProjectorDB() instance as ProjectorManager'
|
|
||||||
|
|
||||||
|
|
||||||
def test_bootstrap_post_set_up_autostart_projector(projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test post-initialize calling log and QTimer on autostart
|
|
||||||
"""
|
|
||||||
# GIVEN: Setup mocks
|
|
||||||
with patch('openlp.core.projectors.manager.QtCore.QTimer.singleShot') as mock_timer:
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
log_entries = 'Delaying 1.5 seconds before loading all projectors'
|
|
||||||
# WHEN: Initializations called
|
|
||||||
projector_manager_nodb.bootstrap_initialise()
|
|
||||||
projector_manager_nodb.autostart = True
|
|
||||||
projector_manager_nodb.bootstrap_post_set_up()
|
|
||||||
|
|
||||||
# THEN: verify log entries and timer calls
|
|
||||||
mock_timer.assert_called_once_with(1500, projector_manager_nodb._load_projectors)
|
|
||||||
assert caplog.messages[-1] == log_entries, "Invalid log entries"
|
|
||||||
|
|
||||||
|
|
||||||
def test_udp_listen_add_duplicate(projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test adding UDP port listener to port already registered
|
|
||||||
"""
|
|
||||||
# GIVEN: Initial setup
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
log_entries = ['UDP Listener for port 10 already added - skipping']
|
|
||||||
port_list = {10: 'port1', 20: 'port2'}
|
|
||||||
projector_manager_nodb.pjlink_udp = port_list
|
|
||||||
|
|
||||||
# WHEN: udp_listen_add is called with duplicate port number
|
|
||||||
caplog.clear()
|
|
||||||
projector_manager_nodb.udp_listen_add(port=10)
|
|
||||||
|
|
||||||
# THEN: Verify log entry and registry entry not called
|
|
||||||
assert projector_manager_nodb.pjlink_udp == port_list, "Invalid ports in list"
|
|
||||||
assert caplog.messages == log_entries, "Invalid log entries"
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.projectors.manager.PJLinkUDP')
|
|
||||||
@patch('openlp.core.projectors.manager.Registry')
|
|
||||||
def test_udp_listen_add_new(mock_registry, mock_udp, projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test adding new UDP port listener
|
|
||||||
"""
|
|
||||||
# GIVEN: Initial setup
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
mocked_registry = MagicMock()
|
|
||||||
mock_registry.return_value = mocked_registry
|
|
||||||
mock_udp.return_value = FakePJLinkUDP()
|
|
||||||
log_entries = ['Adding UDP listener on port 20']
|
|
||||||
projector_manager_nodb.pjlink_udp = {10: 'port1'}
|
|
||||||
# WHEN: Adding new listener
|
|
||||||
caplog.clear()
|
|
||||||
projector_manager_nodb.udp_listen_add(port=20)
|
|
||||||
# THEN: Appropriate listener and log entries
|
|
||||||
assert 20 in projector_manager_nodb.pjlink_udp, "Port not added"
|
|
||||||
assert 2 == len(projector_manager_nodb.pjlink_udp), "Invalid ports in list"
|
|
||||||
assert type(projector_manager_nodb.pjlink_udp[20]) == FakePJLinkUDP, \
|
|
||||||
'PJLinkUDP instance should have been added'
|
|
||||||
assert mocked_registry.execute.has_call('udp_broadcast_add', port=20)
|
|
||||||
assert caplog.messages == log_entries, 'Invalid log entries'
|
|
||||||
|
|
||||||
|
|
||||||
def test_udp_listen_delete_missing(projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test deleting UDP port listener not in list
|
|
||||||
"""
|
|
||||||
# GIVEN: Initial setup
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
projector_manager_nodb.pjlink_udp = {10: 'port1'}
|
|
||||||
log_entries = ['Checking for UDP port 20 listener deletion',
|
|
||||||
'UDP listener for port 20 not there - skipping delete']
|
|
||||||
# WHEN: Deleting port listener from dictinary
|
|
||||||
projector_manager_nodb.udp_listen_delete(port=20)
|
|
||||||
# THEN: Log missing port and exit method
|
|
||||||
assert projector_manager_nodb.pjlink_udp == {10: 'port1'}, "Invalid ports in list"
|
|
||||||
assert caplog.messages == log_entries, "Invalid log entries"
|
|
||||||
|
|
||||||
|
|
||||||
@patch('openlp.core.projectors.manager.Registry')
|
|
||||||
def test_udp_listen_delete_single(mock_registry, projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test deleting UDP listener
|
|
||||||
"""
|
|
||||||
# GIVEN: Initial setup
|
|
||||||
mocked_registry = MagicMock()
|
|
||||||
mock_registry.return_value = mocked_registry
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
log_entries = ['Checking for UDP port 10 listener deletion',
|
|
||||||
'UDP listener for port 10 deleted']
|
|
||||||
port_list = {20: 'port2'}
|
|
||||||
projector_manager_nodb.pjlink_udp = {10: 'port1', **port_list}
|
|
||||||
projector_manager_nodb.projector_list = [FakeProjector(port=20)]
|
|
||||||
# WHEN: deleting a listener
|
|
||||||
caplog.clear()
|
|
||||||
projector_manager_nodb.udp_listen_delete(port=10)
|
|
||||||
# THEN: pjlink_udp and logs should have appropriate entries
|
|
||||||
assert caplog.messages == log_entries, 'Invalid log entries'
|
|
||||||
assert projector_manager_nodb.pjlink_udp == port_list, 'Invalid ports in list'
|
|
||||||
assert mocked_registry.execute.has_call('udp_broadcast_delete', port=10)
|
|
||||||
|
|
||||||
|
|
||||||
def test_udp_listen_delete_skip(projector_manager_nodb, caplog):
|
|
||||||
"""
|
|
||||||
Test not deleting UDP listener
|
|
||||||
"""
|
|
||||||
# GIVEN: Initial setup
|
|
||||||
caplog.set_level(logging.DEBUG)
|
|
||||||
log_entries = ['Checking for UDP port 10 listener deletion',
|
|
||||||
'UDP listener for port 10 needed for other projectors - skipping delete']
|
|
||||||
port_list = {10: 'port1', 20: 'port2'}
|
|
||||||
projector_manager_nodb.pjlink_udp = port_list
|
|
||||||
projector_manager_nodb.projector_list = [FakeProjector(port=10),
|
|
||||||
FakeProjector(port=20)]
|
|
||||||
# WHEN: deleting a listener
|
|
||||||
caplog.clear()
|
|
||||||
projector_manager_nodb.udp_listen_delete(port=10)
|
|
||||||
print(projector_manager_nodb.pjlink_udp)
|
|
||||||
print(caplog.record_tuples)
|
|
||||||
# THEN: pjlink_udp and logs should have appropriate entries
|
|
||||||
assert caplog.messages == log_entries, 'Invalid log entries'
|
|
||||||
assert projector_manager_nodb.pjlink_udp == port_list, 'Invalid ports in list'
|
|
@ -283,3 +283,24 @@ TEST_VIDEO_CODES = {
|
|||||||
'6Y': 'Internal Y',
|
'6Y': 'Internal Y',
|
||||||
'6Z': 'Internal Z'
|
'6Z': 'Internal Z'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class FakeProjector(object):
|
||||||
|
"""
|
||||||
|
Helper test class
|
||||||
|
"""
|
||||||
|
def __init__(self, port=4352, name="Faker"):
|
||||||
|
self.link = self
|
||||||
|
self.port = port
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
|
||||||
|
class FakePJLinkUDP(object):
|
||||||
|
"""
|
||||||
|
Helper test class
|
||||||
|
"""
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def check_settings(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
Loading…
Reference in New Issue
Block a user