Files
bec_widgets/tests/end-2-end/test_beamline_state_manager_e2e.py
T

74 lines
2.6 KiB
Python

from __future__ import annotations
import uuid
import pytest
from bec_lib.bl_states import DeviceWithinLimitsStateConfig
# pylint: disable=unused-argument
# pylint: disable=redefined-outer-name
# pylint: disable=protected-access
def _delete_state_if_present(bec, state_name: str) -> None:
if hasattr(bec.beamline_states, state_name):
bec.beamline_states.delete(state_name)
@pytest.mark.timeout(100)
def test_beamline_state_manager_adds_updates_and_deletes_state_e2e(
qtbot, bec_client_lib, connected_client_gui_obj
):
"""
Verify the real BEC beamline-state flow is reflected by a BeamlineStateManager
running in the GUI server, accessed through the dock area RPC interface.
"""
gui = connected_client_gui_obj
dock_area = gui.bec
bec = bec_client_lib
dev = bec.device_manager.devices
scans = bec.scans
state_name = f"samx_widget_limits_{uuid.uuid4().hex[:8]}"
config = DeviceWithinLimitsStateConfig(
name=state_name, device="samx", signal="samx", low_limit=0.0, high_limit=10.0, tolerance=1.0
)
manager = dock_area.new("BeamlineStateManager")
qtbot.waitUntil(lambda: manager._gui_id in gui._server_registry, timeout=5000)
def state_entry() -> dict[str, str]:
return manager.state_summary().get(state_name, {})
_delete_state_if_present(bec, state_name)
try:
bec.beamline_states.add(config)
qtbot.waitUntil(lambda: hasattr(bec.beamline_states, state_name), timeout=10000)
qtbot.waitUntil(lambda: state_name in manager.state_summary(), timeout=10000)
scans.umv(dev.samx, 5, relative=False).wait()
qtbot.waitUntil(
lambda: getattr(bec.beamline_states, state_name).get()["status"] == "valid",
timeout=10000,
)
qtbot.waitUntil(lambda: state_entry().get("status") == "valid", timeout=10000)
assert state_entry()["label"] == "Device samx within limits"
scans.umv(dev.samx, 20, relative=False).wait()
qtbot.waitUntil(
lambda: getattr(bec.beamline_states, state_name).get()["status"] == "invalid",
timeout=10000,
)
qtbot.waitUntil(lambda: state_entry().get("status") == "invalid", timeout=10000)
assert state_entry()["label"] == "Device samx out of limits"
bec.beamline_states.delete(state_name)
qtbot.waitUntil(lambda: not hasattr(bec.beamline_states, state_name), timeout=10000)
qtbot.waitUntil(lambda: state_name not in manager.state_summary(), timeout=10000)
finally:
_delete_state_if_present(bec, state_name)
scans.umv(dev.samx, 0, relative=False).wait()