diff --git a/tests/client_mocks.py b/tests/client_mocks.py new file mode 100644 index 00000000..d4c9eccb --- /dev/null +++ b/tests/client_mocks.py @@ -0,0 +1,67 @@ +# pylint: disable = no-name-in-module,missing-class-docstring, missing-module-docstring + +import pytest +from unittest.mock import MagicMock + + +class FakeDevice: + """Fake minimal positioner class for testing.""" + + def __init__(self, name, enabled=True): + self.name = name + self.enabled = enabled + self.signals = {self.name: {"value": 1.0}} + self.description = {self.name: {"source": self.name}} + + def __contains__(self, item): + return item == self.name + + @property + def _hints(self): + return [self.name] + + def set_value(self, fake_value: float = 1.0) -> None: + """ + Setup fake value for device readout + Args: + fake_value(float): Desired fake value + """ + self.signals[self.name]["value"] = fake_value + + def describe(self) -> dict: + """ + Get the description of the device + Returns: + dict: Description of the device + """ + return self.description + + +def get_mocked_device(device_name: str): + """ + Helper function to mock the devices + Args: + device_name(str): Name of the device to mock + """ + return FakeDevice(name=device_name, enabled=True) + + +@pytest.fixture(scope="function") +def mocked_client(): + # Create a dictionary of mocked devices + device_names = ["samx", "gauss_bpm", "gauss_adc1", "gauss_adc2", "gauss_adc3", "bpm4i"] + mocked_devices = {name: get_mocked_device(name) for name in device_names} + + # Create a MagicMock object + client = MagicMock() + + # Mock the device_manager.devices attribute + client.device_manager.devices = MagicMock() + client.device_manager.devices.__getitem__.side_effect = lambda x: mocked_devices.get(x) + client.device_manager.devices.__contains__.side_effect = lambda x: x in mocked_devices + + # Set each device as an attribute of the mock + for name, device in mocked_devices.items(): + setattr(client.device_manager.devices, name, device) + + return client