from sqlmodel import Session, SQLModel, create_engine, select from app.models import TerminalDeviceState, TerminalMessageRaw, TerminalObservationEvent from app.mqtt.parser_worker import process_pending_batch from app.mqtt.repository import insert_raw_message def _session() -> Session: engine = create_engine("sqlite://") SQLModel.metadata.create_all(engine) return Session(engine) def test_insert_raw_message_sets_pending_status() -> None: with _session() as session: row = insert_raw_message( session=session, device_id="device-001", topic="terminal/device-001/raw", payload=b"$GPRMC,123520,A,3723.2475,N,12158.3416,W,0.13,309.62,120598,,,A*74\r\n", qos=1, retain=False, ) assert row.parse_status == "pending" assert row.payload_size > 0 assert len(row.payload_sha256) == 64 def test_worker_marks_success_and_writes_events() -> None: with _session() as session: raw = insert_raw_message( session=session, device_id="device-001", topic="terminal/device-001/raw", payload=b"$GPGGA,123519,3723.2475,N,12158.3416,W,1,12,0.8,10.0,M,-25.0,M,,*65\r\n", qos=1, retain=False, ) processed = process_pending_batch(session=session, batch_size=10) assert processed == 1 refreshed = session.get(TerminalMessageRaw, raw.id) assert refreshed is not None assert refreshed.parse_status == "succeeded" events = session.exec(select(TerminalObservationEvent)).all() assert len(events) >= 1 state = session.get(TerminalDeviceState, "device-001") assert state is not None