from __future__ import annotations from typing import AsyncGenerator from fastapi import File, Request, UploadFile from fastapi.testclient import TestClient from src.core import security from src.main import create_app from src.repository import DeviceCredentials from src.api.v1.endpoints import predict as predict_endpoint async def _fake_validated_device( request: Request, image: UploadFile = File(..., alias="image"), ) -> AsyncGenerator[DeviceCredentials, None]: request.state.image = image yield DeviceCredentials( device_id="DEV-TEST-0001", api_key="sk_test_key", secret="secret", is_active=True, ) async def _fake_inference(_image_bytes: bytes) -> dict: return { "predicted_class": "Pure Milk", "confidence": 0.9231, "model_version": "v3.0.0", "latency_ms": 12, "status": "success", } def test_core_routes_and_predict_response_shape(monkeypatch) -> None: app = create_app() app.dependency_overrides[security.get_validated_device] = _fake_validated_device monkeypatch.setattr(predict_endpoint, "run_inference", _fake_inference) with TestClient(app) as client: root = client.get("/") assert root.status_code == 200 assert root.json()["service"] == "imageO_v3" live = client.get("/healthz") assert live.status_code == 200 assert live.json() == {"status": "ok"} response = client.post( "/v1/predict", files={"image": ("sample.png", b"mock-bytes", "image/png")}, headers={"X-API-Key": "sk_test_key"}, ) assert response.status_code == 200 payload = response.json() assert set(payload.keys()) == { "predicted_class", "confidence", "model_version", "latency_ms", "status", }