Files
2026-07-06 15:39:02 +02:00

85 lines
2.6 KiB
Python

from unittest.mock import MagicMock, patch
import pytest
from aarecommon.models.beamline import MXBeamline
from aare.devices.fluorimeter import Fluorimeter
@patch("aare.devices.fluorimeter.PV")
def test_fluorimeter_init(mock_pv):
_ = Fluorimeter(MXBeamline.X06DA)
# Lots of PVs in __init__
assert mock_pv.call_count >= 20
@patch("aare.devices.fluorimeter.PV")
def test_fluorimeter_acquisition(mock_pv):
mock_start = MagicMock()
mock_stop = MagicMock()
mock_erase_start = MagicMock()
# We need to map which mock is which.
# __init__ order: start, stop, erase_and_start, erase, ...
mock_pv.side_effect = [mock_start, mock_stop, mock_erase_start] + [MagicMock()] * 50
fluo = Fluorimeter(MXBeamline.X06DA)
fluo.start_acquisition(erase=False)
mock_start.put.assert_called_with(1)
fluo.start_acquisition(erase=True)
mock_erase_start.put.assert_called_with(1)
fluo.stop_acquisition()
mock_stop.put.assert_called_with(1)
@patch("aare.devices.fluorimeter.PV")
def test_fluorimeter_status(mock_pv):
mock_status = MagicMock()
# status is the 6th PV in __init__
mock_pv.side_effect = [MagicMock()] * 5 + [mock_status] + [MagicMock()] * 50
fluo = Fluorimeter(MXBeamline.X06DA)
mock_status.get.return_value = 0
assert fluo.check_status_done() is True
assert fluo.check_status_acquiring() is None
mock_status.get.return_value = 1
assert fluo.check_status_done() is None
assert fluo.check_status_acquiring() is True
@patch("aare.devices.fluorimeter.poll")
@patch("aare.devices.fluorimeter.PV")
def test_fluorimeter_wait_timeout(mock_pv, mock_poll):
mock_status = MagicMock()
mock_pv.side_effect = [MagicMock()] * 5 + [mock_status] + [MagicMock()] * 50
fluo = Fluorimeter(MXBeamline.X06DA)
mock_status.get.return_value = 1 # Acquiring (not done)
with pytest.raises(TimeoutError, match="timeout waiting for done"):
fluo.wait_till_done(timeout_s=0.1)
@patch("aare.devices.fluorimeter.PV")
def test_fluorimeter_properties(mock_pv):
mock_real_time = MagicMock()
# real_time is 7th PV
mock_pv.side_effect = [MagicMock()] * 6 + [mock_real_time] + [MagicMock()] * 50
fluo = Fluorimeter(MXBeamline.X06DA)
mock_real_time.get.return_value = 10.0
assert fluo.real_time == 10.0
fluo.real_time = 20.0
mock_real_time.put.assert_called_with(20.0)
def test_fluorimeter_roi_error():
with patch("aare.devices.fluorimeter.PV"):
fluo = Fluorimeter(MXBeamline.X06DA)
with pytest.raises(ValueError, match="Invalid ROI number"):
fluo.get_roi("BL", 3)