lct-hack/backend/tests/test_station_ticker.py

44 lines
1.8 KiB
Python
Raw Normal View History

"""Такт таймеров доходит до АРМ ДДС: пульт строит срок решения по снимку сервера."""
import asyncio
from pathlib import Path
from uuid import uuid4
from app.domain.events import Exercise, SessionMode, TimerTick
from app.domain.timers import TimerCode
from app.scenarios.loader import load_file
from app.session import hub as hub_module
from app.session.hub import SessionHub
from app.session.state import SessionState
LIBRARY = Path(__file__).resolve().parents[2] / "scenarios"
async def test_station_receives_dds_ack_with_configured_limit_after_handoff(monkeypatch):
"""Передача из 112 без очереди ДДС: `queue_cards` пуст, и лимит решения,
настроенный преподавателем, пульт видит только в `timer.tick`."""
monkeypatch.setattr(hub_module, "TICK_SECONDS", 0.01)
scenario = load_file(LIBRARY / "fire-apartment-l2.yaml", LIBRARY)
state = SessionState(
session_id=uuid4(), scenario_id=scenario.id, scenario_title=scenario.title,
level=scenario.level.value, mode=SessionMode.TRAINING,
exercise=Exercise.CARD, handoff_to_dds=True, scenario=scenario,
)
state.timers.limits[TimerCode.DDS_ACK] = 45_000
state.on_event("dds.dispatch")
state.dispatch()
local_hub = SessionHub()
local_hub.register(state)
with local_hub.station(state.session_id) as station:
local_hub.start_ticker(state.session_id)
try:
async with asyncio.timeout(1):
while not isinstance(event := await station.get(), TimerTick):
pass
finally:
local_hub.stop_ticker(state.session_id)
ack = next(timer for timer in event.timers if timer.code is TimerCode.DDS_ACK)
assert ack.limit_ms == 45_000
assert not ack.stopped