import os import sys from unittest.mock import MagicMock, patch import numpy as np import pytest from PySide6.QtWidgets import QApplication from fastapi.testclient import TestClient from aare.common.models import SampleShortInfo, DewarAddress # Ensure safe defaults during tests os.environ.setdefault("BEAMLINE", "SIMULATED") os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") os.environ.setdefault("JWT_AAREDAQ_KEY", "test_key_for_unit_testing") # ------------------------- # Qt app fixture # ------------------------- @pytest.fixture(scope="session") def qapp(): app = QApplication.instance() if app is None: app = QApplication(sys.argv) return app @pytest.fixture def sample_info(): return SampleShortInfo( db_id=1, puck_name="puck1", dewar_name="dew1", sample_name="sample1", run_number=1, user="group1", pin=3, location=DewarAddress(segment="A", pos=2), ) # ------------------------- # Shared DAQ server fixtures # ------------------------- @pytest.fixture def mock_backend(): import aare.daq.server as server with patch("aare.daq.server.daq") as m_daq, \ patch("aare.daq.server.bl") as m_bl, \ patch("aare.daq.server.cfg") as m_cfg: server.daq = m_daq server.bl = m_bl server.cfg = m_cfg m_daq.busy = False m_cfg.pgroup = "p12345" m_cfg.session_state.return_value = "ACTIVE" yield { "daq": m_daq, "bl": m_bl, "cfg": m_cfg, } @pytest.fixture def client(mock_backend): import aare.daq.server as server with patch("aare.daq.auth.parse_token") as mock_parse: from aare.daq.auth import TokenData mock_parse.return_value = TokenData( sub="testuser", staff=True, pgroups=["p12345"], session=123, ) with patch("cv2.imencode") as mock_imencode: mock_imencode.return_value = (True, np.array([1, 2, 3], dtype=np.uint8)) with TestClient(server.app) as c: yield c