Files
full-stack-fastapi/backend/tests/mqtt/test_parser_worker.py

54 lines
1.7 KiB
Python

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