"""Smoke tests for the vision service in STUB mode (no model weights needed).""" from __future__ import annotations from fastapi.testclient import TestClient from vision_service.app import app def make_client() -> TestClient: # TestClient runs the lifespan, building the (stub) recognizer. return TestClient(app) def test_health_ok_in_stub_mode() -> None: with make_client() as client: res = client.get("/health") assert res.status_code == 200 body = res.json() assert body["status"] == "ok" assert body["ready"] is True assert body["recognizer"] == "stub" assert body["model_version"] == "stub-0" def test_analyze_returns_contract_shape() -> None: with make_client() as client: # The stub recognizes nothing, but the response must match the contract. res = client.post( "/analyze", content=b"\xff\xd8\xff\xe0not-a-real-jpeg", headers={"content-type": "application/octet-stream"}, ) assert res.status_code == 200 body = res.json() assert body["plate"] is None assert body["plates"] == [] assert body["vehicle"] is None assert body["low_confidence"] is False assert body["model_version"] == "stub-0" assert "took_ms" in body def test_analyze_rejects_empty_body() -> None: with make_client() as client: res = client.post( "/analyze", content=b"", headers={"content-type": "application/octet-stream"}, ) assert res.status_code == 400