diff --git a/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py b/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py index 9b5ff30b..44c0cd68 100644 --- a/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py +++ b/bec_widgets/widgets/services/device_browser/device_item/device_signal_display.py @@ -5,6 +5,7 @@ from qtpy.QtWidgets import QHBoxLayout, QLabel, QToolButton, QVBoxLayout, QWidge from bec_widgets.utils.bec_connector import ConnectionConfig from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.error_popups import SafeProperty, SafeSlot +from bec_widgets.utils.ophyd_kind_util import Kind from bec_widgets.widgets.containers.dock.dock import BECDock from bec_widgets.widgets.utility.signal_label.signal_label import SignalLabel @@ -35,9 +36,9 @@ class SignalDisplay(BECWidget, QWidget): @SafeSlot() def _refresh(self): - if self.device in self.dev: - self.dev.get(self.device).read(cached=False) - self.dev.get(self.device).read_configuration(cached=False) + if (dev := self.dev.get(self.device)) is not None: + dev.read() + dev.read_configuration() def _add_refresh_button(self): button_holder = QWidget() @@ -63,15 +64,16 @@ class SignalDisplay(BECWidget, QWidget): self._add_refresh_button() if self._device in self.dev: - for sig in self.dev[self.device]._info.get("signals", {}).keys(): - self._content_layout.addWidget( - SignalLabel( - device=self._device, - signal=sig, - show_select_button=False, - show_default_units=True, + for sig, info in self.dev[self.device]._info.get("signals", {}).items(): + if info.get("kind_str") in [Kind.hinted.name, Kind.normal.name, Kind.config.name]: + self._content_layout.addWidget( + SignalLabel( + device=self._device, + signal=sig, + show_select_button=False, + show_default_units=True, + ) ) - ) self._content_layout.addStretch(1) else: self._content_layout.addWidget( diff --git a/tests/unit_tests/test_device_browser.py b/tests/unit_tests/test_device_browser.py index fe43a678..c774249c 100644 --- a/tests/unit_tests/test_device_browser.py +++ b/tests/unit_tests/test_device_browser.py @@ -9,6 +9,9 @@ from bec_widgets.widgets.services.device_browser.device_browser import DeviceBro from bec_widgets.widgets.services.device_browser.device_item.device_config_form import ( DeviceConfigForm, ) +from bec_widgets.widgets.services.device_browser.device_item.device_signal_display import ( + SignalDisplay, +) from .client_mocks import mocked_client @@ -142,3 +145,39 @@ def test_device_deletion(device_browser, qtbot): assert widget.device in device_browser._device_items qtbot.mouseClick(widget.delete_button, Qt.LeftButton) qtbot.waitUntil(lambda: widget.device not in device_browser._device_items, timeout=10000) + + +def test_signal_display(mocked_client, qtbot): + signal_display = SignalDisplay(client=mocked_client, device="test_device") + qtbot.addWidget(signal_display) + device_mock = mock.MagicMock() + signal_display.dev = {"test_device": device_mock} + signal_display._refresh() + device_mock.read.assert_called() + device_mock.read_configuration.assert_called() + + +def test_signal_display_no_device(mocked_client, qtbot): + device_mock = mock.MagicMock() + mocked_client.client.device_manager.devices = {"test_device_1": device_mock} + signal_display = SignalDisplay(client=mocked_client, device="test_device_2") + qtbot.addWidget(signal_display) + assert ( + signal_display._content_layout.itemAt(1).widget().text() + == "Device test_device_2 not found in device manager!" + ) + signal_display._refresh() + device_mock.read.assert_not_called() + device_mock.read_configuration.assert_not_called() + + +def test_signal_display_omitted_not_added(mocked_client, qtbot): + device_mock = mock.MagicMock() + device_mock._info = {"signals": {"signal_1": {"kind_str": "omitted"}}} + + signal_display = SignalDisplay(client=mocked_client, device="test_device_1") + signal_display.dev = {"test_device_1": device_mock} + signal_display._populate() + + qtbot.addWidget(signal_display) + assert signal_display._content_layout.itemAt(1).widget() is None