From 00976e6fb2eee04a6817de6bd3226a100daef057 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Mon, 27 Oct 2025 13:45:42 +0100 Subject: [PATCH 1/2] refactor(tests): utils changed to fake_devices --- bec_widgets/tests/{utils.py => fake_devices.py} | 0 tests/end-2-end/test_plotting_framework_e2e.py | 2 +- tests/unit_tests/client_mocks.py | 2 +- tests/unit_tests/test_device_signal_input.py | 2 +- tests/unit_tests/test_positioner_box.py | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename bec_widgets/tests/{utils.py => fake_devices.py} (100%) diff --git a/bec_widgets/tests/utils.py b/bec_widgets/tests/fake_devices.py similarity index 100% rename from bec_widgets/tests/utils.py rename to bec_widgets/tests/fake_devices.py diff --git a/tests/end-2-end/test_plotting_framework_e2e.py b/tests/end-2-end/test_plotting_framework_e2e.py index ebed9f250..5a6416ccb 100644 --- a/tests/end-2-end/test_plotting_framework_e2e.py +++ b/tests/end-2-end/test_plotting_framework_e2e.py @@ -6,7 +6,7 @@ from bec_widgets.cli.client import Image, MotorMap, MultiWaveform, ScatterWaveform, Waveform from bec_widgets.cli.rpc.rpc_base import RPCReference -from bec_widgets.tests.utils import check_remote_data_size +from bec_widgets.tests.fake_devices import check_remote_data_size def test_rpc_waveform1d_custom_curve(qtbot, connected_client_gui_obj): diff --git a/tests/unit_tests/client_mocks.py b/tests/unit_tests/client_mocks.py index b64a65ee3..cf361eb8d 100644 --- a/tests/unit_tests/client_mocks.py +++ b/tests/unit_tests/client_mocks.py @@ -9,7 +9,7 @@ from bec_lib.redis_connector import RedisConnector from bec_lib.scan_history import ScanHistory -from bec_widgets.tests.utils import DEVICES, DMMock, FakePositioner, Positioner +from bec_widgets.tests.fake_devices import DEVICES, DMMock, FakePositioner, Positioner def fake_redis_server(host, port): diff --git a/tests/unit_tests/test_device_signal_input.py b/tests/unit_tests/test_device_signal_input.py index 65bffd238..fb798af7f 100644 --- a/tests/unit_tests/test_device_signal_input.py +++ b/tests/unit_tests/test_device_signal_input.py @@ -4,7 +4,7 @@ from bec_lib.device import Signal from qtpy.QtWidgets import QWidget -from bec_widgets.tests.utils import FakeDevice +from bec_widgets.tests.fake_devices import FakeDevice from bec_widgets.utils.ophyd_kind_util import Kind from bec_widgets.widgets.control.device_input.base_classes.device_input_base import BECDeviceFilter from bec_widgets.widgets.control.device_input.base_classes.device_signal_input_base import ( diff --git a/tests/unit_tests/test_positioner_box.py b/tests/unit_tests/test_positioner_box.py index 531a494e4..885d724cc 100644 --- a/tests/unit_tests/test_positioner_box.py +++ b/tests/unit_tests/test_positioner_box.py @@ -7,7 +7,7 @@ from qtpy.QtGui import QValidator from qtpy.QtWidgets import QPushButton -from bec_widgets.tests.utils import Positioner +from bec_widgets.tests.fake_devices import Positioner from bec_widgets.widgets.control.device_control.positioner_box import ( PositionerBox, PositionerControlLine, From d3a2e94856d4a64f73ba56635ecee21ecc0a8cc9 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Mon, 27 Oct 2025 13:53:04 +0100 Subject: [PATCH 2/2] fix(tests): client_mocks moved inside the package, imports for tests adjusted --- .../tests}/client_mocks.py | 0 bec_widgets/tests/utils.py | 76 +++++++++++++++++++ tests/conftest.py | 28 +------ tests/unit_tests/conftest.py | 42 ++-------- tests/unit_tests/test_abort_button.py | 3 +- tests/unit_tests/test_axis_settings.py | 2 +- tests/unit_tests/test_bec_connector.py | 3 +- tests/unit_tests/test_bec_dock.py | 2 +- tests/unit_tests/test_bec_queue.py | 3 +- tests/unit_tests/test_bec_status_box.py | 3 +- tests/unit_tests/test_color_utils.py | 2 +- tests/unit_tests/test_crosshair.py | 2 +- tests/unit_tests/test_curve_settings.py | 2 +- tests/unit_tests/test_dap_combobox.py | 2 +- tests/unit_tests/test_dark_mode_button.py | 5 +- tests/unit_tests/test_device_browser.py | 3 +- tests/unit_tests/test_device_input_base.py | 2 +- tests/unit_tests/test_device_input_widgets.py | 3 +- tests/unit_tests/test_device_signal_input.py | 3 +- tests/unit_tests/test_filter_io.py | 2 +- tests/unit_tests/test_heatmap_widget.py | 7 +- tests/unit_tests/test_image_roi_tree.py | 2 +- tests/unit_tests/test_image_rois.py | 2 +- tests/unit_tests/test_image_view_next_gen.py | 2 +- tests/unit_tests/test_launch_window.py | 3 +- tests/unit_tests/test_lmfit_dialog.py | 2 +- tests/unit_tests/test_logpanel.py | 10 +-- tests/unit_tests/test_main_widnow.py | 2 +- tests/unit_tests/test_motor_map_next_gen.py | 2 +- .../test_multi_waveform_next_gen.py | 2 +- tests/unit_tests/test_notifications.py | 3 +- tests/unit_tests/test_plot_base_next_gen.py | 2 +- tests/unit_tests/test_positioner_box.py | 2 +- tests/unit_tests/test_positioner_box_2d.py | 2 +- tests/unit_tests/test_reset_button.py | 3 +- tests/unit_tests/test_resume_button.py | 3 +- tests/unit_tests/test_ring_progress_bar.py | 3 +- tests/unit_tests/test_scan_control.py | 3 +- tests/unit_tests/test_scan_history_browser.py | 5 +- tests/unit_tests/test_scan_progress_bar.py | 3 +- tests/unit_tests/test_scatter_waveform.py | 2 +- tests/unit_tests/test_signal_label.py | 5 +- tests/unit_tests/test_stop_button.py | 3 +- tests/unit_tests/test_text_box_widget.py | 3 +- .../unit_tests/test_utils_bec_signal_proxy.py | 2 +- .../unit_tests/test_utils_plot_indicators.py | 3 +- tests/unit_tests/test_vscode_widget.py | 3 +- tests/unit_tests/test_waveform.py | 14 ++-- tests/unit_tests/test_web_console.py | 3 +- tests/unit_tests/test_website_widget.py | 3 +- 50 files changed, 139 insertions(+), 153 deletions(-) rename {tests/unit_tests => bec_widgets/tests}/client_mocks.py (100%) create mode 100644 bec_widgets/tests/utils.py diff --git a/tests/unit_tests/client_mocks.py b/bec_widgets/tests/client_mocks.py similarity index 100% rename from tests/unit_tests/client_mocks.py rename to bec_widgets/tests/client_mocks.py diff --git a/bec_widgets/tests/utils.py b/bec_widgets/tests/utils.py new file mode 100644 index 000000000..74bf4cbc4 --- /dev/null +++ b/bec_widgets/tests/utils.py @@ -0,0 +1,76 @@ +from pytestqt.exceptions import TimeoutError as QtBotTimeoutError +from qtpy.QtCore import QTimer +from qtpy.QtWidgets import QApplication + +from bec_widgets.cli.rpc.rpc_register import RPCRegister +from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module +from bec_widgets.utils import error_popups + + +class TestableQTimer(QTimer): + _instances: list[tuple[QTimer, str]] = [] + _current_test_name: str = "" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + TestableQTimer._instances.append((self, TestableQTimer._current_test_name)) + + @classmethod + def check_all_stopped(cls, qtbot): + def _is_done_or_deleted(t: QTimer): + try: + return not t.isActive() + except RuntimeError as e: + return "already deleted" in e.args[0] + + try: + qtbot.waitUntil(lambda: all(_is_done_or_deleted(timer) for timer, _ in cls._instances)) + except QtBotTimeoutError as exc: + active_timers = list(filter(lambda t: t[0].isActive(), cls._instances)) + (t.stop() for t, _ in cls._instances) + raise TimeoutError(f"Failed to stop all timers: {active_timers}") from exc + cls._instances = [] + + +def qapplication_fixture(qtbot, request, testable_qtimer_class): + yield + + if request.node.stash._storage.get("failed"): + print("Test failed, skipping cleanup checks") + return + + bec_dispatcher = bec_dispatcher_module.BECDispatcher() + bec_dispatcher.stop_cli_server() + + testable_qtimer_class.check_all_stopped(qtbot) + qapp = QApplication.instance() + qapp.processEvents() + if hasattr(qapp, "os_listener") and qapp.os_listener: + qapp.removeEventFilter(qapp.os_listener) + try: + qtbot.waitUntil(lambda: qapp.topLevelWidgets() == []) + except QtBotTimeoutError as exc: + raise TimeoutError(f"Failed to close all widgets: {qapp.topLevelWidgets()}") from exc + + +def rpc_register_fixture(): + try: + yield RPCRegister() + finally: + RPCRegister.reset_singleton() + + +def bec_dispatcher_fixture(threads_check): + bec_dispatcher = bec_dispatcher_module.BECDispatcher() + try: + yield bec_dispatcher + finally: + bec_dispatcher.disconnect_all() + bec_dispatcher.client.shutdown() + bec_dispatcher.stop_cli_server() + bec_dispatcher_module.BECDispatcher.reset_singleton() + + +def clean_singleton_fixture(): + error_popups._popup_utility_instance = None + yield diff --git a/tests/conftest.py b/tests/conftest.py index f9b084487..ada9d5804 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,33 +1,7 @@ import pytest import qtpy.QtCore -from pytestqt.exceptions import TimeoutError as QtBotTimeoutError -from qtpy.QtCore import QTimer - - -class TestableQTimer(QTimer): - _instances: list[tuple[QTimer, str]] = [] - _current_test_name: str = "" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - TestableQTimer._instances.append((self, TestableQTimer._current_test_name)) - - @classmethod - def check_all_stopped(cls, qtbot): - def _is_done_or_deleted(t: QTimer): - try: - return not t.isActive() - except RuntimeError as e: - return "already deleted" in e.args[0] - - try: - qtbot.waitUntil(lambda: all(_is_done_or_deleted(timer) for timer, _ in cls._instances)) - except QtBotTimeoutError as exc: - active_timers = list(filter(lambda t: t[0].isActive(), cls._instances)) - (t.stop() for t, _ in cls._instances) - raise TimeoutError(f"Failed to stop all timers: {active_timers}") from exc - cls._instances = [] +from bec_widgets.tests.utils import TestableQTimer # To support 'from qtpy.QtCore import QTimer' syntax we just replace this completely for the test session # see: https://docs.python.org/3/library/unittest.mock.html#where-to-patch diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py index db5427dc3..2f2821e32 100644 --- a/tests/unit_tests/conftest.py +++ b/tests/unit_tests/conftest.py @@ -6,12 +6,9 @@ import pytest from bec_lib import messages from bec_lib.messages import _StoredDataInfo -from pytestqt.exceptions import TimeoutError as QtBotTimeoutError -from qtpy.QtWidgets import QApplication, QMessageBox +from qtpy.QtWidgets import QMessageBox -from bec_widgets.cli.rpc.rpc_register import RPCRegister -from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module -from bec_widgets.utils import error_popups +from bec_widgets.tests import utils as test_utils @pytest.hookimpl(tryfirst=True, hookwrapper=True) @@ -25,49 +22,22 @@ def pytest_runtest_makereport(item, call): @pytest.fixture(autouse=True) def qapplication(qtbot, request, testable_qtimer_class): # pylint: disable=unused-argument - yield - - # if the test failed, we don't want to check for open widgets as - # it simply pollutes the output - if request.node.stash._storage.get("failed"): - print("Test failed, skipping cleanup checks") - return - bec_dispatcher = bec_dispatcher_module.BECDispatcher() - bec_dispatcher.stop_cli_server() - - testable_qtimer_class.check_all_stopped(qtbot) - qapp = QApplication.instance() - qapp.processEvents() - if hasattr(qapp, "os_listener") and qapp.os_listener: - qapp.removeEventFilter(qapp.os_listener) - try: - qtbot.waitUntil(lambda: qapp.topLevelWidgets() == []) - except QtBotTimeoutError as exc: - raise TimeoutError(f"Failed to close all widgets: {qapp.topLevelWidgets()}") from exc + yield from test_utils.qapplication_fixture(qtbot, request, testable_qtimer_class) @pytest.fixture(autouse=True) def rpc_register(): - yield RPCRegister() - RPCRegister.reset_singleton() + yield from test_utils.rpc_register_fixture() @pytest.fixture(autouse=True) def bec_dispatcher(threads_check): # pylint: disable=unused-argument - bec_dispatcher = bec_dispatcher_module.BECDispatcher() - yield bec_dispatcher - bec_dispatcher.disconnect_all() - # clean BEC client - bec_dispatcher.client.shutdown() - # stop the cli server - bec_dispatcher.stop_cli_server() - # reinitialize singleton for next test - bec_dispatcher_module.BECDispatcher.reset_singleton() + yield from test_utils.bec_dispatcher_fixture(threads_check) @pytest.fixture(autouse=True) def clean_singleton(): - error_popups._popup_utility_instance = None + yield from test_utils.clean_singleton_fixture() @pytest.fixture(autouse=True) diff --git a/tests/unit_tests/test_abort_button.py b/tests/unit_tests/test_abort_button.py index ca6c18a29..eea3c594e 100644 --- a/tests/unit_tests/test_abort_button.py +++ b/tests/unit_tests/test_abort_button.py @@ -2,10 +2,9 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.buttons.button_abort.button_abort import AbortButton -from .client_mocks import mocked_client - @pytest.fixture def abort_button(qtbot, mocked_client): diff --git a/tests/unit_tests/test_axis_settings.py b/tests/unit_tests/test_axis_settings.py index 88acc04b0..de0e0b2fb 100644 --- a/tests/unit_tests/test_axis_settings.py +++ b/tests/unit_tests/test_axis_settings.py @@ -1,9 +1,9 @@ import pytest from qtpy.QtWidgets import QDoubleSpinBox, QLineEdit +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.plot_base import PlotBase from bec_widgets.widgets.plots.setting_menus.axis_settings import AxisSettings -from tests.unit_tests.client_mocks import mocked_client from tests.unit_tests.conftest import create_widget diff --git a/tests/unit_tests/test_bec_connector.py b/tests/unit_tests/test_bec_connector.py index 62b88ca76..73426a8d4 100644 --- a/tests/unit_tests/test_bec_connector.py +++ b/tests/unit_tests/test_bec_connector.py @@ -5,11 +5,10 @@ from qtpy.QtCore import QObject from qtpy.QtWidgets import QApplication +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils import BECConnector from bec_widgets.utils.error_popups import SafeSlot as Slot -from .client_mocks import mocked_client - class BECConnectorQObject(BECConnector, QObject): ... diff --git a/tests/unit_tests/test_bec_dock.py b/tests/unit_tests/test_bec_dock.py index 2f117ae3f..8706f3be5 100644 --- a/tests/unit_tests/test_bec_dock.py +++ b/tests/unit_tests/test_bec_dock.py @@ -5,9 +5,9 @@ import pytest from bec_lib.endpoints import MessageEndpoints +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.containers.dock import BECDockArea -from .client_mocks import mocked_client from .test_bec_queue import bec_queue_msg_full diff --git a/tests/unit_tests/test_bec_queue.py b/tests/unit_tests/test_bec_queue.py index e3f0f7a11..6297cdaf0 100644 --- a/tests/unit_tests/test_bec_queue.py +++ b/tests/unit_tests/test_bec_queue.py @@ -1,10 +1,9 @@ import pytest from bec_lib import messages +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.services.bec_queue.bec_queue import BECQueue -from .client_mocks import mocked_client - @pytest.fixture def bec_queue_msg_full(): diff --git a/tests/unit_tests/test_bec_status_box.py b/tests/unit_tests/test_bec_status_box.py index 363602df1..3360c5d9d 100644 --- a/tests/unit_tests/test_bec_status_box.py +++ b/tests/unit_tests/test_bec_status_box.py @@ -4,13 +4,12 @@ import pytest from bec_lib.messages import BECStatus, ServiceMetricMessage, StatusMessage +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.services.bec_status_box.bec_status_box import ( BECServiceInfoContainer, BECStatusBox, ) -from .client_mocks import mocked_client - @pytest.fixture def service_status_fixture(): diff --git a/tests/unit_tests/test_color_utils.py b/tests/unit_tests/test_color_utils.py index 7628e8ae4..c4ac57c8f 100644 --- a/tests/unit_tests/test_color_utils.py +++ b/tests/unit_tests/test_color_utils.py @@ -4,11 +4,11 @@ from qtpy.QtGui import QColor from qtpy.QtWidgets import QVBoxLayout, QWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils import Colors, ConnectionConfig from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.colors import apply_theme from bec_widgets.widgets.plots.waveform.curve import CurveConfig -from tests.unit_tests.client_mocks import mocked_client from tests.unit_tests.conftest import create_widget diff --git a/tests/unit_tests/test_crosshair.py b/tests/unit_tests/test_crosshair.py index e1461e70f..23cd438a9 100644 --- a/tests/unit_tests/test_crosshair.py +++ b/tests/unit_tests/test_crosshair.py @@ -4,10 +4,10 @@ from qtpy.QtCore import QPointF, Qt from qtpy.QtGui import QTransform +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils import Crosshair from bec_widgets.widgets.plots.image.image_item import ImageItem from bec_widgets.widgets.plots.waveform.waveform import Waveform -from tests.unit_tests.client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_curve_settings.py b/tests/unit_tests/test_curve_settings.py index 7c630bd28..fc0b9889c 100644 --- a/tests/unit_tests/test_curve_settings.py +++ b/tests/unit_tests/test_curve_settings.py @@ -6,13 +6,13 @@ from qtpy.QtGui import QValidator from qtpy.QtWidgets import QComboBox, QVBoxLayout +from bec_widgets.tests.client_mocks import dap_plugin_message, mocked_client, mocked_client_with_dap from bec_widgets.widgets.plots.waveform.settings.curve_settings.curve_setting import CurveSetting from bec_widgets.widgets.plots.waveform.settings.curve_settings.curve_tree import ( CurveTree, ScanIndexValidator, ) from bec_widgets.widgets.plots.waveform.waveform import Waveform -from tests.unit_tests.client_mocks import dap_plugin_message, mocked_client, mocked_client_with_dap from tests.unit_tests.conftest import create_widget ################################################## diff --git a/tests/unit_tests/test_dap_combobox.py b/tests/unit_tests/test_dap_combobox.py index 93cdfca0f..779c06802 100644 --- a/tests/unit_tests/test_dap_combobox.py +++ b/tests/unit_tests/test_dap_combobox.py @@ -1,8 +1,8 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.dap.dap_combo_box.dap_combo_box import DapComboBox -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_dark_mode_button.py b/tests/unit_tests/test_dark_mode_button.py index 3dca50a20..d141622da 100644 --- a/tests/unit_tests/test_dark_mode_button.py +++ b/tests/unit_tests/test_dark_mode_button.py @@ -4,12 +4,11 @@ from qtpy.QtCore import Qt from qtpy.QtWidgets import QApplication +# pylint: disable=unused-import +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.colors import set_theme from bec_widgets.widgets.utility.visual.dark_mode_button.dark_mode_button import DarkModeButton -# pylint: disable=unused-import -from .client_mocks import mocked_client - # pylint: disable=redefined-outer-name diff --git a/tests/unit_tests/test_device_browser.py b/tests/unit_tests/test_device_browser.py index 3ef97af8a..de65f371f 100644 --- a/tests/unit_tests/test_device_browser.py +++ b/tests/unit_tests/test_device_browser.py @@ -6,6 +6,7 @@ from qtpy.QtCore import QPoint, Qt from qtpy.QtWidgets import QTabWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.services.device_browser.device_browser import DeviceBrowser from bec_widgets.widgets.services.device_browser.device_item.device_config_form import ( DeviceConfigForm, @@ -14,8 +15,6 @@ SignalDisplay, ) -from .client_mocks import mocked_client - if TYPE_CHECKING: # pragma: no cover from qtpy.QtWidgets import QListWidgetItem diff --git a/tests/unit_tests/test_device_input_base.py b/tests/unit_tests/test_device_input_base.py index 02ae550d8..82390c986 100644 --- a/tests/unit_tests/test_device_input_base.py +++ b/tests/unit_tests/test_device_input_base.py @@ -4,13 +4,13 @@ from bec_lib.device import ReadoutPriority from qtpy.QtWidgets import QWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.device_input.base_classes.device_input_base import ( BECDeviceFilter, DeviceInputBase, DeviceInputConfig, ) -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_device_input_widgets.py b/tests/unit_tests/test_device_input_widgets.py index f394a2973..54dc8171e 100644 --- a/tests/unit_tests/test_device_input_widgets.py +++ b/tests/unit_tests/test_device_input_widgets.py @@ -1,14 +1,13 @@ import pytest from bec_lib.device import ReadoutPriority +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.device_input.base_classes.device_input_base import BECDeviceFilter from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import DeviceComboBox from bec_widgets.widgets.control.device_input.device_line_edit.device_line_edit import ( DeviceLineEdit, ) -from .client_mocks import mocked_client - @pytest.fixture def device_input_combobox(qtbot, mocked_client): diff --git a/tests/unit_tests/test_device_signal_input.py b/tests/unit_tests/test_device_signal_input.py index fb798af7f..a29e0514b 100644 --- a/tests/unit_tests/test_device_signal_input.py +++ b/tests/unit_tests/test_device_signal_input.py @@ -4,7 +4,7 @@ from bec_lib.device import Signal from qtpy.QtWidgets import QWidget -from bec_widgets.tests.fake_devices import FakeDevice +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.ophyd_kind_util import Kind from bec_widgets.widgets.control.device_input.base_classes.device_input_base import BECDeviceFilter from bec_widgets.widgets.control.device_input.base_classes.device_signal_input_base import ( @@ -16,7 +16,6 @@ SignalLineEdit, ) -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_filter_io.py b/tests/unit_tests/test_filter_io.py index 818faa7d5..d11f183e3 100644 --- a/tests/unit_tests/test_filter_io.py +++ b/tests/unit_tests/test_filter_io.py @@ -1,12 +1,12 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.filter_io import FilterIO from bec_widgets.widgets.control.device_input.device_line_edit.device_line_edit import ( DeviceLineEdit, ) from bec_widgets.widgets.dap.dap_combo_box.dap_combo_box import DapComboBox -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_heatmap_widget.py b/tests/unit_tests/test_heatmap_widget.py index 66010a0e0..337374da9 100644 --- a/tests/unit_tests/test_heatmap_widget.py +++ b/tests/unit_tests/test_heatmap_widget.py @@ -5,12 +5,9 @@ from bec_lib import messages from bec_lib.scan_history import ScanHistory -from bec_widgets.widgets.plots.heatmap.heatmap import Heatmap, HeatmapConfig, HeatmapDeviceSignal - # pytest: disable=unused-import -from tests.unit_tests.client_mocks import mocked_client - -from .client_mocks import create_dummy_scan_item +from bec_widgets.tests.client_mocks import create_dummy_scan_item, mocked_client +from bec_widgets.widgets.plots.heatmap.heatmap import Heatmap, HeatmapConfig, HeatmapDeviceSignal @pytest.fixture diff --git a/tests/unit_tests/test_image_roi_tree.py b/tests/unit_tests/test_image_roi_tree.py index d00866b23..b2b3fb56c 100644 --- a/tests/unit_tests/test_image_roi_tree.py +++ b/tests/unit_tests/test_image_roi_tree.py @@ -4,10 +4,10 @@ import pytest from qtpy.QtCore import QPointF, Qt +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.image.image import Image from bec_widgets.widgets.plots.image.setting_widgets.image_roi_tree import ROIPropertyTree from bec_widgets.widgets.plots.roi.image_roi import CircularROI, RectangularROI -from tests.unit_tests.client_mocks import mocked_client from tests.unit_tests.conftest import create_widget diff --git a/tests/unit_tests/test_image_rois.py b/tests/unit_tests/test_image_rois.py index f667a37bd..c6f5e88db 100644 --- a/tests/unit_tests/test_image_rois.py +++ b/tests/unit_tests/test_image_rois.py @@ -5,6 +5,7 @@ import numpy as np import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.image.image import Image from bec_widgets.widgets.plots.roi.image_roi import ( CircularROI, @@ -12,7 +13,6 @@ RectangularROI, ROIController, ) -from tests.unit_tests.client_mocks import mocked_client from tests.unit_tests.conftest import create_widget diff --git a/tests/unit_tests/test_image_view_next_gen.py b/tests/unit_tests/test_image_view_next_gen.py index 78e34705b..de05d27dc 100644 --- a/tests/unit_tests/test_image_view_next_gen.py +++ b/tests/unit_tests/test_image_view_next_gen.py @@ -3,8 +3,8 @@ import pytest from qtpy.QtCore import QPointF +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.image.image import Image -from tests.unit_tests.client_mocks import mocked_client from tests.unit_tests.conftest import create_widget ################################################## diff --git a/tests/unit_tests/test_launch_window.py b/tests/unit_tests/test_launch_window.py index f23e51654..2b2e8264b 100644 --- a/tests/unit_tests/test_launch_window.py +++ b/tests/unit_tests/test_launch_window.py @@ -8,11 +8,10 @@ import bec_widgets from bec_widgets.applications.launch_window import LaunchWindow +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.containers.auto_update.auto_updates import AutoUpdates from bec_widgets.widgets.containers.main_window.main_window import BECMainWindow -from .client_mocks import mocked_client - base_path = os.path.dirname(bec_widgets.__file__) diff --git a/tests/unit_tests/test_lmfit_dialog.py b/tests/unit_tests/test_lmfit_dialog.py index 31d1418d0..1f319670f 100644 --- a/tests/unit_tests/test_lmfit_dialog.py +++ b/tests/unit_tests/test_lmfit_dialog.py @@ -3,9 +3,9 @@ import numpy as np import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.dap.lmfit_dialog.lmfit_dialog import LMFitDialog -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_logpanel.py b/tests/unit_tests/test_logpanel.py index b9d207319..5d840e278 100644 --- a/tests/unit_tests/test_logpanel.py +++ b/tests/unit_tests/test_logpanel.py @@ -8,18 +8,12 @@ import pytest from bec_lib.messages import LogMessage -from bec_lib.redis_connector import StreamMessage from qtpy.QtCore import QDateTime -from bec_widgets.widgets.utility.logpanel._util import ( - log_time, - replace_escapes, - simple_color_format, -) +from bec_widgets.tests.client_mocks import mocked_client +from bec_widgets.widgets.utility.logpanel._util import replace_escapes, simple_color_format from bec_widgets.widgets.utility.logpanel.logpanel import DEFAULT_LOG_COLORS, LogPanel -from .client_mocks import mocked_client - TEST_TABLE_STRING = "2025-01-15 15:57:18 | bec_server.scan_server.scan_queue | [INFO] | \n \x1b[3m primary queue / ScanQueueStatus.RUNNING \x1b[0m\n┏━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━┓\n┃\x1b[1m \x1b[0m\x1b[1m queue_id \x1b[0m\x1b[1m \x1b[0m┃\x1b[1m \x1b[0m\x1b[1mscan_id\x1b[0m\x1b[1m \x1b[0m┃\x1b[1m \x1b[0m\x1b[1mis_scan\x1b[0m\x1b[1m \x1b[0m┃\x1b[1m \x1b[0m\x1b[1mtype\x1b[0m\x1b[1m \x1b[0m┃\x1b[1m \x1b[0m\x1b[1mscan_numb…\x1b[0m\x1b[1m \x1b[0m┃\x1b[1m \x1b[0m\x1b[1mIQ status\x1b[0m\x1b[1m \x1b[0m┃\n┡━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━┩\n│ bbe50c82-6… │ None │ False │ mv │ None │ PENDING │\n└─────────────┴─────────┴─────────┴──────┴────────────┴───────────┘\n\n" TEST_LOG_MESSAGES = [ diff --git a/tests/unit_tests/test_main_widnow.py b/tests/unit_tests/test_main_widnow.py index fbbce59e1..b754a82b7 100644 --- a/tests/unit_tests/test_main_widnow.py +++ b/tests/unit_tests/test_main_widnow.py @@ -5,6 +5,7 @@ from qtpy.QtGui import QEnterEvent from qtpy.QtWidgets import QApplication, QFrame, QLabel +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.containers.main_window.addons.hover_widget import ( HoverWidget, WidgetTooltip, @@ -13,7 +14,6 @@ from bec_widgets.widgets.containers.main_window.addons.web_links import BECWebLinksMixin from bec_widgets.widgets.containers.main_window.main_window import BECMainWindow -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_motor_map_next_gen.py b/tests/unit_tests/test_motor_map_next_gen.py index 277b3be17..1a5accc40 100644 --- a/tests/unit_tests/test_motor_map_next_gen.py +++ b/tests/unit_tests/test_motor_map_next_gen.py @@ -1,8 +1,8 @@ import numpy as np import pyqtgraph as pg +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.motor_map.motor_map import MotorMap -from tests.unit_tests.client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_multi_waveform_next_gen.py b/tests/unit_tests/test_multi_waveform_next_gen.py index 0b7ae96f3..1c28d5969 100644 --- a/tests/unit_tests/test_multi_waveform_next_gen.py +++ b/tests/unit_tests/test_multi_waveform_next_gen.py @@ -1,7 +1,7 @@ import numpy as np +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.multi_waveform.multi_waveform import MultiWaveform -from tests.unit_tests.client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_notifications.py b/tests/unit_tests/test_notifications.py index 3ef5f5a32..f851932ef 100644 --- a/tests/unit_tests/test_notifications.py +++ b/tests/unit_tests/test_notifications.py @@ -1,6 +1,7 @@ import pytest from qtpy import QtCore, QtGui, QtWidgets +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.error_popups import ErrorPopupUtility from bec_widgets.widgets.containers.main_window.addons.notification_center.notification_banner import ( DARK_PALETTE, @@ -13,8 +14,6 @@ SeverityKind, ) -from .client_mocks import mocked_client - @pytest.fixture def toast(qtbot): diff --git a/tests/unit_tests/test_plot_base_next_gen.py b/tests/unit_tests/test_plot_base_next_gen.py index c1918d658..e07f6585a 100644 --- a/tests/unit_tests/test_plot_base_next_gen.py +++ b/tests/unit_tests/test_plot_base_next_gen.py @@ -1,8 +1,8 @@ import numpy as np +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.plot_base import PlotBase, UIMode -from .client_mocks import mocked_client from .conftest import create_widget # pylint: disable=unused-import diff --git a/tests/unit_tests/test_positioner_box.py b/tests/unit_tests/test_positioner_box.py index 885d724cc..0ddd31adc 100644 --- a/tests/unit_tests/test_positioner_box.py +++ b/tests/unit_tests/test_positioner_box.py @@ -7,6 +7,7 @@ from qtpy.QtGui import QValidator from qtpy.QtWidgets import QPushButton +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.tests.fake_devices import Positioner from bec_widgets.widgets.control.device_control.positioner_box import ( PositionerBox, @@ -16,7 +17,6 @@ DeviceLineEdit, ) -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_positioner_box_2d.py b/tests/unit_tests/test_positioner_box_2d.py index 40535ab09..17cebd9b7 100644 --- a/tests/unit_tests/test_positioner_box_2d.py +++ b/tests/unit_tests/test_positioner_box_2d.py @@ -2,9 +2,9 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.device_control.positioner_box import PositionerBox2D -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_reset_button.py b/tests/unit_tests/test_reset_button.py index 1d0836c97..a4f3ae81b 100644 --- a/tests/unit_tests/test_reset_button.py +++ b/tests/unit_tests/test_reset_button.py @@ -5,10 +5,9 @@ import pytest from qtpy.QtWidgets import QMessageBox +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.buttons.button_reset.button_reset import ResetButton -from .client_mocks import mocked_client - @pytest.fixture def reset_button(qtbot, mocked_client): diff --git a/tests/unit_tests/test_resume_button.py b/tests/unit_tests/test_resume_button.py index b080ab605..5fda80b46 100644 --- a/tests/unit_tests/test_resume_button.py +++ b/tests/unit_tests/test_resume_button.py @@ -2,10 +2,9 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.buttons.button_resume.button_resume import ResumeButton -from .client_mocks import mocked_client - @pytest.fixture def resume_button(qtbot, mocked_client): diff --git a/tests/unit_tests/test_ring_progress_bar.py b/tests/unit_tests/test_ring_progress_bar.py index 9ff95baf6..2032af0be 100644 --- a/tests/unit_tests/test_ring_progress_bar.py +++ b/tests/unit_tests/test_ring_progress_bar.py @@ -4,13 +4,12 @@ from bec_lib.endpoints import MessageEndpoints from pydantic import ValidationError +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils import Colors from bec_widgets.widgets.progress.ring_progress_bar import RingProgressBar from bec_widgets.widgets.progress.ring_progress_bar.ring import ProgressbarConnections, RingConfig from bec_widgets.widgets.progress.ring_progress_bar.ring_progress_bar import RingProgressBarConfig -from .client_mocks import mocked_client - @pytest.fixture def ring_progress_bar(qtbot, mocked_client): diff --git a/tests/unit_tests/test_scan_control.py b/tests/unit_tests/test_scan_control.py index 30ce317d5..be928f323 100644 --- a/tests/unit_tests/test_scan_control.py +++ b/tests/unit_tests/test_scan_control.py @@ -7,12 +7,11 @@ from bec_lib.messages import AvailableResourceMessage, ScanHistoryMessage from qtpy.QtCore import QModelIndex, Qt +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.forms_from_types.items import StrFormItem from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.widgets.control.scan_control import ScanControl -from .client_mocks import mocked_client - # pylint: disable=no-member # pylint: disable=missing-function-docstring # pylint: disable=redefined-outer-name diff --git a/tests/unit_tests/test_scan_history_browser.py b/tests/unit_tests/test_scan_history_browser.py index 4ddf24e70..0615c0c91 100644 --- a/tests/unit_tests/test_scan_history_browser.py +++ b/tests/unit_tests/test_scan_history_browser.py @@ -2,10 +2,9 @@ import pytest from bec_lib.messages import ScanHistoryMessage, _StoredDataInfo -from pytestqt import qtbot from qtpy import QtCore -from bec_widgets.utils.colors import get_accent_colors +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.services.scan_history_browser.components import ( ScanHistoryDeviceViewer, ScanHistoryMetadataViewer, @@ -15,8 +14,6 @@ ScanHistoryBrowser, ) -from .client_mocks import mocked_client - @pytest.fixture def scan_history_msg(): diff --git a/tests/unit_tests/test_scan_progress_bar.py b/tests/unit_tests/test_scan_progress_bar.py index a531d4f20..9a1b41d61 100644 --- a/tests/unit_tests/test_scan_progress_bar.py +++ b/tests/unit_tests/test_scan_progress_bar.py @@ -4,6 +4,7 @@ import pytest from bec_lib import messages +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.progress.bec_progressbar.bec_progressbar import ( BECProgressBar, ProgressState, @@ -14,8 +15,6 @@ ScanProgressBar, ) -from .client_mocks import mocked_client - @pytest.fixture def scan_progressbar(qtbot, mocked_client): diff --git a/tests/unit_tests/test_scatter_waveform.py b/tests/unit_tests/test_scatter_waveform.py index 8476ebe5f..c70366df3 100644 --- a/tests/unit_tests/test_scatter_waveform.py +++ b/tests/unit_tests/test_scatter_waveform.py @@ -2,12 +2,12 @@ import numpy as np +from bec_widgets.tests.client_mocks import create_dummy_scan_item, mocked_client from bec_widgets.widgets.plots.scatter_waveform.scatter_curve import ( ScatterCurveConfig, ScatterDeviceSignal, ) from bec_widgets.widgets.plots.scatter_waveform.scatter_waveform import ScatterWaveform -from tests.unit_tests.client_mocks import create_dummy_scan_item, mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_signal_label.py b/tests/unit_tests/test_signal_label.py index 38df89b37..9f1e9e0da 100644 --- a/tests/unit_tests/test_signal_label.py +++ b/tests/unit_tests/test_signal_label.py @@ -4,15 +4,14 @@ import pytest from qtpy import QtCore -from qtpy.QtWidgets import QDialogButtonBox, QLabel +from qtpy.QtWidgets import QDialogButtonBox +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.device_input.base_classes.device_signal_input_base import ( DeviceSignalInputBaseConfig, ) from bec_widgets.widgets.utility.signal_label.signal_label import ChoiceDialog, SignalLabel -from .client_mocks import mocked_client - SAMX_INFO_DICT = { "signals": { "readback": { diff --git a/tests/unit_tests/test_stop_button.py b/tests/unit_tests/test_stop_button.py index b5ecdc1f9..deafeed75 100644 --- a/tests/unit_tests/test_stop_button.py +++ b/tests/unit_tests/test_stop_button.py @@ -2,10 +2,9 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.buttons.stop_button.stop_button import StopButton -from .client_mocks import mocked_client - @pytest.fixture def stop_button(qtbot, mocked_client): diff --git a/tests/unit_tests/test_text_box_widget.py b/tests/unit_tests/test_text_box_widget.py index 65f0f719d..d419c932b 100644 --- a/tests/unit_tests/test_text_box_widget.py +++ b/tests/unit_tests/test_text_box_widget.py @@ -1,9 +1,8 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.text_box.text_box import DEFAULT_TEXT, TextBox -from .client_mocks import mocked_client - @pytest.fixture def text_box_widget(qtbot, mocked_client): diff --git a/tests/unit_tests/test_utils_bec_signal_proxy.py b/tests/unit_tests/test_utils_bec_signal_proxy.py index e8fd50fb1..dd01ef143 100644 --- a/tests/unit_tests/test_utils_bec_signal_proxy.py +++ b/tests/unit_tests/test_utils_bec_signal_proxy.py @@ -3,10 +3,10 @@ import pyqtgraph as pg import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_signal_proxy import BECSignalProxy from bec_widgets.widgets.dap.dap_combo_box.dap_combo_box import DapComboBox -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_utils_plot_indicators.py b/tests/unit_tests/test_utils_plot_indicators.py index 6e1b491b2..2ac010580 100644 --- a/tests/unit_tests/test_utils_plot_indicators.py +++ b/tests/unit_tests/test_utils_plot_indicators.py @@ -1,10 +1,9 @@ import pytest from qtpy.QtCore import QPointF +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.waveform.waveform import Waveform -from .client_mocks import mocked_client - @pytest.fixture def plot_widget_with_arrow_item(qtbot, mocked_client): diff --git a/tests/unit_tests/test_vscode_widget.py b/tests/unit_tests/test_vscode_widget.py index d4210cba1..95630e4c3 100644 --- a/tests/unit_tests/test_vscode_widget.py +++ b/tests/unit_tests/test_vscode_widget.py @@ -5,10 +5,9 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.vscode.vscode import VSCodeEditor -from .client_mocks import mocked_client - @pytest.fixture def vscode_widget(qtbot, mocked_client): diff --git a/tests/unit_tests/test_waveform.py b/tests/unit_tests/test_waveform.py index 01c48f6d9..c13babcd4 100644 --- a/tests/unit_tests/test_waveform.py +++ b/tests/unit_tests/test_waveform.py @@ -12,13 +12,7 @@ from qtpy.QtCore import QTimer from qtpy.QtWidgets import QApplication, QCheckBox, QDialog, QDialogButtonBox, QDoubleSpinBox -from bec_widgets.widgets.plots.plot_base import UIMode -from bec_widgets.widgets.plots.waveform.curve import DeviceSignal -from bec_widgets.widgets.plots.waveform.waveform import Waveform -from bec_widgets.widgets.services.scan_history_browser.scan_history_browser import ( - ScanHistoryBrowser, -) -from tests.unit_tests.client_mocks import ( +from bec_widgets.tests.client_mocks import ( DummyData, create_dummy_scan_item, dap_plugin_message, @@ -26,6 +20,12 @@ mocked_client, mocked_client_with_dap, ) +from bec_widgets.widgets.plots.plot_base import UIMode +from bec_widgets.widgets.plots.waveform.curve import DeviceSignal +from bec_widgets.widgets.plots.waveform.waveform import Waveform +from bec_widgets.widgets.services.scan_history_browser.scan_history_browser import ( + ScanHistoryBrowser, +) from .conftest import create_widget diff --git a/tests/unit_tests/test_web_console.py b/tests/unit_tests/test_web_console.py index 3da2f9a0e..1a8cc482e 100644 --- a/tests/unit_tests/test_web_console.py +++ b/tests/unit_tests/test_web_console.py @@ -3,10 +3,9 @@ import pytest from qtpy.QtNetwork import QAuthenticator +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.web_console.web_console import WebConsole, _web_console_registry -from .client_mocks import mocked_client - @pytest.fixture def console_widget(qtbot, mocked_client): diff --git a/tests/unit_tests/test_website_widget.py b/tests/unit_tests/test_website_widget.py index 83909474a..f72b5bf35 100644 --- a/tests/unit_tests/test_website_widget.py +++ b/tests/unit_tests/test_website_widget.py @@ -1,10 +1,9 @@ import pytest from qtpy.QtCore import QUrl +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.website.website import WebsiteWidget -from .client_mocks import mocked_client - @pytest.fixture def website_widget(qtbot, mocked_client):