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)