Files
NetAlertX/test/backend/test_device_instance.py
T

65 lines
2.2 KiB
Python

"""
Unit tests for server/models/device_instance.py's DeviceInstance model methods.
Covers:
- DeviceInstance.getAllByName()
"""
import sys
import os
import unittest
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "server"))
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from db_test_helpers import make_db, make_device_dict, insert_device_from_dict
class TestGetAllByName(unittest.TestCase):
"""devName has no column-level collation (unlike devMac), so getAllByName()
must apply COLLATE NOCASE itself, and must return every match rather than
just one - callers (e.g. the dockerdisc plugin's resolve_host_mac()) rely
on the full set to detect an ambiguous (multiple-match) name."""
def setUp(self):
self.conn = make_db()
devices = [
make_device_dict("aa:bb:cc:dd:ee:01", devName="docker-host-1"),
make_device_dict("aa:bb:cc:dd:ee:02", devName="Docker-Host-1"),
make_device_dict("aa:bb:cc:dd:ee:03", devName="other-host"),
]
for d in devices:
insert_device_from_dict(self.conn, d)
self.conn.commit()
def _instance(self):
from models.device_instance import DeviceInstance
inst = DeviceInstance()
def _fetchall(q, p=()):
rows = self.conn.execute(q, p).fetchall()
return [dict(r) for r in rows]
inst._fetchall = _fetchall
return inst
def test_case_insensitive_match_returns_all_ambiguous_rows(self):
inst = self._instance()
results = inst.getAllByName("docker-host-1")
macs = {r["devMac"] for r in results}
self.assertEqual(macs, {"aa:bb:cc:dd:ee:01", "aa:bb:cc:dd:ee:02"})
def test_case_insensitive_match_different_case_query(self):
inst = self._instance()
results = inst.getAllByName("OTHER-HOST")
self.assertEqual(len(results), 1)
self.assertEqual(results[0]["devMac"], "aa:bb:cc:dd:ee:03")
def test_no_match_returns_empty_list(self):
inst = self._instance()
results = inst.getAllByName("does-not-exist")
self.assertEqual(results, [])
if __name__ == "__main__":
unittest.main()