diff --git a/bec_widgets/applications/views/device_manager_view/device_manager_display_widget.py b/bec_widgets/applications/views/device_manager_view/device_manager_display_widget.py index 7f58ee59..c7690f2e 100644 --- a/bec_widgets/applications/views/device_manager_view/device_manager_display_widget.py +++ b/bec_widgets/applications/views/device_manager_view/device_manager_display_widget.py @@ -531,6 +531,8 @@ class DeviceManagerDisplayWidget(DockAreaWidget): self.ophyd_test_view.change_device_configs( [cfg for cfg, _, _, _ in devices_to_update], added=False, skip_validation=True ) + # Config is in sync with BEC, so we update the state + self.device_table_view.device_config_in_sync_with_redis.emit(True) @SafeSlot() def _save_to_disk_action(self): diff --git a/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py b/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py index c930b582..343c6438 100644 --- a/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py +++ b/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py @@ -978,6 +978,8 @@ class DeviceTable(BECWidget, QtWidgets.QWidget): logger.warning(f"Device {cfg.get('name')} not found in table for session update.") continue self._update_device_row_status(row, config_status, connection_status) + in_sync_with_redis = self._is_config_in_sync_with_redis() + self.device_config_in_sync_with_redis.emit(in_sync_with_redis) self.table.setSortingEnabled(True) self.set_busy(False, text="") diff --git a/tests/unit_tests/test_device_manager_view.py b/tests/unit_tests/test_device_manager_view.py index e0609d93..39e235df 100644 --- a/tests/unit_tests/test_device_manager_view.py +++ b/tests/unit_tests/test_device_manager_view.py @@ -2,6 +2,7 @@ # pylint: disable=protected-access,redefined-outer-name +from typing import Any from unittest import mock import pytest @@ -682,3 +683,35 @@ class TestDeviceManagerView: "rerun_validation" ].action.action.triggered.emit() assert len(mock_change_configs.call_args[0][0]) == 1 + + def test_update_validation_icons_after_upload( + self, + device_manager_display_widget: DeviceManagerDisplayWidget, + device_configs: list[dict[str, Any]], + ): + """Test that validation icons are updated after uploading to Redis.""" + dm_view = device_manager_display_widget + + # Add device configs to the table + dm_view.device_table_view.add_device_configs(device_configs) + # Update the device manager devices to match what's in the table + dm_view.client.device_manager.devices = {cfg["name"]: cfg for cfg in device_configs} + + # Simulate callback + dm_view._update_validation_icons_after_upload() + + # Get validation results from the table + validation_results = dm_view.device_table_view.get_validation_results() + # Check that all devices are connected and status is updated + for dev_name, (cfg, _, connection_status) in validation_results.items(): + assert cfg in device_configs + assert connection_status == ConnectionStatus.CONNECTED.value + + # Check that no devices are in ophyd_validation widget + # Those should be all cleared after upload + cfgs = dm_view.ophyd_test_view.get_device_configs() + assert len(cfgs) == 0 + + # Check that upload config button is disabled + action = dm_view.toolbar.components.get_action("update_config_redis") + assert action.action.isEnabled() is False