Files
ai-contract-platform/backend/tests/test_quality_evals_api.py
T

113 lines
4.1 KiB
Python

import unittest
from fastapi import HTTPException
from fastapi.testclient import TestClient
from app.api.quality_evals import get_quality_eval_service, require_current_user
from app.main import app
class StubQualityEvalService:
def __init__(self):
self.runs = [
{
"id": "qualityeval-123",
"tenant_id": "tenant-demo-001",
"source_kind": "prompt_asset_evaluation_run",
"source_run_id": "prompteval-123",
"eval_domain": "prompt",
"subject_type": "prompt_asset",
"subject_id": "prompt-123",
"subject_key": "contract_generation_default",
"subject_name": "Contract generation default",
"suite_key": "phase13_generation",
"status": "passed",
"sample_count": 2,
"passed_samples": 2,
"failed_samples": 0,
"pass_rate": 1.0,
"quality_score": 0.97,
"report": {"passed": True, "sample_count": 2},
"failure_reason": None,
"triggered_by": "user-admin",
"started_at": "2026-05-23T00:00:00+00:00",
"finished_at": "2026-05-23T00:00:01+00:00",
"created_at": "2026-05-23T00:00:00+00:00",
}
]
def _require_admin(self, current_user):
if current_user["role"] != "admin":
raise HTTPException(status_code=403, detail="forbidden")
def list_quality_eval_runs(self, current_user, page, page_size, *, source_kind=None, eval_domain=None, subject_type=None, status_filter=None):
self._require_admin(current_user)
return {
"items": self.runs,
"page": page,
"page_size": page_size,
"total": len(self.runs),
}
def get_quality_eval_run_detail(self, current_user, run_id):
self._require_admin(current_user)
return {
"run": self.runs[0],
"items": [
{
"id": "qualityitem-123",
"tenant_id": "tenant-demo-001",
"quality_eval_run_id": run_id,
"item_key": "GEN-001",
"item_name": "GEN-001",
"status": "passed",
"score": 0.98,
"expected": {"sample_id": "GEN-001"},
"actual": {"status": "passed"},
"evidence": {"sample_id": "GEN-001"},
"failure_reason": None,
"created_at": "2026-05-23T00:00:00+00:00",
}
],
}
class QualityEvalsApiTestCase(unittest.TestCase):
def setUp(self):
app.dependency_overrides[get_quality_eval_service] = lambda: StubQualityEvalService()
self.client = TestClient(app)
def tearDown(self):
app.dependency_overrides.clear()
def test_admin_can_list_and_view_quality_evals(self):
app.dependency_overrides[require_current_user] = lambda: {
"id": "user-admin",
"tenant_id": "tenant-demo-001",
"role": "admin",
}
list_response = self.client.get("/api/v1/quality-evals/runs")
detail_response = self.client.get("/api/v1/quality-evals/runs/qualityeval-123")
self.assertEqual(list_response.status_code, 200)
self.assertEqual(list_response.json()["data"]["items"][0]["source_run_id"], "prompteval-123")
self.assertEqual(detail_response.status_code, 200)
self.assertEqual(detail_response.json()["data"]["items"][0]["item_key"], "GEN-001")
def test_member_cannot_access_quality_evals(self):
app.dependency_overrides[require_current_user] = lambda: {
"id": "user-member",
"tenant_id": "tenant-demo-001",
"role": "member",
}
response = self.client.get("/api/v1/quality-evals/runs")
self.assertEqual(response.status_code, 403)
self.assertEqual(response.json()["message"], "forbidden")
if __name__ == "__main__":
unittest.main()