test_evaluation.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from __future__ import annotations
  2. def test_evaluation_gate_accepts_grounded_authorized_fresh_results():
  3. from app.core.knowledge.evaluation import (
  4. EvaluationCase,
  5. EvaluationObservation,
  6. evaluate,
  7. )
  8. case = EvaluationCase(
  9. case_id="exact-1",
  10. case_type="exact",
  11. expected_source_uids=frozenset({"source-1"}),
  12. allowed_business_domains=frozenset({"domain-a"}),
  13. )
  14. observation = EvaluationObservation(
  15. retrieved_source_uids=("source-1",),
  16. retrieved_business_domains=("domain-a",),
  17. cited_source_uids=("source-1",),
  18. cited_freshness=("fresh",),
  19. answer_status="grounded",
  20. latency_ms=100,
  21. )
  22. summary = evaluate([(case, observation)])
  23. assert summary.passed is True
  24. assert summary.source_recall == 1.0
  25. assert summary.citation_precision == 1.0
  26. def test_evaluation_gate_fails_closed_on_permission_leak_or_stale_citation():
  27. from app.core.knowledge.evaluation import (
  28. EvaluationCase,
  29. EvaluationObservation,
  30. evaluate,
  31. )
  32. case = EvaluationCase(
  33. case_id="negative-1",
  34. case_type="permission",
  35. expected_source_uids=frozenset(),
  36. allowed_business_domains=frozenset({"domain-a"}),
  37. must_refuse=True,
  38. )
  39. observation = EvaluationObservation(
  40. retrieved_source_uids=("secret-source",),
  41. retrieved_business_domains=("domain-b",),
  42. cited_source_uids=("secret-source",),
  43. cited_freshness=("stale",),
  44. answer_status="grounded",
  45. latency_ms=100,
  46. )
  47. summary = evaluate([(case, observation)])
  48. assert summary.passed is False
  49. assert summary.permission_leak_count == 1
  50. assert summary.stale_citation_count == 1
  51. assert summary.refusal_accuracy == 0.0