Add update_sync_hub_node function and corresponding tests for backfilling devSyncHubNode #1609
Some checks failed
🐳 ⚠ docker-unsafe from next_release branch / docker_dev_unsafe (push) Has been cancelled

This commit is contained in:
Jokob @NetAlertX
2026-04-14 20:59:36 +00:00
parent 285bd3ec22
commit 89139fed60
3 changed files with 136 additions and 0 deletions

View File

@@ -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):
sql = db.sql

View File

@@ -4,6 +4,7 @@ from scan.device_handling import (
save_scanned_devices,
exclude_ignored_devices,
update_devices_data_from_scan,
update_sync_hub_node,
update_vendors_from_mac,
update_icons_and_types,
update_devPresentLastScan_based_on_force_status,
@@ -62,6 +63,10 @@ def process_scan(db):
mylog("verbose", "[Process Scan] Updating Devices Info")
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
mylog("verbose", "[Process Scan] Updating devLastConnection from CurrentScan")
update_devLastConnection_from_CurrentScan(db)

View File

@@ -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"] == ""