58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from app.network.wled import DiscoveredWledDevice, discover_wled_devices, fetch_wled_info, probe_wled_device
|
|
|
|
|
|
class WledDiscoveryTests(unittest.TestCase):
|
|
def test_fetch_wled_info_falls_back_to_json_endpoint(self) -> None:
|
|
with patch(
|
|
"app.network.wled._load_json",
|
|
side_effect=[
|
|
None,
|
|
{"info": {"name": "Tile 1", "mac": "AA:BB:CC:DD:EE:FF", "leds": {"count": 106}}},
|
|
],
|
|
):
|
|
result = fetch_wled_info("192.0.2.10")
|
|
|
|
self.assertIsNotNone(result)
|
|
payload, endpoint = result
|
|
self.assertEqual(endpoint, "/json")
|
|
self.assertEqual(payload["name"], "Tile 1")
|
|
|
|
def test_probe_wled_device_extracts_metadata(self) -> None:
|
|
with patch(
|
|
"app.network.wled.fetch_wled_info",
|
|
return_value=(
|
|
{"name": "Tile 1", "mac": "aa-bb-cc-dd-ee-ff", "leds": {"count": 106}},
|
|
"/json/info",
|
|
),
|
|
), patch("app.network.wled._reverse_dns_name", return_value="tile1.local"):
|
|
device = probe_wled_device("192.0.2.10")
|
|
|
|
self.assertIsNotNone(device)
|
|
self.assertEqual(device.ip_address, "192.0.2.10")
|
|
self.assertEqual(device.hostname, "tile1.local")
|
|
self.assertEqual(device.instance_name, "Tile 1")
|
|
self.assertEqual(device.mac_address, "AA:BB:CC:DD:EE:FF")
|
|
self.assertEqual(device.led_count, 106)
|
|
|
|
def test_discover_wled_devices_deduplicates_devices_by_mac(self) -> None:
|
|
responses = {
|
|
"host-a": DiscoveredWledDevice(ip_address="192.0.2.10", mac_address="AA:BB:CC:DD:EE:FF"),
|
|
"host-b": DiscoveredWledDevice(ip_address="192.0.2.10", mac_address="AA:BB:CC:DD:EE:FF"),
|
|
"host-c": None,
|
|
}
|
|
|
|
with patch("app.network.wled.probe_wled_device", side_effect=lambda host, timeout_s=0.35: responses[host]):
|
|
devices = discover_wled_devices(["host-a", "host-b", "host-c"], max_workers=1)
|
|
|
|
self.assertEqual(len(devices), 1)
|
|
self.assertEqual(devices[0].mac_address, "AA:BB:CC:DD:EE:FF")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|