from __future__ import annotations import unittest from app.config.device_assignment import assign_device_to_tile, find_tile_for_device from app.config.models import InfinityMirrorConfig, LogicalDisplayConfig, TileConfig from app.network.wled import DiscoveredWledDevice class DeviceAssignmentTests(unittest.TestCase): def _config(self) -> InfinityMirrorConfig: return InfinityMirrorConfig( logical_display=LogicalDisplayConfig(rows=1, cols=2), tiles=[ TileConfig(tile_id="r1c1", row=1, col=1, controller_ip="192.0.2.10", controller_mac="AA:BB:CC:DD:EE:01"), TileConfig(tile_id="r1c2", row=1, col=2, controller_ip="192.0.2.11", controller_mac="AA:BB:CC:DD:EE:02"), ], ) def test_find_tile_prefers_mac_match_over_stale_ip(self) -> None: config = self._config() device = DiscoveredWledDevice(ip_address="192.0.2.42", mac_address="AA:BB:CC:DD:EE:01") matched = find_tile_for_device(config, device) self.assertIsNotNone(matched) self.assertEqual(matched.tile_id, "r1c1") def test_assign_device_moves_previous_assignment_and_overwrites_target(self) -> None: config = self._config() device = DiscoveredWledDevice( ip_address="192.0.2.42", hostname="tile-42.local", instance_name="Tile 42", mac_address="AA:BB:CC:DD:EE:01", ) assign_device_to_tile(config, device, "r1c2") source_tile = config.tile_lookup()["r1c1"] target_tile = config.tile_lookup()["r1c2"] self.assertEqual(source_tile.controller_ip, "") self.assertEqual(source_tile.controller_mac, "") self.assertEqual(target_tile.controller_ip, "192.0.2.42") self.assertEqual(target_tile.controller_host, "tile-42.local") self.assertEqual(target_tile.controller_name, "Tile 42") self.assertEqual(target_tile.controller_mac, "AA:BB:CC:DD:EE:01") if __name__ == "__main__": unittest.main()