Tests for ProjectorManager 2022-01-23

This commit is contained in:
Ken Roberts 2022-01-31 02:36:14 +00:00 committed by Raoul Snyman
parent 91322f87d2
commit 2d0855f975
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): def udp_listen_add(self, port=PJLINK_PORT):
""" """
Add UDP broadcast listener Add UDP broadcast listener
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('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): def udp_listen_delete(self, port):
""" """
Remove a UDP broadcast listener 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)) log.debug('Checking for UDP port {port} listener deletion'.format(port=port))
if port not in self.pjlink_udp: if port not in self.pjlink_udp:

View File

@ -21,17 +21,50 @@
""" """
Interface tests to test the themeManager class and related methods. Interface tests to test the themeManager class and related methods.
""" """
import pytest import pytest
import logging import logging
from unittest.mock import MagicMock, patch 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.db import ProjectorDB
from openlp.core.projectors.editform import ProjectorEditForm from openlp.core.projectors.editform import ProjectorEditForm
from openlp.core.projectors.manager import ProjectorManager from openlp.core.projectors.manager import ProjectorManager
from tests.resources.projector.data import TEST_DB 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() @pytest.fixture()
def projector_manager(settings): def projector_manager(settings):
@ -67,13 +100,12 @@ def test_bootstrap_initialise_nodb(projector_manager_nodb, caplog):
Test log entry creating new projector DB Test log entry creating new projector DB
""" """
caplog.set_level(logging.DEBUG) caplog.set_level(logging.DEBUG)
log_entries = 'Creating new ProjectorDB() instance'
# WHEN: ProjectorManager created with no DB set # WHEN: ProjectorManager created with no DB set
caplog.clear() caplog.clear()
projector_manager_nodb.bootstrap_initialise() projector_manager_nodb.bootstrap_initialise()
# THEN: Log should indicate new DB being created # THEN: Log should indicate new DB being created
assert caplog.record_tuples[3] == ('openlp.core.projectors.manager', 10, 'Creating new ProjectorDB() instance'), \ assert caplog.messages[3] == log_entries, "ProjectorManager should have indicated a new DB being created"
"ProjectorManager should have indicated a new DB being created"
def test_bootstrap_post_set_up(projector_manager): 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 # GIVEN: Setup mocks
with patch('openlp.core.projectors.manager.QtCore.QTimer.singleShot') as mock_timer: with patch('openlp.core.projectors.manager.QtCore.QTimer.singleShot') as mock_timer:
caplog.set_level(logging.DEBUG) caplog.set_level(logging.DEBUG)
log_entries = 'Delaying 1.5 seconds before loading all projectors'
# WHEN: Initializations called # WHEN: Initializations called
projector_manager_nodb.bootstrap_initialise() projector_manager_nodb.bootstrap_initialise()
projector_manager_nodb.autostart = True 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 # THEN: verify log entries and timer calls
mock_timer.assert_called_once_with(1500, projector_manager_nodb._load_projectors) mock_timer.assert_called_once_with(1500, projector_manager_nodb._load_projectors)
assert caplog.record_tuples[-1] == ('openlp.core.projectors.manager', 10, assert caplog.messages[-1] == log_entries, "Invalid log entries"
'Delaying 1.5 seconds before loading all projectors'), \
"Last log entry should be autoloading entry"
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 Test adding UDP port listener to port already registered
""" """
# GIVEN: Initial setup # GIVEN: Initial setup
caplog.set_level(logging.DEBUG) 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 # WHEN: udp_listen_add is called with duplicate port number
caplog.clear() 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 # THEN: Verify log entry and registry entry not called
assert caplog.record_tuples[0] == ('openlp.core.projectors.manager', 30, assert projector_manager_nodb.pjlink_udp == port_list, "Invalid ports in list"
'UDP Listener for port 4352 already added - skipping') assert caplog.messages == log_entries, "Invalid log entries"
@patch('openlp.core.projectors.manager.PJLinkUDP')
@patch('openlp.core.projectors.manager.Registry') @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 Test adding new UDP port listener
""" """
# GIVEN: Initial setup # GIVEN: Initial setup
caplog.set_level(logging.DEBUG) caplog.set_level(logging.DEBUG)
log_entries = [('openlp.core.projectors.manager', 10, 'Adding UDP listener on port 4352'), mocked_registry = MagicMock()
('openlp.core.projectors.pjlink', 10, '(UDP:4352) PJLinkUDP() Initialized')] 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 # WHEN: Adding new listener
caplog.clear() 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 # THEN: Appropriate listener and log entries
mock_registry.execute.called_with('udp_broadcast_add', port=PJLINK_PORT) assert 20 in projector_manager_nodb.pjlink_udp, "Port not added"
assert caplog.record_tuples == log_entries, 'Invalid log entries' 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'