dotb_ai-platform/tests/test_seed_demo_persistence.py
hungtran24 2268b6a77a feat: replace tenant auth with app-scoped scoring access
Add app credentials, account-scoped idempotency and per-app terminal notifications. Consolidate the unreleased migration baseline, preserve rule descriptions as AI context, and regenerate provider contracts with regression coverage.
2026-10-02 10:56:58 +07:00

49 lines
1.9 KiB
Python

import asyncio
import json
from pathlib import Path
import httpx
from fastapi.testclient import TestClient
from sqlalchemy import select
from ai_platform.infrastructure.persistence.models import ScoringRun
from ai_platform.presentation.http.schemas import RunRequest
FIXTURE = Path(__file__).parent / "fixtures" / "mock_omni_run.json"
def test_api_seed_persists_and_reads_back_conversation_snapshot(
aihub_test_environment, wait_for_terminal
):
payload = json.loads(FIXTURE.read_text())
expected = RunRequest.model_validate(payload).model_dump(mode="json")
app = aihub_test_environment["app_for"](lambda _request: httpx.Response(500))
headers = {
"Authorization": f"Bearer {aihub_test_environment['app_key']}",
"Idempotency-Key": payload["request_id"],
}
with TestClient(app) as client:
admitted = client.post("/v1/lead-scoring/runs", headers=headers, json=payload)
assert admitted.status_code == 202
run_id = admitted.json()["run_id"]
completed = wait_for_terminal(client, run_id, headers)
assert completed["status"] == "completed"
assert completed["ai_score"] is None and completed["degraded"] is False
assert completed["rule_score"] == completed["final_score"] == 80
assert completed["snapshot"] == expected["snapshot"]
assert client.get(f"/v1/lead-scoring/runs/{run_id}", headers=headers).json() == completed
async def verify():
factory = aihub_test_environment["factory"]
async with factory() as db:
row = await db.scalar(
select(ScoringRun).where(
ScoringRun.id == run_id, ScoringRun.app_id == aihub_test_environment["app_id"]
)
)
assert row is not None and row.account_id == payload["account_id"]
assert row.request["snapshot"] == expected["snapshot"]
await factory.kw["bind"].dispose()
asyncio.run(verify())