mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2026-04-15 22:51:37 -07:00
Add update_sync_hub_node function and corresponding tests for backfilling devSyncHubNode #1609
🐳 ⚠ docker-unsafe from next_release branch / docker_dev_unsafe (push) Has been cancelled
🐳 ⚠ docker-unsafe from next_release branch / docker_dev_unsafe (push) Has been cancelled
This commit is contained in:
@@ -240,6 +240,29 @@ def update_devLastConnection_from_CurrentScan(db):
|
|||||||
""")
|
""")
|
||||||
|
|
||||||
|
|
||||||
|
def update_sync_hub_node(db):
|
||||||
|
"""
|
||||||
|
Backfill devSyncHubNode with SYNC_node_name for devices where it is empty.
|
||||||
|
Mirrors the fallback already used in create_new_devices.
|
||||||
|
"""
|
||||||
|
sql = db.sql
|
||||||
|
node_name = get_setting_value("SYNC_node_name")
|
||||||
|
|
||||||
|
if not node_name:
|
||||||
|
return
|
||||||
|
|
||||||
|
sql.execute(
|
||||||
|
"""
|
||||||
|
UPDATE Devices
|
||||||
|
SET devSyncHubNode = ?
|
||||||
|
WHERE COALESCE(devSyncHubNode, '') IN ('', 'null')
|
||||||
|
""",
|
||||||
|
(node_name,),
|
||||||
|
)
|
||||||
|
|
||||||
|
db.commitDB()
|
||||||
|
|
||||||
|
|
||||||
def update_devices_data_from_scan(db):
|
def update_devices_data_from_scan(db):
|
||||||
sql = db.sql
|
sql = db.sql
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from scan.device_handling import (
|
|||||||
save_scanned_devices,
|
save_scanned_devices,
|
||||||
exclude_ignored_devices,
|
exclude_ignored_devices,
|
||||||
update_devices_data_from_scan,
|
update_devices_data_from_scan,
|
||||||
|
update_sync_hub_node,
|
||||||
update_vendors_from_mac,
|
update_vendors_from_mac,
|
||||||
update_icons_and_types,
|
update_icons_and_types,
|
||||||
update_devPresentLastScan_based_on_force_status,
|
update_devPresentLastScan_based_on_force_status,
|
||||||
@@ -62,6 +63,10 @@ def process_scan(db):
|
|||||||
mylog("verbose", "[Process Scan] Updating Devices Info")
|
mylog("verbose", "[Process Scan] Updating Devices Info")
|
||||||
update_devices_data_from_scan(db)
|
update_devices_data_from_scan(db)
|
||||||
|
|
||||||
|
# Backfill devSyncHubNode for devices where it is empty
|
||||||
|
mylog("verbose", "[Process Scan] Updating Sync Hub Node")
|
||||||
|
update_sync_hub_node(db)
|
||||||
|
|
||||||
# Last Connection Time stamp from CurrentScan
|
# Last Connection Time stamp from CurrentScan
|
||||||
mylog("verbose", "[Process Scan] Updating devLastConnection from CurrentScan")
|
mylog("verbose", "[Process Scan] Updating devLastConnection from CurrentScan")
|
||||||
update_devLastConnection_from_CurrentScan(db)
|
update_devLastConnection_from_CurrentScan(db)
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
"""Tests for update_sync_hub_node backfill."""
|
||||||
|
|
||||||
|
import sqlite3
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from server.scan import device_handling
|
||||||
|
|
||||||
|
|
||||||
|
class DummyDB:
|
||||||
|
"""Minimal DB wrapper compatible with device_handling helpers."""
|
||||||
|
|
||||||
|
def __init__(self, conn):
|
||||||
|
self.sql = conn.cursor()
|
||||||
|
self._conn = conn
|
||||||
|
|
||||||
|
def commitDB(self):
|
||||||
|
self._conn.commit()
|
||||||
|
|
||||||
|
|
||||||
|
def _make_db(devices):
|
||||||
|
"""Create an in-memory DB with a Devices table and seed rows."""
|
||||||
|
conn = sqlite3.connect(":memory:")
|
||||||
|
conn.row_factory = sqlite3.Row
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
|
cur.execute(
|
||||||
|
"""
|
||||||
|
CREATE TABLE Devices (
|
||||||
|
devMac TEXT PRIMARY KEY,
|
||||||
|
devSyncHubNode TEXT
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
cur.executemany(
|
||||||
|
"INSERT INTO Devices (devMac, devSyncHubNode) VALUES (?, ?)",
|
||||||
|
devices,
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
return conn
|
||||||
|
|
||||||
|
|
||||||
|
def _read_nodes(conn):
|
||||||
|
"""Return a dict of devMac -> devSyncHubNode."""
|
||||||
|
return {
|
||||||
|
row["devMac"]: row["devSyncHubNode"]
|
||||||
|
for row in conn.execute("SELECT devMac, devSyncHubNode FROM Devices")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@patch.object(device_handling, "get_setting_value", return_value="MyNode")
|
||||||
|
def test_backfill_empty_values(mock_setting):
|
||||||
|
"""Empty and null devSyncHubNode should be backfilled with SYNC_node_name."""
|
||||||
|
conn = _make_db([
|
||||||
|
("AA:AA:AA:AA:AA:01", ""),
|
||||||
|
("AA:AA:AA:AA:AA:02", None),
|
||||||
|
("AA:AA:AA:AA:AA:03", "null"),
|
||||||
|
])
|
||||||
|
|
||||||
|
device_handling.update_sync_hub_node(DummyDB(conn))
|
||||||
|
nodes = _read_nodes(conn)
|
||||||
|
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:01"] == "MyNode"
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:02"] == "MyNode"
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:03"] == "MyNode"
|
||||||
|
|
||||||
|
|
||||||
|
@patch.object(device_handling, "get_setting_value", return_value="MyNode")
|
||||||
|
def test_no_overwrite_existing(mock_setting):
|
||||||
|
"""Devices with a real devSyncHubNode should not be overwritten."""
|
||||||
|
conn = _make_db([
|
||||||
|
("AA:AA:AA:AA:AA:01", "RemoteNode"),
|
||||||
|
("AA:AA:AA:AA:AA:02", ""),
|
||||||
|
])
|
||||||
|
|
||||||
|
device_handling.update_sync_hub_node(DummyDB(conn))
|
||||||
|
nodes = _read_nodes(conn)
|
||||||
|
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:01"] == "RemoteNode"
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:02"] == "MyNode"
|
||||||
|
|
||||||
|
|
||||||
|
@patch.object(device_handling, "get_setting_value", return_value="")
|
||||||
|
def test_noop_when_setting_empty(mock_setting):
|
||||||
|
"""No updates when SYNC_node_name is empty."""
|
||||||
|
conn = _make_db([
|
||||||
|
("AA:AA:AA:AA:AA:01", ""),
|
||||||
|
("AA:AA:AA:AA:AA:02", None),
|
||||||
|
])
|
||||||
|
|
||||||
|
device_handling.update_sync_hub_node(DummyDB(conn))
|
||||||
|
nodes = _read_nodes(conn)
|
||||||
|
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:01"] == ""
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:02"] is None
|
||||||
|
|
||||||
|
|
||||||
|
@patch.object(device_handling, "get_setting_value", return_value=None)
|
||||||
|
def test_noop_when_setting_none(mock_setting):
|
||||||
|
"""No updates when SYNC_node_name is None."""
|
||||||
|
conn = _make_db([
|
||||||
|
("AA:AA:AA:AA:AA:01", ""),
|
||||||
|
])
|
||||||
|
|
||||||
|
device_handling.update_sync_hub_node(DummyDB(conn))
|
||||||
|
nodes = _read_nodes(conn)
|
||||||
|
|
||||||
|
assert nodes["AA:AA:AA:AA:AA:01"] == ""
|
||||||
Reference in New Issue
Block a user