From fd6deedd8d69eab40b89d20b8eecff7121f7782e Mon Sep 17 00:00:00 2001 From: Mike Kinney Date: Thu, 16 Dec 2021 22:47:10 -0800 Subject: [PATCH] add unit tests for setOwner() --- meshtastic/node.py | 30 ++++++++++++++------- meshtastic/tests/test_node.py | 49 +++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 10 deletions(-) diff --git a/meshtastic/node.py b/meshtastic/node.py index 64b21fe..1e6e893 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -14,7 +14,7 @@ class Node: Includes methods for radioConfig and channels """ - def __init__(self, iface, nodeNum): + def __init__(self, iface, nodeNum, noProto=False): """Constructor""" self.iface = iface self.nodeNum = nodeNum @@ -22,6 +22,7 @@ class Node: self.channels = None self._timeout = Timeout(maxSecs=60) self.partialChannels = None + self.noProto = noProto def showChannels(self): """Show human readable description of our channels.""" @@ -162,6 +163,11 @@ class Node: if team is not None: p.set_owner.team = team + # Note: These debug lines are used in unit tests + logging.debug(f'p.set_owner.long_name:{p.set_owner.long_name}:') + logging.debug(f'p.set_owner.short_name:{p.set_owner.short_name}:') + logging.debug(f'p.set_owner.is_licensed:{p.set_owner.is_licensed}') + logging.debug(f'p.set_owner.team:{p.set_owner.team}') return self._sendAdmin(p) def getURL(self, includeAll: bool = True): @@ -307,22 +313,26 @@ class Node: self._fixupChannels() # FIXME, the following should only be called after we have settings and channels - self.iface._connected() # Tell everone else we are ready to go + self.iface._connected() # Tell everyone else we are ready to go else: self._requestChannel(index + 1) return self._sendAdmin(p, wantResponse=True, onResponse=onResponse) + # pylint: disable=R1710 def _sendAdmin(self, p: admin_pb2.AdminMessage, wantResponse=False, onResponse=None, adminIndex=0): """Send an admin message to the specified node (or the local node if destNodeNum is zero)""" - if adminIndex == 0: # unless a special channel index was used, we want to use the admin index - adminIndex = self.iface.localNode._getAdminChannelIndex() + if self.noProto: + logging.warning(f"Not sending packet because protocol use is disabled by noProto") + else: + if adminIndex == 0: # unless a special channel index was used, we want to use the admin index + adminIndex = self.iface.localNode._getAdminChannelIndex() - return self.iface.sendData(p, self.nodeNum, - portNum=portnums_pb2.PortNum.ADMIN_APP, - wantAck=True, - wantResponse=wantResponse, - onResponse=onResponse, - channelIndex=adminIndex) + return self.iface.sendData(p, self.nodeNum, + portNum=portnums_pb2.PortNum.ADMIN_APP, + wantAck=True, + wantResponse=wantResponse, + onResponse=onResponse, + channelIndex=adminIndex) diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 3787e76..8d07f32 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1,6 +1,7 @@ """Meshtastic unit tests for node.py""" import re +import logging from unittest.mock import patch, MagicMock import pytest @@ -32,3 +33,51 @@ def test_node_reqquestConfig(): with patch('meshtastic.admin_pb2.AdminMessage', return_value=amesg): anode = Node(mo, 'bar') anode.requestConfig() + + +@pytest.mark.unit +def test_setOwner_and_team(caplog): + """Test setOwner""" + anode = Node('foo', 'bar', noProto=True) + with caplog.at_level(logging.DEBUG): + anode.setOwner(long_name ='Test123', short_name='123', team=1) + assert re.search(r'p.set_owner.long_name:Test123:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.short_name:123:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.is_licensed:False', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.team:1', caplog.text, re.MULTILINE) + + +@pytest.mark.unit +def test_setOwner_no_short_name(caplog): + """Test setOwner""" + anode = Node('foo', 'bar', noProto=True) + with caplog.at_level(logging.DEBUG): + anode.setOwner(long_name ='Test123') + assert re.search(r'p.set_owner.long_name:Test123:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.short_name:Tst:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.is_licensed:False', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.team:0', caplog.text, re.MULTILINE) + + +@pytest.mark.unit +def test_setOwner_no_short_name_and_long_name_is_short(caplog): + """Test setOwner""" + anode = Node('foo', 'bar', noProto=True) + with caplog.at_level(logging.DEBUG): + anode.setOwner(long_name ='Tnt') + assert re.search(r'p.set_owner.long_name:Tnt:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.short_name:Tnt:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.is_licensed:False', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.team:0', caplog.text, re.MULTILINE) + + +@pytest.mark.unit +def test_setOwner_no_short_name_and_long_name_has_words(caplog): + """Test setOwner""" + anode = Node('foo', 'bar', noProto=True) + with caplog.at_level(logging.DEBUG): + anode.setOwner(long_name ='A B C', is_licensed=True) + assert re.search(r'p.set_owner.long_name:A B C:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.short_name:ABC:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.is_licensed:True', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.team:0', caplog.text, re.MULTILINE)