test_source_evidence.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 test_source_evidence_inherits_evidence_pack_without_rewriting_origin(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. run_id = state["run_id"]
  13. source_context = service.read_json(run_id, "source_context.json")
  14. evidence_pack = source_context["ext_data"]["evidence_pack"]
  15. decisions = service.read_jsonl(run_id, "rule_decisions.jsonl")
  16. source_evidence = decisions[0]["source_evidence"]
  17. assert source_evidence["policy_run_id"] == state["policy_run_id"]
  18. for field in [
  19. "source_kind",
  20. "pattern_source_system",
  21. "case_id_type",
  22. "source_post_id",
  23. "pattern_execution_id",
  24. "mining_config_id",
  25. "itemset_ids",
  26. "itemset_items",
  27. "category_bindings",
  28. "element_bindings",
  29. "support",
  30. "absolute_support",
  31. "matched_post_ids",
  32. "video_ids",
  33. "case_ids",
  34. "decode_case_ids",
  35. "seed_terms",
  36. "run_id",
  37. "source_certainty",
  38. "validation_status",
  39. ]:
  40. assert source_evidence[field] == evidence_pack[field]
  41. assert source_evidence["discovered_platform_content_id"] != source_evidence["source_post_id"]
  42. assert (
  43. source_evidence["discovered_platform_content_id"]
  44. not in source_evidence["matched_post_ids"]
  45. )
  46. assert source_evidence["discovery_relation"] == "mock_pattern_matched"
  47. assert {record["decision_id"] for record in decisions} == {"d_001", "d_002", "d_003"}
  48. def test_source_evidence_tracks_multiple_query_sources_without_polluting_origin(tmp_path):
  49. service = RunService(
  50. runtime_root=tmp_path / "runtime" / "v1",
  51. query_variant_client=FakeQueryVariantClient(),
  52. )
  53. state = service.start_run(
  54. RunStartRequest(platform_mode="mock", source=str(REAL_SOURCE_FIXTURE))
  55. )
  56. run_id = state["run_id"]
  57. items = service.read_jsonl(run_id, "discovered_content_items.jsonl")
  58. multi_source_item = next(
  59. item for item in items if len(item.get("query_sources", [])) > 1
  60. )
  61. decisions = service.read_jsonl(run_id, "rule_decisions.jsonl")
  62. decision = next(
  63. row
  64. for row in decisions
  65. if row["decision_target_id"] == multi_source_item["platform_content_id"]
  66. )
  67. source_evidence = decision["source_evidence"]
  68. assert multi_source_item["matched_search_query_ids"] == ["q_002", "q_003", "q_004", "q_005"]
  69. assert source_evidence["matched_search_query_ids"] == ["q_002", "q_003", "q_004", "q_005"]
  70. assert source_evidence["discovered_platform_content_id"] != source_evidence["source_post_id"]
  71. assert (
  72. source_evidence["discovered_platform_content_id"]
  73. not in source_evidence["matched_post_ids"]
  74. )
  75. paths = service.read_jsonl(run_id, "source_path_records.jsonl")
  76. query_content_paths = [
  77. path
  78. for path in paths
  79. if path["source_path_type"] == "search_query_to_content"
  80. and path["to_node_id"] == multi_source_item["platform_content_id"]
  81. ]
  82. assert {path["from_node_id"] for path in query_content_paths} == {
  83. "q_002",
  84. "q_003",
  85. "q_004",
  86. "q_005",
  87. }