From 882be25b733d935288b3ffe5434199057ecd8be0 Mon Sep 17 00:00:00 2001 From: perl_d Date: Tue, 25 Nov 2025 08:41:38 +0100 Subject: [PATCH] tests: add tests for shutter --- ophyd_devices/devices/optics_shutter.py | 5 +++ tests/test_shutter.py | 41 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 tests/test_shutter.py diff --git a/ophyd_devices/devices/optics_shutter.py b/ophyd_devices/devices/optics_shutter.py index df58b3b..bcb1bd5 100644 --- a/ophyd_devices/devices/optics_shutter.py +++ b/ophyd_devices/devices/optics_shutter.py @@ -21,6 +21,8 @@ def _is_state(state: int | str): def _cb(*, old_value, value, **kwargs): return value == state + return _cb + class Shutter(PSIDeviceBase): """A generic optics shutter device, for IOCs with the format '[BEAMLINE]-EH1-PSYS:SH-[A/B]-' @@ -39,6 +41,9 @@ class Shutter(PSIDeviceBase): Example usage: shutter = Shutter(name="shutter", prefix="X10SA-EH1-PSYS:SH-A-") + if shutter.enabled == ShutterEnabled.ENABLED: + st = shutter.open() + st.wait() """ diff --git a/tests/test_shutter.py b/tests/test_shutter.py new file mode 100644 index 0000000..3d45f34 --- /dev/null +++ b/tests/test_shutter.py @@ -0,0 +1,41 @@ +import pytest + +from ophyd_devices.devices.optics_shutter import Shutter, ShutterEnabled, ShutterOpenState +from ophyd_devices.tests.utils import patched_device + + +@pytest.fixture(scope="function") +def mock_shutter(): + with patched_device(Shutter, name="shutter", prefix="X10SA-EH1-PSYS:SH-A-") as shutter: + yield shutter + + +def test_shutter_open(mock_shutter): + mock_shutter.is_enabled._read_pv.mock_data = ShutterEnabled.ENABLED.value + mock_shutter.is_open._read_pv.mock_data = ShutterOpenState.CLOSED.value + st = mock_shutter.open() + assert not st.done + mock_shutter.is_open._read_pv.mock_data = ShutterOpenState.OPEN.value + assert st.done + + +def test_shutter_close(mock_shutter): + mock_shutter.is_enabled._read_pv.mock_data = ShutterEnabled.ENABLED.value + mock_shutter.is_open._read_pv.mock_data = ShutterOpenState.OPEN.value + st = mock_shutter.close() + assert not st.done + mock_shutter.is_open._read_pv.mock_data = ShutterOpenState.CLOSED.value + assert st.done + + +def test_shutter_not_enabled(mock_shutter): + with pytest.raises(RuntimeError) as e: + mock_shutter.open() + assert e.match("The shutter is disabled!") + + +def test_shutter_status(mock_shutter): + mock_shutter.is_open._read_pv.mock_data = ShutterOpenState.OPEN.value + assert mock_shutter.status() == ShutterOpenState.OPEN.value + mock_shutter.is_open._read_pv.mock_data = ShutterOpenState.CLOSED.value + assert mock_shutter.status() == ShutterOpenState.CLOSED.value