Merge branch 'pjm-tests' into 'master'

Tests for ProjectorManager 2022-01-23

See merge request openlp/openlp!386
This commit is contained in:
Raoul Snyman 2022-01-31 02:36:14 +00:00
commit e30fb26a3c
2 changed files with 124 additions and 19 deletions

View File

@ -328,6 +328,8 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
def udp_listen_add(self, port=PJLINK_PORT):
"""
Add UDP broadcast listener
NOTE: Check if PJLinkUDP port needs to be started when adding
"""
if port in self.pjlink_udp:
log.warning('UDP Listener for port {port} already added - skipping'.format(port=port))
@ -339,6 +341,8 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
def udp_listen_delete(self, port):
"""
Remove a UDP broadcast listener
NOTE: Check if PJLinkUDP port needs to be closed/stopped when deleting
"""
log.debug('Checking for UDP port {port} listener deletion'.format(port=port))
if port not in self.pjlink_udp:

View File

@ -21,17 +21,50 @@
"""
Interface tests to test the themeManager class and related methods.
"""
import pytest
import logging
from unittest.mock import MagicMock, patch
from openlp.core.projectors.constants import PJLINK_PORT
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):
@ -67,13 +100,12 @@ 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.record_tuples[3] == ('openlp.core.projectors.manager', 10, 'Creating new ProjectorDB() instance'), \
"ProjectorManager should have indicated a 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):
@ -103,6 +135,7 @@ def test_bootstrap_post_set_up_autostart_projector(projector_manager_nodb, caplo
# 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
@ -110,41 +143,109 @@ def test_bootstrap_post_set_up_autostart_projector(projector_manager_nodb, caplo
# THEN: verify log entries and timer calls
mock_timer.assert_called_once_with(1500, projector_manager_nodb._load_projectors)
assert caplog.record_tuples[-1] == ('openlp.core.projectors.manager', 10,
'Delaying 1.5 seconds before loading all projectors'), \
"Last log entry should be autoloading entry"
assert caplog.messages[-1] == log_entries, "Invalid log entries"
def test_udp_listen_add_duplicate_port(projector_manager_nodb, caplog):
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)
projector_manager_nodb.pjlink_udp[PJLINK_PORT] = "Something to set index item"
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=PJLINK_PORT)
projector_manager_nodb.udp_listen_add(port=10)
# THEN: Verify log entry and registry entry not called
assert caplog.record_tuples[0] == ('openlp.core.projectors.manager', 30,
'UDP Listener for port 4352 already added - skipping')
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, projector_manager_nodb, caplog):
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)
log_entries = [('openlp.core.projectors.manager', 10, 'Adding UDP listener on port 4352'),
('openlp.core.projectors.pjlink', 10, '(UDP:4352) PJLinkUDP() Initialized')]
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=PJLINK_PORT)
projector_manager_nodb.udp_listen_add(port=20)
# THEN: Appropriate listener and log entries
mock_registry.execute.called_with('udp_broadcast_add', port=PJLINK_PORT)
assert caplog.record_tuples == log_entries, 'Invalid 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'