from types import SimpleNamespace from unittest.mock import patch def test_status_renews_gui_session_with_gui_timeout(client, mock_backend, daq_status_factory): mock_cfg = mock_backend["cfg"] mock_daq = mock_backend["daq"] from aarecommon.models.models import SessionsStateEnum mock_daq.status = daq_status_factory(current_pgroup="p12345", staff=True) mock_daq.status.sample = None mock_daq.status.box = None mock_daq.status.last_best_res = None mock_daq.status.last_best_b_factor = None mock_daq.status.crystal_size = SimpleNamespace(x=0, y=0, z=0) mock_daq.status.open_guis = [] mock_cfg.pgroup = "p12345" mock_cfg.session_state.return_value = SessionsStateEnum.OwnedByYou mock_cfg.get_open_gui_sessions.return_value = [] mock_cfg.GUI_SESSION_EXPIRE_SECONDS = 10 response = client.get("/status", headers={"Authorization": "Bearer fake-token"}) assert response.status_code == 200 mock_cfg.touch_gui_session.assert_called_once_with( session=123, username="testuser", staff=True, expiry_sec=10 ) def test_status_hides_open_guis_for_non_staff(client, mock_backend, daq_status_factory): with patch("aare.daq.auth.parse_token") as mock_parse: from aarecommon.models.models import OpenGuiSessionInfo, SessionsStateEnum from aare.daq.auth import TokenData mock_parse.return_value = TokenData( sub="user1", staff=False, pgroups=["p12345"], session=123 ) mock_backend["daq"].status = daq_status_factory(current_pgroup="p12345", staff=False) mock_backend["daq"].status.sample = None mock_backend["daq"].status.box = None mock_backend["daq"].status.last_best_res = None mock_backend["daq"].status.last_best_b_factor = None mock_backend["daq"].status.crystal_size = SimpleNamespace(x=0, y=0, z=0) mock_backend["cfg"].pgroup = "p12345" mock_backend["cfg"].session_state.return_value = SessionsStateEnum.OwnedByElse mock_backend["cfg"].get_open_gui_sessions.return_value = [ OpenGuiSessionInfo(session=1, username="staff1", last_seen_ts=1.0, staff=True) ] mock_backend["cfg"].get_gui_session.return_value = OpenGuiSessionInfo( session=123, username="user1", last_seen_ts=2.0, staff=False ) response = client.get("/status", headers={"Authorization": "Bearer fake-token"}) assert response.status_code == 200 payload = response.json()["open_guis"] assert len(payload) == 1 assert payload[0]["session"] == 123 assert payload[0]["username"] == "user1" def test_admin_gui_sessions_includes_baton_holder_flag(client, mock_backend): from types import SimpleNamespace from aarecommon.models.models import OpenGuiSessionInfo mock_cfg = mock_backend["cfg"] mock_cfg.get_open_gui_sessions.return_value = [ OpenGuiSessionInfo(session=11, username="user1", last_seen_ts=1.0, staff=False), OpenGuiSessionInfo(session=22, username="holder", last_seen_ts=2.0, staff=True), ] mock_cfg.baton_holder = SimpleNamespace(session=22) response = client.get("/admin/gui_sessions", headers={"Authorization": "Bearer fake-token"}) assert response.status_code == 200 payload = response.json() assert payload[0]["session"] == 11 assert payload[1]["session"] == 22