test_p7_final_output.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from content_agent.run_service import RunService
  2. from content_agent.schemas import RunStartRequest
  3. from tests.p1_helpers import FakeQueryVariantClient, REAL_SOURCE_FIXTURE
  4. def _start_mock_run(tmp_path):
  5. service = RunService(
  6. runtime_root=tmp_path / "runtime" / "v1",
  7. query_variant_client=FakeQueryVariantClient(),
  8. )
  9. state = service.start_run(
  10. RunStartRequest(platform_mode="mock", source=str(REAL_SOURCE_FIXTURE))
  11. )
  12. assert state["status"] == "success"
  13. return service, state["run_id"]
  14. def test_rejected_content_is_visible_but_not_pooled(tmp_path):
  15. service, run_id = _start_mock_run(tmp_path)
  16. final_output = service.read_json(run_id, "final_output.json")
  17. content_ids = {asset["platform_content_id"] for asset in final_output["content_assets"]}
  18. reject_ids = {record["decision_target_id"] for record in final_output["reject_records"]}
  19. assert final_output["summary"]["rejected_content_count"] == len(final_output["reject_records"])
  20. assert reject_ids
  21. assert not reject_ids & content_ids
  22. assert final_output["validation_status"] == "pass"
  23. assert final_output["summary"]["run_path_complete"] is True
  24. assert final_output["summary"]["trace_complete"] is True
  25. def test_reject_records_carry_source_evidence_refs(tmp_path):
  26. service, run_id = _start_mock_run(tmp_path)
  27. final_output = service.read_json(run_id, "final_output.json")
  28. assert final_output["reject_records"][0]["source_evidence"]["source_post_id"]
  29. assert final_output["reject_records"][0]["source_evidence"]["discovered_platform_content_id"]
  30. assert service.validate_run(run_id)["status"] == "pass"
  31. def test_run_service_rewrites_final_output_with_final_validation_status(tmp_path):
  32. service, run_id = _start_mock_run(tmp_path)
  33. final_output = service.read_json(run_id, "final_output.json")
  34. validation = service.validate_run(run_id)
  35. assert validation["status"] == "pass"
  36. assert final_output["validation_status"] == validation["status"]
  37. assert final_output["summary"]["run_path_complete"] is True
  38. assert final_output["summary"]["trace_complete"] is True
  39. def test_final_output_carries_v4_explanation_records(tmp_path):
  40. service, run_id = _start_mock_run(tmp_path)
  41. final_output = service.read_json(run_id, "final_output.json")
  42. v4_decision_records = [
  43. record
  44. for record in final_output["decision_records"]
  45. if (record.get("scorecard") or {}).get("schema_version") == "v4_scorecard.v1"
  46. ]
  47. assert v4_decision_records
  48. for record in v4_decision_records:
  49. explanation = record["v4_explanation"]
  50. assert explanation["schema_version"] == "v4_decision_explanation.v1"
  51. assert explanation["scorecard_schema_version"] == "v4_scorecard.v1"
  52. assert explanation["query_relevance_score"] == record["scorecard"]["query_relevance_score"]
  53. assert explanation["platform_performance_score"] == record["scorecard"]["platform_performance_score"]
  54. assert explanation["score"] == record["score"]
  55. assert "allow_walk" in explanation
  56. assert "walk_gate_snapshot" in explanation
  57. v4_ids = {record["decision_id"] for record in v4_decision_records}
  58. section_records = (
  59. final_output["content_assets"]
  60. + final_output["review_records"]
  61. + final_output["reject_records"]
  62. )
  63. assert [
  64. record
  65. for record in section_records
  66. if record.get("decision_id") in v4_ids and record.get("v4_explanation")
  67. ]