""" tests/unit/test_device_management_panel.py Unit tests for DeviceManagementPanel QWidget. TDD: Red phase — tests written before implementation. Uses conftest.py Stubs for PyQt5 so no display hardware is needed. """ from unittest.mock import MagicMock, patch import pytest from core.device.device_manager import DeviceInfo, DeviceManager from ui.components.device_management_panel import DeviceManagementPanel # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- def _make_device_manager(devices=None): """Return a DeviceManager-like mock with controllable scan_devices().""" mgr = MagicMock(spec=DeviceManager) if devices is None: devices = [ DeviceInfo( device_id="usb-1", series="KL520", product_id=0x100, status="online", gops=2, assigned_stage=None, current_fps=15.0, utilization_pct=50.0, ) ] mgr.scan_devices.return_value = devices mgr.get_device_statistics.return_value = {d.device_id: d for d in devices} mgr.get_load_balance_recommendation.return_value = {} return mgr # --------------------------------------------------------------------------- # Panel instantiation # --------------------------------------------------------------------------- class TestDeviceManagementPanelInit: def test_panel_creates_without_error(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) assert panel is not None def test_panel_has_auto_balance_button(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) # auto_balance_button must exist assert hasattr(panel, "auto_balance_button") def test_auto_balance_button_text(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) assert panel.auto_balance_button._text == "Auto Balance" # --------------------------------------------------------------------------- # refresh() # --------------------------------------------------------------------------- class TestDeviceManagementPanelRefresh: def test_refresh_calls_scan_devices(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) mgr.scan_devices.reset_mock() panel.refresh() mgr.scan_devices.assert_called_once() def test_refresh_updates_known_devices(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) panel.refresh() # After refresh, panel should have device data accessible assert len(panel._devices) == 1 assert panel._devices[0].device_id == "usb-1" def test_refresh_with_no_devices_sets_empty_list(self): mgr = _make_device_manager(devices=[]) panel = DeviceManagementPanel(device_manager=mgr) panel.refresh() assert panel._devices == [] # --------------------------------------------------------------------------- # set_auto_refresh() # --------------------------------------------------------------------------- class TestSetAutoRefresh: def test_set_auto_refresh_stores_interval(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) panel.set_auto_refresh(interval_ms=3000) assert panel._auto_refresh_interval_ms == 3000 def test_set_auto_refresh_default_interval(self): mgr = _make_device_manager() panel = DeviceManagementPanel(device_manager=mgr) panel.set_auto_refresh() assert panel._auto_refresh_interval_ms == 2000