test_rule_decision_effect_status.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import annotations
  2. from copy import deepcopy
  3. from content_agent.business_modules.rule_judgment.evaluator import decide
  4. from tests.test_rule_judgment_scorecard import _bundle, _policy
  5. def test_v4_effect_status_mapping_for_pool_review_reject_technical_and_blocked():
  6. policy = _policy()
  7. success = decide("run_1", "policy_1", 1, _bundle(query=80, platform=70), policy)
  8. assert success["decision_action"] == "ADD_TO_CONTENT_POOL"
  9. assert success["search_query_effect_status"] == "success"
  10. assert success["decision_replay_data"]["effect_mapping_id"] == "map_add_to_pool_success"
  11. pending = decide("run_1", "policy_1", 2, _bundle(query=60, platform=60), policy)
  12. assert pending["decision_action"] == "KEEP_CONTENT_FOR_REVIEW"
  13. assert pending["search_query_effect_status"] == "pending"
  14. assert pending["decision_replay_data"]["effect_mapping_id"] == "map_keep_for_review_pending"
  15. failed = decide("run_1", "policy_1", 3, _bundle(query=54, platform=100), policy)
  16. assert failed["decision_action"] == "REJECT_CONTENT"
  17. assert failed["search_query_effect_status"] == "failed"
  18. assert failed["decision_replay_data"]["effect_mapping_id"] == "map_reject_failed"
  19. technical = decide("run_1", "policy_1", 4, _bundle(query=None, platform=70), policy)
  20. assert technical["decision_action"] == "TECHNICAL_RETRY_REQUIRED"
  21. assert technical["decision_reason_code"] == "v4_technical_retry_needed"
  22. assert technical["search_query_effect_status"] == "failed"
  23. assert technical["decision_replay_data"]["effect_mapping_id"] == "map_technical_retry_failed"
  24. blocked_policy = deepcopy(policy)
  25. blocked_policy["rule_pack"]["hard_gates"] = [
  26. {
  27. "gate_id": "missing_source_evidence",
  28. "when": {"field": "source_evidence", "op": "is_empty"},
  29. "decision_action": "REJECT_CONTENT",
  30. "decision_reason_code": "missing_source_evidence",
  31. "severity": "fatal",
  32. "stop_scoring": True,
  33. "priority": 1,
  34. }
  35. ]
  36. blocked_policy["effect_status_mapping"].append(
  37. {
  38. "mapping_id": "map_reject_rule_blocked",
  39. "target_level": "content",
  40. "decision_action": "REJECT_CONTENT",
  41. "reason_category": "hard_gate",
  42. "is_hard_gate": True,
  43. "content_effect_status": "rule_blocked",
  44. "priority": 30,
  45. "enabled": True,
  46. }
  47. )
  48. blocked_bundle = _bundle(query=80, platform=70)
  49. blocked_bundle["source_evidence"] = {}
  50. blocked = decide("run_1", "policy_1", 5, blocked_bundle, blocked_policy)
  51. assert blocked["decision_reason_code"] == "missing_source_evidence"
  52. assert blocked["search_query_effect_status"] == "rule_blocked"
  53. assert blocked["decision_replay_data"]["effect_mapping_id"] == "map_reject_rule_blocked"