From d4eb7cbb51a400a763e26313ab3918712a4801ad Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Mon, 27 Oct 2025 13:53:04 +0100 Subject: [PATCH] fix(tests): client_mocks moved inside the package, imports for tests adjusted --- AGENTS.md | 4 +- .../tests}/client_mocks.py | 0 bec_widgets/tests/testable_qtimer.py | 52 +++++++ bec_widgets/tests/utils.py | 137 ++++++++++++++++++ tests/conftest.py | 41 +----- .../benchmarks/test_dock_area_benchmark.py | 2 +- tests/unit_tests/conftest.py | 105 +------------- tests/unit_tests/test_abort_button.py | 3 +- tests/unit_tests/test_alignment_controller.py | 2 +- tests/unit_tests/test_alignment_panel.py | 2 +- tests/unit_tests/test_axis_settings.py | 2 +- tests/unit_tests/test_beamline_state_pill.py | 2 +- tests/unit_tests/test_bec_connector.py | 3 +- tests/unit_tests/test_bec_console.py | 3 +- tests/unit_tests/test_bec_queue.py | 3 +- tests/unit_tests/test_bec_status_box.py | 3 +- tests/unit_tests/test_bec_widget_lifecycle.py | 3 +- tests/unit_tests/test_busy_loader.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_developer_view.py | 3 +- tests/unit_tests/test_device_browser.py | 3 +- ...test_device_initialization_progress_bar.py | 3 +- tests/unit_tests/test_device_input_base.py | 2 +- tests/unit_tests/test_device_input_widgets.py | 3 +- .../test_device_manager_components.py | 3 +- tests/unit_tests/test_device_manager_view.py | 3 +- tests/unit_tests/test_device_signal_input.py | 2 +- tests/unit_tests/test_dock_area.py | 3 +- tests/unit_tests/test_filter_io.py | 2 +- tests/unit_tests/test_generated_form_form.py | 3 +- tests/unit_tests/test_heatmap_widget.py | 7 +- tests/unit_tests/test_help_inspector.py | 3 +- 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 | 3 +- tests/unit_tests/test_main_app.py | 3 +- tests/unit_tests/test_main_widnow.py | 2 +- tests/unit_tests/test_monaco_dock.py | 3 +- tests/unit_tests/test_monaco_editor.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_pdf_viewer.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 +- .../unit_tests/test_ring_progress_bar_ring.py | 3 +- .../unit_tests/test_ring_progress_settings.py | 2 +- tests/unit_tests/test_rpc_server.py | 3 +- tests/unit_tests/test_scan_control.py | 3 +- tests/unit_tests/test_scan_history_browser.py | 3 +- tests/unit_tests/test_scan_index_combobox.py | 5 +- tests/unit_tests/test_scan_progress_bar.py | 3 +- tests/unit_tests/test_scatter_waveform.py | 12 +- tests/unit_tests/test_signal_label.py | 3 +- 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_waveform.py | 14 +- tests/unit_tests/test_website_widget.py | 3 +- tests/unit_tests/test_widget_io.py | 3 +- 72 files changed, 280 insertions(+), 260 deletions(-) rename {tests/unit_tests => bec_widgets/tests}/client_mocks.py (100%) create mode 100644 bec_widgets/tests/testable_qtimer.py create mode 100644 bec_widgets/tests/utils.py diff --git a/AGENTS.md b/AGENTS.md index 0fc50449..0fce8287 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -159,7 +159,9 @@ when practical. Create widgets with `create_widget(...)` from `tests/unit_tests/ registers the widget with `qtbot` so it is closed at test end; the autouse conftest fixtures handle the rest of the teardown (dispatcher disconnect, singleton resets) and fail the test if any top-level widget is left open. Before adding a new fixture, check for reusable fixtures in -`tests/unit_tests/conftest.py` and fake devices in `bec_widgets/tests/fake_devices.py`. +`tests/unit_tests/conftest.py` and the packaged helpers in `bec_widgets/tests/`: `client_mocks.py` +(`mocked_client`, `mocked_client_with_dap`), `fake_devices.py`, and `utils.py`, which holds the +bodies of the autouse fixtures so plugin repositories can reuse them. Mock BEC, Redis, and hardware in unit tests. Reuse existing helpers such as `FakeDevice`, `FakePositioner`, `DMMock`, and the shared autouse fixtures rather than rolling your own. 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/testable_qtimer.py b/bec_widgets/tests/testable_qtimer.py new file mode 100644 index 00000000..08b4ed1b --- /dev/null +++ b/bec_widgets/tests/testable_qtimer.py @@ -0,0 +1,52 @@ +""" +QTimer replacement used to detect timers that are still running at the end of a test. + +This module deliberately imports nothing but Qt and pytest-qt: it has to be patched over +``qtpy.QtCore.QTimer`` before any module that does ``from qtpy.QtCore import QTimer`` is imported. +""" + +import traceback + +from pytestqt.exceptions import TimeoutError as QtBotTimeoutError +from qtpy.QtCore import QTimer + + +class TestableQTimer(QTimer): + """ + QTimer that records every instance, so that timers left running after a test can be reported. + Patch it over ``qtpy.QtCore.QTimer`` before the widgets under test are imported. + """ + + _instances: list[tuple[QTimer, str, str]] = [] + _current_test_name: str = "" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + tb = traceback.format_stack() + init_line = list(filter(lambda msg: "QTimer(" in msg, tb))[-1] + TestableQTimer._instances.append((self, TestableQTimer._current_test_name, init_line)) + + @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] + + def _format_timers(timers: list[tuple[QTimer, str, str]]): + return "\n".join( + f"Timer: {t[0]}\n in test: {t[1]}\n created at:{t[2]}" for t in timers + ) + + 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:\n{_format_timers(active_timers)}" + ) from exc + cls._instances = [] diff --git a/bec_widgets/tests/utils.py b/bec_widgets/tests/utils.py new file mode 100644 index 00000000..43d5316b --- /dev/null +++ b/bec_widgets/tests/utils.py @@ -0,0 +1,137 @@ +""" +Shared bodies of the autouse fixtures of the bec_widgets unit tests. + +The ``*_fixture`` generators are meant to be wrapped in local fixtures, so that plugin repositories +can run their widget tests against the same mocked BEC client and leak checks, e.g.:: + + @pytest.fixture(autouse=True) + def bec_dispatcher(threads_check): + yield from bec_widgets.tests.utils.bec_dispatcher_fixture() +""" + +from unittest import mock +from unittest.mock import patch + +import fakeredis +from bec_lib import service_config +from bec_lib.client import BECClient +from bec_qthemes import apply_theme +from bec_qthemes._theme import Theme +from pytestqt.exceptions import TimeoutError as QtBotTimeoutError +from qtpy.QtCore import QEvent, QEventLoop +from qtpy.QtWidgets import QApplication + +from bec_widgets.tests.fake_devices import DEVICES, DMMock +from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module +from bec_widgets.utils import error_popups +from bec_widgets.utils.bec_dispatcher import QtRedisConnector +from bec_widgets.utils.rpc_register import RPCRegister + + +def process_all_deferred_deletes(qapp): + qapp.sendPostedEvents(None, QEvent.DeferredDelete) + qapp.processEvents(QEventLoop.AllEvents) + + +def qapplication_fixture(qtbot, request, testable_qtimer_class): + """ + Reset the application to the light theme, then check after the test that all timers are + stopped and all top-level widgets are closed. The checks are skipped for failed tests, which + requires a ``pytest_runtest_makereport`` hook that stores ``item.stash["failed"]``. + """ + qapp = QApplication.instance() + process_all_deferred_deletes(qapp) + + if ( + not hasattr(qapp, "theme") + or not isinstance(qapp.theme, Theme) + or qapp.theme.theme != "light" + ): + apply_theme("light") + qapp.processEvents() + + yield + + # Imported here so that the test session can select the ophyd control layer before ophyd loads + from ophyd._dummy_shim import _dispatcher + + from bec_widgets.widgets.editors.bec_console.bec_console import _bec_console_registry + + # stop pyepics dispatcher for leaking tests + _dispatcher.stop() + _bec_console_registry.clear() + process_all_deferred_deletes(qapp) + # 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.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(): + """Provide the RPCRegister singleton and reset it after the test.""" + yield RPCRegister() + RPCRegister.reset_singleton() + + +_REDIS_CONN: QtRedisConnector | None = None + + +def global_mock_qt_redis_connector(*_, **__): + global _REDIS_CONN + if _REDIS_CONN is None: + _REDIS_CONN = QtRedisConnector(bootstrap="localhost:1", redis_cls=fakeredis.FakeRedis) + return _REDIS_CONN + + +def mock_client(*_, **__): + """Create a BECClient on a shared fakeredis connector, populated with the fake DEVICES.""" + with ( + patch("bec_lib.client.DeviceManagerBase", DMMock), + patch("bec_lib.client.DAPPlugins"), + patch("bec_lib.client.Scans"), + patch("bec_lib.client.ScanManager"), + patch("bec_lib.bec_service.BECAccess"), + ): + client = BECClient( + config=service_config.ServiceConfig(config={"redis": {"host": "localhost", "port": 1}}), + connector_cls=global_mock_qt_redis_connector, + ) + client.start() + client.device_manager.add_devices(DEVICES) + return client + + +def bec_dispatcher_fixture(): + """ + Provide a BECDispatcher backed by :func:`mock_client` and tear it down after the test. The + wrapping fixture should depend on bec_lib's ``threads_check`` so that the thread check runs + after the client is shut down. + """ + with mock.patch.object(bec_dispatcher_module, "BECClient", mock_client): + 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() + + +def clean_singleton_fixture(): + """Drop the error popup singleton before the test.""" + error_popups._popup_utility_instance = None + yield diff --git a/tests/conftest.py b/tests/conftest.py index 1a69f676..d2cbd9d0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,46 +1,7 @@ -import traceback - 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, str]] = [] - _current_test_name: str = "" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - tb = traceback.format_stack() - init_line = list(filter(lambda msg: "QTimer(" in msg, tb))[-1] - TestableQTimer._instances.append((self, TestableQTimer._current_test_name, init_line)) - - @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] - - def _format_timers(timers: list[tuple[QTimer, str, str]]): - return "\n".join( - f"Timer: {t[0]}\n in test: {t[1]}\n created at:{t[2]}" for t in timers - ) - - 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:\n{_format_timers(active_timers)}" - ) from exc - cls._instances = [] +from bec_widgets.tests.testable_qtimer 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/benchmarks/test_dock_area_benchmark.py b/tests/unit_tests/benchmarks/test_dock_area_benchmark.py index c00f1682..4e4da1ae 100644 --- a/tests/unit_tests/benchmarks/test_dock_area_benchmark.py +++ b/tests/unit_tests/benchmarks/test_dock_area_benchmark.py @@ -2,9 +2,9 @@ from __future__ import annotations import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.containers.dock_area.dock_area import BECDockArea from bec_widgets.widgets.plots.waveform.waveform import Waveform -from tests.unit_tests.client_mocks import mocked_client @pytest.fixture diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py index f93e044f..be64f8f8 100644 --- a/tests/unit_tests/conftest.py +++ b/tests/unit_tests/conftest.py @@ -5,29 +5,15 @@ import os os.environ.setdefault("OPHYD_CONTROL_LAYER", "dummy") import json import time -from unittest import mock -from unittest.mock import patch -import fakeredis import h5py import numpy as np import pytest -from bec_lib import messages, service_config -from bec_lib.bec_service import messages -from bec_lib.client import BECClient +from bec_lib import messages from bec_lib.messages import _StoredDataInfo -from bec_qthemes import apply_theme -from bec_qthemes._theme import Theme -from ophyd._dummy_shim import _dispatcher -from pytestqt.exceptions import TimeoutError as QtBotTimeoutError -from qtpy.QtCore import QEvent, QEventLoop -from qtpy.QtWidgets import QApplication, QMessageBox +from qtpy.QtWidgets import QMessageBox -from bec_widgets.tests.fake_devices import DEVICES, DMMock -from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module -from bec_widgets.utils import error_popups -from bec_widgets.utils.bec_dispatcher import QtRedisConnector -from bec_widgets.utils.rpc_register import RPCRegister +from bec_widgets.tests import utils as test_utils from bec_widgets.widgets.containers.main_window.addons.notification_center.notification_banner import ( BECNotificationBroker, ) @@ -46,96 +32,19 @@ def pytest_runtest_makereport(item, call): item.stash["failed"] = rep.failed -def process_all_deferred_deletes(qapp): - qapp.sendPostedEvents(None, QEvent.DeferredDelete) - qapp.processEvents(QEventLoop.AllEvents) - - @pytest.fixture(autouse=True) def qapplication(qtbot, request, testable_qtimer_class): # pylint: disable=unused-argument - qapp = QApplication.instance() - process_all_deferred_deletes(qapp) - - if ( - not hasattr(qapp, "theme") - or not isinstance(qapp.theme, Theme) - or qapp.theme.theme != "light" - ): - apply_theme("light") - qapp.processEvents() - - yield - - # if the test failed, we don't want to check for open widgets as - # it simply pollutes the output - # stop pyepics dispatcher for leaking tests - - _dispatcher.stop() - from bec_widgets.widgets.editors.bec_console.bec_console import _bec_console_registry - - _bec_console_registry.clear() - process_all_deferred_deletes(qapp) - 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.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() - - -_REDIS_CONN: QtRedisConnector | None = None - - -def global_mock_qt_redis_connector(*_, **__): - global _REDIS_CONN - if _REDIS_CONN is None: - _REDIS_CONN = QtRedisConnector(bootstrap="localhost:1", redis_cls=fakeredis.FakeRedis) - return _REDIS_CONN - - -def mock_client(*_, **__): - with ( - patch("bec_lib.client.DeviceManagerBase", DMMock), - patch("bec_lib.client.DAPPlugins"), - patch("bec_lib.client.Scans"), - patch("bec_lib.client.ScanManager"), - patch("bec_lib.bec_service.BECAccess"), - ): - client = BECClient( - config=service_config.ServiceConfig(config={"redis": {"host": "localhost", "port": 1}}), - connector_cls=global_mock_qt_redis_connector, - ) - client.start() - client.device_manager.add_devices(DEVICES) - return client + yield from test_utils.rpc_register_fixture() @pytest.fixture(autouse=True) def bec_dispatcher(threads_check): # pylint: disable=unused-argument - with mock.patch.object(bec_dispatcher_module, "BECClient", mock_client): - 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() @pytest.fixture(autouse=True) @@ -147,7 +56,7 @@ def notification_broker_reset(bec_dispatcher): # pylint: disable=unused-argumen @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 44eb7698..34da4eef 100644 --- a/tests/unit_tests/test_abort_button.py +++ b/tests/unit_tests/test_abort_button.py @@ -4,10 +4,9 @@ from unittest.mock import MagicMock 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_alignment_controller.py b/tests/unit_tests/test_alignment_controller.py index ad3ebcdb..d364a5d2 100644 --- a/tests/unit_tests/test_alignment_controller.py +++ b/tests/unit_tests/test_alignment_controller.py @@ -3,13 +3,13 @@ from unittest.mock import MagicMock import numpy as np import pyqtgraph as pg +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.waveform.utils.alignment_controller import ( AlignmentContext, WaveformAlignmentController, ) from bec_widgets.widgets.plots.waveform.utils.alignment_panel import WaveformAlignmentPanel -from .client_mocks import mocked_client from .conftest import create_widget from .test_waveform import make_alignment_fit_summary diff --git a/tests/unit_tests/test_alignment_panel.py b/tests/unit_tests/test_alignment_panel.py index e63d1786..7178e960 100644 --- a/tests/unit_tests/test_alignment_panel.py +++ b/tests/unit_tests/test_alignment_panel.py @@ -1,8 +1,8 @@ from unittest.mock import MagicMock +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.waveform.utils.alignment_panel import WaveformAlignmentPanel -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_axis_settings.py b/tests/unit_tests/test_axis_settings.py index 88acc04b..de0e0b2f 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_beamline_state_pill.py b/tests/unit_tests/test_beamline_state_pill.py index a0c9939b..165b0298 100644 --- a/tests/unit_tests/test_beamline_state_pill.py +++ b/tests/unit_tests/test_beamline_state_pill.py @@ -3,6 +3,7 @@ from bec_lib import bl_states, messages from qtpy.QtCore import QCoreApplication, QEvent, Qt from qtpy.QtWidgets import QDialog, QMessageBox, QStyleOptionViewItem +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.eliding_label import ElidingLabel from bec_widgets.utils.toolbars.toolbar import ModularToolBar from bec_widgets.utils.widget_io import WidgetIO @@ -12,7 +13,6 @@ from bec_widgets.widgets.services.beamline_states.beamline_state_manager import from bec_widgets.widgets.services.beamline_states.beamline_state_pill import BeamlineStatePill from bec_widgets.widgets.services.beamline_states.dialogs import AddBeamlineStateDialog -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_bec_connector.py b/tests/unit_tests/test_bec_connector.py index 534210be..c63d661a 100644 --- a/tests/unit_tests/test_bec_connector.py +++ b/tests/unit_tests/test_bec_connector.py @@ -6,13 +6,12 @@ import pytest from qtpy.QtCore import QObject from qtpy.QtWidgets import QApplication, QWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_connector import BECConnector from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.error_popups import SafeProperty 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_console.py b/tests/unit_tests/test_bec_console.py index abd199ce..6bfd5df7 100644 --- a/tests/unit_tests/test_bec_console.py +++ b/tests/unit_tests/test_bec_console.py @@ -8,6 +8,7 @@ from qtpy.QtTest import QTest from qtpy.QtWidgets import QApplication, QWidget import bec_widgets.widgets.editors.bec_console.bec_console as bec_console_module +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.bec_console.bec_console import ( BecConsole, BECShell, @@ -16,8 +17,6 @@ from bec_widgets.widgets.editors.bec_console.bec_console import ( ) from bec_widgets.widgets.utility.bec_term.qtermwidget_wrapper import BecQTerm -from .client_mocks import mocked_client - def process_deferred_deletes(): app = QApplication.instance() diff --git a/tests/unit_tests/test_bec_queue.py b/tests/unit_tests/test_bec_queue.py index 09f0d1e0..f03cfc52 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 974fab85..b7d93c5d 100644 --- a/tests/unit_tests/test_bec_status_box.py +++ b/tests/unit_tests/test_bec_status_box.py @@ -4,13 +4,12 @@ from unittest import mock import pytest from bec_lib.messages import BECStatus, ServiceInfo, 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_bec_widget_lifecycle.py b/tests/unit_tests/test_bec_widget_lifecycle.py index 14d84ad0..4fc1aef6 100644 --- a/tests/unit_tests/test_bec_widget_lifecycle.py +++ b/tests/unit_tests/test_bec_widget_lifecycle.py @@ -4,11 +4,10 @@ from bec_lib.endpoints import MessageEndpoints from qtpy.QtCore import QEvent, QObject from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.rpc_register import RPCRegister -from .client_mocks import mocked_client - class LifecycleWidget(BECWidget, QWidget): def __init__(self, parent=None, client=None, **kwargs): diff --git a/tests/unit_tests/test_busy_loader.py b/tests/unit_tests/test_busy_loader.py index ae1a4e62..5e8fcba9 100644 --- a/tests/unit_tests/test_busy_loader.py +++ b/tests/unit_tests/test_busy_loader.py @@ -3,10 +3,9 @@ import pytest from qtpy.QtWidgets import QLabel, QVBoxLayout, QWidget from bec_widgets import BECWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.utility.spinner.spinner import SpinnerWidget -from .client_mocks import mocked_client - class _TestBusyWidget(BECWidget, QWidget): def __init__(self, parent=None, *, start_busy: bool = False, **kwargs): diff --git a/tests/unit_tests/test_color_utils.py b/tests/unit_tests/test_color_utils.py index 2c3bfa24..fe42fa69 100644 --- a/tests/unit_tests/test_color_utils.py +++ b/tests/unit_tests/test_color_utils.py @@ -4,11 +4,11 @@ from pydantic import ValidationError from qtpy.QtGui import QColor from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_connector import ConnectionConfig from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.utils.colors import Colors, apply_theme, get_theme_name, rgba, theme_color 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 8ea554ab..02d164a5 100644 --- a/tests/unit_tests/test_crosshair.py +++ b/tests/unit_tests/test_crosshair.py @@ -4,10 +4,10 @@ import pytest from qtpy.QtCore import QPointF, Qt from qtpy.QtGui import QTransform +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.crosshair 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 6e330a38..29c832eb 100644 --- a/tests/unit_tests/test_curve_settings.py +++ b/tests/unit_tests/test_curve_settings.py @@ -5,10 +5,10 @@ import pytest from bec_lib.scan_history import ScanHistory 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 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 dccd4c6d..5e9cbb54 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 59a20702..fc576c44 100644 --- a/tests/unit_tests/test_dark_mode_button.py +++ b/tests/unit_tests/test_dark_mode_button.py @@ -3,12 +3,11 @@ from unittest import mock import pytest from qtpy.QtCore import Qt +# pylint: disable=unused-import +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.colors import apply_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_developer_view.py b/tests/unit_tests/test_developer_view.py index 2d819bb7..8bd76e2d 100644 --- a/tests/unit_tests/test_developer_view.py +++ b/tests/unit_tests/test_developer_view.py @@ -18,12 +18,11 @@ import pytest from qtpy.QtWidgets import QDialog from bec_widgets.applications.views.developer_view.developer_widget import DeveloperWidget +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.monaco.monaco_dock import MonacoDock from bec_widgets.widgets.editors.monaco.monaco_widget import MonacoWidget from bec_widgets.widgets.utility.ide_explorer.ide_explorer import IDEExplorer -from .client_mocks import mocked_client - @pytest.fixture def developer_view(qtbot, mocked_client): diff --git a/tests/unit_tests/test_device_browser.py b/tests/unit_tests/test_device_browser.py index f996d96a..c3d81b8e 100644 --- a/tests/unit_tests/test_device_browser.py +++ b/tests/unit_tests/test_device_browser.py @@ -6,6 +6,7 @@ from bec_lib.device import Device 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 @@ from bec_widgets.widgets.services.device_browser.device_item.device_signal_displ 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_initialization_progress_bar.py b/tests/unit_tests/test_device_initialization_progress_bar.py index c08a82b9..045b228e 100644 --- a/tests/unit_tests/test_device_initialization_progress_bar.py +++ b/tests/unit_tests/test_device_initialization_progress_bar.py @@ -2,12 +2,11 @@ import pytest from bec_lib.messages import DeviceInitializationProgressMessage +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.progress.device_initialization_progress_bar.device_initialization_progress_bar import ( DeviceInitializationProgressBar, ) -from .client_mocks import mocked_client - @pytest.fixture def progress_bar(qtbot, mocked_client): diff --git a/tests/unit_tests/test_device_input_base.py b/tests/unit_tests/test_device_input_base.py index f768e018..294ef7ac 100644 --- a/tests/unit_tests/test_device_input_base.py +++ b/tests/unit_tests/test_device_input_base.py @@ -2,13 +2,13 @@ from unittest import mock from bec_lib.device import Positioner, ReadoutPriority +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import ( BECDeviceFilter, DeviceComboBox, 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 d1dbbef9..a9c5f9eb 100644 --- a/tests/unit_tests/test_device_input_widgets.py +++ b/tests/unit_tests/test_device_input_widgets.py @@ -3,14 +3,13 @@ from unittest import mock import pytest from bec_lib.device import ReadoutPriority +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.tests.fake_devices import FakeDevice from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import ( BECDeviceFilter, DeviceComboBox, ) -from .client_mocks import mocked_client - @pytest.fixture def device_input_combobox(qtbot, mocked_client): diff --git a/tests/unit_tests/test_device_manager_components.py b/tests/unit_tests/test_device_manager_components.py index 370d806b..e513c0e5 100644 --- a/tests/unit_tests/test_device_manager_components.py +++ b/tests/unit_tests/test_device_manager_components.py @@ -14,6 +14,7 @@ from ophyd_devices.interfaces.device_config_templates.ophyd_templates import ( from ophyd_devices.utils.static_device_test import TestResult from qtpy import QtCore, QtGui, QtWidgets +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_list import BECList from bec_widgets.utils.colors import get_accent_colors from bec_widgets.widgets.control.device_manager import DeviceTable, DMConfigView, DocstringView @@ -57,8 +58,6 @@ from bec_widgets.widgets.control.device_manager.components.ophyd_validation.vali ) from bec_widgets.widgets.utility.toggle.toggle import ToggleSwitch -from .client_mocks import mocked_client - class TestConstants: """Test class for constants and configuration values.""" diff --git a/tests/unit_tests/test_device_manager_view.py b/tests/unit_tests/test_device_manager_view.py index 4f97dbfa..dc0f59c3 100644 --- a/tests/unit_tests/test_device_manager_view.py +++ b/tests/unit_tests/test_device_manager_view.py @@ -30,6 +30,7 @@ from bec_widgets.applications.views.device_manager_view.device_manager_view impo DeviceManagerView, DeviceManagerWidget, ) +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.colors import get_accent_colors from bec_widgets.widgets.control.device_manager.components import ( DeviceTable, @@ -43,8 +44,6 @@ from bec_widgets.widgets.control.device_manager.components.ophyd_validation.ophy OphydValidation, ) -from .client_mocks import mocked_client - @pytest.fixture def device_config() -> dict: diff --git a/tests/unit_tests/test_device_signal_input.py b/tests/unit_tests/test_device_signal_input.py index ce90bc80..2da69c5d 100644 --- a/tests/unit_tests/test_device_signal_input.py +++ b/tests/unit_tests/test_device_signal_input.py @@ -7,6 +7,7 @@ from bec_lib.callback_handler import EventType from bec_lib.device import Signal from qtpy.QtCore import Qt +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.device_combobox.device_combobox import ( BECDeviceFilter, @@ -17,7 +18,6 @@ from bec_widgets.widgets.control.device_input.signal_combobox.signal_combobox im SignalComboBoxConfig, ) -from .client_mocks import mocked_client from .conftest import create_widget diff --git a/tests/unit_tests/test_dock_area.py b/tests/unit_tests/test_dock_area.py index 9d1ca417..fa91bbc1 100644 --- a/tests/unit_tests/test_dock_area.py +++ b/tests/unit_tests/test_dock_area.py @@ -13,6 +13,7 @@ from qtpy.QtWidgets import QDialog, QMessageBox, QToolButton, QWidget import bec_widgets.widgets.containers.dock_area.basic_dock_area as basic_dock_module import bec_widgets.widgets.containers.dock_area.dock_area as dock_area_module import bec_widgets.widgets.containers.dock_area.profile_utils as profile_utils +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.containers.dock_area.basic_dock_area import ( DockAreaWidget, DockSettingsDialog, @@ -44,8 +45,6 @@ from bec_widgets.widgets.containers.dock_area.settings.dialogs import ( from bec_widgets.widgets.containers.dock_area.settings.workspace_manager import WorkSpaceManager from bec_widgets.widgets.plots.waveform.waveform import Waveform -from .client_mocks import mocked_client - @pytest.fixture def advanced_dock_area(qtbot, mocked_client): diff --git a/tests/unit_tests/test_filter_io.py b/tests/unit_tests/test_filter_io.py index 0de54e9b..52081f77 100644 --- a/tests/unit_tests/test_filter_io.py +++ b/tests/unit_tests/test_filter_io.py @@ -1,9 +1,9 @@ from qtpy.QtWidgets import QComboBox +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.filter_io import get_bec_signals_for_classes, replace_combobox_items 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_generated_form_form.py b/tests/unit_tests/test_generated_form_form.py index 5017d243..df65f437 100644 --- a/tests/unit_tests/test_generated_form_form.py +++ b/tests/unit_tests/test_generated_form_form.py @@ -7,6 +7,7 @@ from bec_lib.scan_args import ScanArgument from pydantic import BaseModel, Field from qtpy.QtWidgets import QCheckBox, QLabel, QLineEdit +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.forms_from_types.forms import PydanticModelForm, TypedForm from bec_widgets.utils.forms_from_types.items import FloatDecimalFormItem, IntFormItem, StrFormItem from bec_widgets.utils.forms_from_types.pydantic_widget_form import ( @@ -18,8 +19,6 @@ from bec_widgets.widgets.control.device_input.device_combobox.device_combobox im from bec_widgets.widgets.control.device_input.signal_combobox.signal_combobox import SignalComboBox from bec_widgets.widgets.utility.spinbox.decimal_spinbox import BECSpinBox -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_heatmap_widget.py b/tests/unit_tests/test_heatmap_widget.py index f0cdd065..29ccd02a 100644 --- a/tests/unit_tests/test_heatmap_widget.py +++ b/tests/unit_tests/test_heatmap_widget.py @@ -7,6 +7,8 @@ from bec_lib.scan_history import ScanHistory from qtpy.QtCore import QPointF from qtpy.QtGui import QTransform +# pytest: disable=unused-import +from bec_widgets.tests.client_mocks import create_dummy_scan_item, mocked_client from bec_widgets.widgets.plots.heatmap.heatmap import ( Heatmap, HeatmapConfig, @@ -16,11 +18,6 @@ from bec_widgets.widgets.plots.heatmap.heatmap import ( ) from bec_widgets.widgets.plots.plot_info_label import TextOnlyLegendSample -# pytest: disable=unused-import -from tests.unit_tests.client_mocks import mocked_client - -from .client_mocks import create_dummy_scan_item - @pytest.fixture def heatmap_widget(qtbot, mocked_client): diff --git a/tests/unit_tests/test_help_inspector.py b/tests/unit_tests/test_help_inspector.py index 5ab96274..5ae26b2c 100644 --- a/tests/unit_tests/test_help_inspector.py +++ b/tests/unit_tests/test_help_inspector.py @@ -5,12 +5,11 @@ from unittest import mock import pytest from qtpy import QtCore, QtWidgets +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.help_inspector.help_inspector import HelpInspector from bec_widgets.utils.widget_io import WidgetHierarchy from bec_widgets.widgets.control.buttons.button_abort.button_abort import AbortButton -from .client_mocks import mocked_client - @pytest.fixture def help_inspector(qtbot, mocked_client): diff --git a/tests/unit_tests/test_image_roi_tree.py b/tests/unit_tests/test_image_roi_tree.py index d00866b2..b2b3fb56 100644 --- a/tests/unit_tests/test_image_roi_tree.py +++ b/tests/unit_tests/test_image_roi_tree.py @@ -4,10 +4,10 @@ import numpy as np 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 f667a37b..c6f5e88d 100644 --- a/tests/unit_tests/test_image_rois.py +++ b/tests/unit_tests/test_image_rois.py @@ -5,6 +5,7 @@ from typing import Literal 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 @@ from bec_widgets.widgets.plots.roi.image_roi import ( 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 269480b9..4a41648a 100644 --- a/tests/unit_tests/test_image_view_next_gen.py +++ b/tests/unit_tests/test_image_view_next_gen.py @@ -4,13 +4,13 @@ import pytest from bec_lib.endpoints import MessageEndpoints from qtpy.QtCore import QPointF, Qt +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.image.bec_histogram_lut_item import ( BECColorBarItem, BECHistogramLUTItem, ) from bec_widgets.widgets.plots.image.image import Image from bec_widgets.widgets.plots.image.image_processor import ImageProcessor, ProcessingConfig -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 a0a7a397..2836cb3d 100644 --- a/tests/unit_tests/test_launch_window.py +++ b/tests/unit_tests/test_launch_window.py @@ -10,11 +10,10 @@ from qtpy.QtWidgets import QWidget import bec_widgets from bec_widgets.applications.launch_window import START_EMPTY_PROFILE_OPTION, 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 4299949b..f432d48c 100644 --- a/tests/unit_tests/test_lmfit_dialog.py +++ b/tests/unit_tests/test_lmfit_dialog.py @@ -3,9 +3,9 @@ from unittest import mock 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 595ef1d9..32710cd7 100644 --- a/tests/unit_tests/test_logpanel.py +++ b/tests/unit_tests/test_logpanel.py @@ -12,11 +12,10 @@ from bec_lib.logger import LogLevel from bec_lib.messages import LogMessage from qtpy.QtCore import QDateTime, Qt +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.colors import apply_theme, get_accent_colors, get_theme_name from bec_widgets.widgets.utility.logpanel.logpanel import LogPanel, TimestampUpdate -from .client_mocks import mocked_client - TEST_LOG_MESSAGES = [ {"data": msg} for msg in [ diff --git a/tests/unit_tests/test_main_app.py b/tests/unit_tests/test_main_app.py index aeaf2e38..ebdeb33c 100644 --- a/tests/unit_tests/test_main_app.py +++ b/tests/unit_tests/test_main_app.py @@ -4,14 +4,13 @@ from qtpy.QtWidgets import QWidget from bec_widgets.applications.main_app import BECMainApp from bec_widgets.applications.views.view import ViewBase +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.widgets.containers.dock_area.profile_utils import ( is_experimental_features_enabled, set_experimental_features_enabled, ) -from .client_mocks import mocked_client - ANIM_TEST_DURATION = 60 # ms diff --git a/tests/unit_tests/test_main_widnow.py b/tests/unit_tests/test_main_widnow.py index 491e41d8..2f0c210a 100644 --- a/tests/unit_tests/test_main_widnow.py +++ b/tests/unit_tests/test_main_widnow.py @@ -8,6 +8,7 @@ from qtpy.QtCore import QEvent, QPoint, QPointF, QSettings from qtpy.QtGui import QEnterEvent from qtpy.QtWidgets import QApplication, QFrame, QLabel, QMessageBox +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.containers.dock_area.profile_utils import SETTINGS_KEYS from bec_widgets.widgets.containers.main_window.addons.hover_widget import ( HoverWidget, @@ -17,7 +18,6 @@ from bec_widgets.widgets.containers.main_window.addons.scroll_label import Scrol 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_monaco_dock.py b/tests/unit_tests/test_monaco_dock.py index 659c0c56..33de2524 100644 --- a/tests/unit_tests/test_monaco_dock.py +++ b/tests/unit_tests/test_monaco_dock.py @@ -5,11 +5,10 @@ from unittest import mock import pytest from qtpy.QtWidgets import QFileDialog, QMessageBox +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.editors.monaco.monaco_dock import MonacoDock from bec_widgets.widgets.editors.monaco.monaco_widget import MonacoWidget -from .client_mocks import mocked_client - @pytest.fixture def monaco_dock(qtbot, mocked_client) -> Generator[MonacoDock, None, None]: diff --git a/tests/unit_tests/test_monaco_editor.py b/tests/unit_tests/test_monaco_editor.py index d4e3c28e..06a12c35 100644 --- a/tests/unit_tests/test_monaco_editor.py +++ b/tests/unit_tests/test_monaco_editor.py @@ -3,11 +3,11 @@ from unittest import mock import pytest from bec_lib.endpoints import MessageEndpoints +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.widgets.editors.monaco.monaco_widget import MonacoWidget from bec_widgets.widgets.editors.monaco.scan_control_dialog import ScanControlDialog -from .client_mocks import mocked_client from .test_scan_control import available_scans_message diff --git a/tests/unit_tests/test_motor_map_next_gen.py b/tests/unit_tests/test_motor_map_next_gen.py index 5a348675..ac8a75b2 100644 --- a/tests/unit_tests/test_motor_map_next_gen.py +++ b/tests/unit_tests/test_motor_map_next_gen.py @@ -1,7 +1,7 @@ from qtpy.QtTest import QSignalSpy +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 babbc179..b549ea2c 100644 --- a/tests/unit_tests/test_multi_waveform_next_gen.py +++ b/tests/unit_tests/test_multi_waveform_next_gen.py @@ -2,8 +2,8 @@ import numpy as np from bec_lib import messages from bec_lib.scan_items import ScanItem +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 eab2b1a7..aad35c58 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 @@ from bec_widgets.widgets.containers.main_window.addons.notification_center.notif SeverityKind, ) -from .client_mocks import mocked_client - @pytest.fixture def toast(qtbot): diff --git a/tests/unit_tests/test_pdf_viewer.py b/tests/unit_tests/test_pdf_viewer.py index 80da6075..61cf9186 100644 --- a/tests/unit_tests/test_pdf_viewer.py +++ b/tests/unit_tests/test_pdf_viewer.py @@ -2,10 +2,9 @@ import pytest from qtpy.QtPdf import QPdfDocument from qtpy.QtPdfWidgets import QPdfView +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.utility.pdf_viewer.pdf_viewer import PdfViewerWidget -from .client_mocks import mocked_client - @pytest.fixture def pdf_viewer_widget(qtbot, mocked_client): diff --git a/tests/unit_tests/test_plot_base_next_gen.py b/tests/unit_tests/test_plot_base_next_gen.py index e105b1da..886e674a 100644 --- a/tests/unit_tests/test_plot_base_next_gen.py +++ b/tests/unit_tests/test_plot_base_next_gen.py @@ -4,6 +4,7 @@ from bec_lib import messages from bec_lib.scan_data_container import ScanDataContainer from bec_lib.scan_items import ScanItem +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.plots.heatmap.heatmap import Heatmap from bec_widgets.widgets.plots.image.image import Image from bec_widgets.widgets.plots.motor_map.motor_map import MotorMap @@ -13,7 +14,6 @@ from bec_widgets.widgets.plots.plot_info_label import TextOnlyLegendSample from bec_widgets.widgets.plots.scatter_waveform.scatter_waveform import ScatterWaveform from bec_widgets.widgets.plots.waveform.waveform import Waveform -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 e7d7b75f..59225349 100644 --- a/tests/unit_tests/test_positioner_box.py +++ b/tests/unit_tests/test_positioner_box.py @@ -7,6 +7,7 @@ from qtpy.QtCore import Qt, QTimer 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, @@ -14,7 +15,6 @@ from bec_widgets.widgets.control.device_control.positioner_box import ( ) from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import DeviceComboBox -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 43ea5def..e687f1bd 100644 --- a/tests/unit_tests/test_positioner_box_2d.py +++ b/tests/unit_tests/test_positioner_box_2d.py @@ -4,9 +4,9 @@ import pytest from bec_lib.endpoints import MessageEndpoints from bec_lib.messages import VariableMessage +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 1d0836c9..a4f3ae81 100644 --- a/tests/unit_tests/test_reset_button.py +++ b/tests/unit_tests/test_reset_button.py @@ -5,10 +5,9 @@ from unittest.mock import patch 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 b080ab60..5fda80b4 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 92f93349..3684b8a4 100644 --- a/tests/unit_tests/test_ring_progress_bar.py +++ b/tests/unit_tests/test_ring_progress_bar.py @@ -8,14 +8,13 @@ from qtpy.QtCore import QEvent, QPoint, QPointF, Qt from qtpy.QtGui import QColor, QMouseEvent from qtpy.QtWidgets import QApplication +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.colors import Colors from bec_widgets.widgets.progress.ring_progress_bar.ring_progress_bar import ( RingProgressBar, RingProgressContainerWidget, ) -from .client_mocks import mocked_client - @pytest.fixture def ring_progress_bar(qtbot, mocked_client): diff --git a/tests/unit_tests/test_ring_progress_bar_ring.py b/tests/unit_tests/test_ring_progress_bar_ring.py index 321b9746..5c5f3fb2 100644 --- a/tests/unit_tests/test_ring_progress_bar_ring.py +++ b/tests/unit_tests/test_ring_progress_bar_ring.py @@ -6,14 +6,13 @@ import pytest from bec_lib.endpoints import MessageEndpoints from qtpy.QtGui import QColor +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.tests.fake_devices import FakeDevice from bec_widgets.widgets.progress.ring_progress_bar.ring import ProgressbarConfig, Ring from bec_widgets.widgets.progress.ring_progress_bar.ring_progress_bar import ( RingProgressContainerWidget, ) -from .client_mocks import mocked_client - @pytest.fixture def ring_container(qtbot, mocked_client): diff --git a/tests/unit_tests/test_ring_progress_settings.py b/tests/unit_tests/test_ring_progress_settings.py index 341e7ade..b6af9b23 100644 --- a/tests/unit_tests/test_ring_progress_settings.py +++ b/tests/unit_tests/test_ring_progress_settings.py @@ -1,9 +1,9 @@ import pytest +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.settings_dialog import SettingsDialog from bec_widgets.widgets.progress.ring_progress_bar.ring_progress_bar import RingProgressBar from bec_widgets.widgets.progress.ring_progress_bar.ring_progress_settings_cards import RingSettings -from tests.unit_tests.client_mocks import mocked_client @pytest.fixture diff --git a/tests/unit_tests/test_rpc_server.py b/tests/unit_tests/test_rpc_server.py index 27b947a9..001cd389 100644 --- a/tests/unit_tests/test_rpc_server.py +++ b/tests/unit_tests/test_rpc_server.py @@ -7,12 +7,11 @@ from qtpy.QtWidgets import QWidget from bec_widgets.applications import companion_app as companion_app_module from bec_widgets.applications.companion_app import GUIServer +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils import rpc_server as rpc_server_module from bec_widgets.utils.bec_connector import BECConnector from bec_widgets.utils.rpc_server import RegistryNotReadyError, RPCServer, SingleshotRPCRepeat -from .client_mocks import mocked_client - class DummyWidget(BECConnector, QWidget): def __init__(self, parent=None, client=None, **kwargs): diff --git a/tests/unit_tests/test_scan_control.py b/tests/unit_tests/test_scan_control.py index 37f299fe..91d77b78 100644 --- a/tests/unit_tests/test_scan_control.py +++ b/tests/unit_tests/test_scan_control.py @@ -10,6 +10,7 @@ from bec_lib.scan_history import ScanHistory from qtpy.QtCore import QModelIndex, QPoint, Qt from qtpy.QtWidgets import QCheckBox, QComboBox, QDialog, QStyle +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.device_input.device_combobox.device_combobox import DeviceComboBox @@ -19,8 +20,6 @@ from bec_widgets.widgets.control.scan_control.scan_control import ScanControlCon from bec_widgets.widgets.control.scan_control.scan_info_adapter import ScanInfoAdapter from bec_widgets.widgets.control.scan_control.scan_selection_dialog import ScanSelectionDialog -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 4ddf24e7..5cb2940a 100644 --- a/tests/unit_tests/test_scan_history_browser.py +++ b/tests/unit_tests/test_scan_history_browser.py @@ -5,6 +5,7 @@ from bec_lib.messages import ScanHistoryMessage, _StoredDataInfo from pytestqt import qtbot from qtpy import QtCore +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.colors import get_accent_colors from bec_widgets.widgets.services.scan_history_browser.components import ( ScanHistoryDeviceViewer, @@ -15,8 +16,6 @@ from bec_widgets.widgets.services.scan_history_browser.scan_history_browser impo ScanHistoryBrowser, ) -from .client_mocks import mocked_client - @pytest.fixture def scan_history_msg(): diff --git a/tests/unit_tests/test_scan_index_combobox.py b/tests/unit_tests/test_scan_index_combobox.py index 49d68fcf..7f0d8011 100644 --- a/tests/unit_tests/test_scan_index_combobox.py +++ b/tests/unit_tests/test_scan_index_combobox.py @@ -2,10 +2,9 @@ import pytest from bec_lib.scan_history import ScanHistory from qtpy.QtCore import Qt -from bec_widgets.widgets.utility.scan_index_combobox.scan_index_combobox import ScanIndexComboBox - # pylint: disable=unused-import -from tests.unit_tests.client_mocks import mocked_client +from bec_widgets.tests.client_mocks import mocked_client +from bec_widgets.widgets.utility.scan_index_combobox.scan_index_combobox import ScanIndexComboBox from tests.unit_tests.conftest import create_widget diff --git a/tests/unit_tests/test_scan_progress_bar.py b/tests/unit_tests/test_scan_progress_bar.py index 65a18fad..2b8a4daf 100644 --- a/tests/unit_tests/test_scan_progress_bar.py +++ b/tests/unit_tests/test_scan_progress_bar.py @@ -4,6 +4,7 @@ import numpy as np import pytest from bec_lib.endpoints import MessageEndpoints +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.bec_widget import BECWidget from bec_widgets.widgets.progress.bec_progressbar.bec_progressbar import ( BECProgressBar, @@ -12,8 +13,6 @@ from bec_widgets.widgets.progress.bec_progressbar.bec_progressbar import ( from bec_widgets.widgets.progress.progress_backend import ProgressTask from bec_widgets.widgets.progress.scan_progressbar.scan_progressbar import 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 7f50921e..b75bdfd2 100644 --- a/tests/unit_tests/test_scatter_waveform.py +++ b/tests/unit_tests/test_scatter_waveform.py @@ -3,6 +3,12 @@ from unittest.mock import patch import numpy as np from bec_lib.scan_data_container import ScanDataContainer +from bec_widgets.tests.client_mocks import ( + DummyData, + create_dummy_scan_item, + inject_scan_history, + mocked_client, +) from bec_widgets.widgets.plots.scatter_waveform.scatter_curve import ( ScatterCurveConfig, ScatterDeviceSignal, @@ -11,12 +17,6 @@ from bec_widgets.widgets.plots.scatter_waveform.scatter_waveform import ScatterW from bec_widgets.widgets.plots.scatter_waveform.settings.scatter_curve_setting import ( ScatterCurveSettings, ) -from tests.unit_tests.client_mocks import ( - DummyData, - create_dummy_scan_item, - inject_scan_history, - 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 de0c98fb..2fd9f4de 100644 --- a/tests/unit_tests/test_signal_label.py +++ b/tests/unit_tests/test_signal_label.py @@ -6,13 +6,12 @@ import pytest from qtpy import QtCore from qtpy.QtWidgets import QDialogButtonBox, QLabel +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.widgets.control.device_input.signal_combobox.signal_combobox import ( SignalComboBoxConfig, ) 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 d6e1ac16..55db0dfe 100644 --- a/tests/unit_tests/test_stop_button.py +++ b/tests/unit_tests/test_stop_button.py @@ -4,10 +4,9 @@ from unittest.mock import MagicMock 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 65f0f719..d419c932 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 292cc2db..d1852be2 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 @@ from unittest import mock 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 c156bb38..4036334d 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_waveform.py b/tests/unit_tests/test_waveform.py index 13e092d4..d0fd2299 100644 --- a/tests/unit_tests/test_waveform.py +++ b/tests/unit_tests/test_waveform.py @@ -15,13 +15,7 @@ from pyqtgraph.graphicsItems.DateAxisItem import DateAxisItem 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, @@ -29,6 +23,12 @@ from tests.unit_tests.client_mocks import ( 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_website_widget.py b/tests/unit_tests/test_website_widget.py index 83909474..f72b5bf3 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): diff --git a/tests/unit_tests/test_widget_io.py b/tests/unit_tests/test_widget_io.py index dd3f1d12..46de7f01 100644 --- a/tests/unit_tests/test_widget_io.py +++ b/tests/unit_tests/test_widget_io.py @@ -15,13 +15,12 @@ from qtpy.QtWidgets import ( QWidget, ) +from bec_widgets.tests.client_mocks import mocked_client from bec_widgets.utils.widget_io import WidgetHierarchy, WidgetIO, WidgetTreeNode from bec_widgets.widgets.control.device_input.device_combobox.device_combobox import DeviceComboBox from bec_widgets.widgets.control.device_input.signal_combobox.signal_combobox import SignalComboBox from bec_widgets.widgets.utility.toggle.toggle import ToggleSwitch -from .client_mocks import mocked_client - @pytest.fixture(scope="function") def example_widget(qtbot):