131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
"""Tests for scripts/kb_proposal_normalize.py."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(REPO_ROOT / "scripts"))
|
|
|
|
import kb_proposal_normalize as norm # noqa: E402
|
|
|
|
|
|
def test_freeform_claim_split_is_blocked_until_canonical_ids_exist():
|
|
preview = norm.normalize_proposal(
|
|
{
|
|
"id": "p-freeform",
|
|
"proposal_type": "attach_evidence",
|
|
"status": "approved",
|
|
"payload": {
|
|
"old_claim": {"id": "d0000000-0000-0000-0000-000000000005"},
|
|
"claim_candidates": [
|
|
{
|
|
"claim_key": "new_claim_key",
|
|
"headline": "New claim headline",
|
|
"edges": [
|
|
{
|
|
"edge_type": "supersedes_component_of",
|
|
"target_claim_id": "d0000000-0000-0000-0000-000000000005",
|
|
}
|
|
],
|
|
"evidence": [{"source_key": "human_review"}],
|
|
}
|
|
],
|
|
"source_candidates": [{"source_key": "human_review"}],
|
|
},
|
|
}
|
|
)
|
|
|
|
assert preview["normalization_state"] == "blocked_missing_canonical_ids"
|
|
assert preview["strict_child_count"] == 0
|
|
assert preview["blocked_count"] == 2
|
|
assert preview["blocked_fragments"][0]["missing"] == ["canonical from_claim"]
|
|
assert preview["blocked_fragments"][1]["missing"] == ["canonical claim_id", "canonical source_id"]
|
|
assert "Create or identify canonical claim/source rows" in preview["next_normalization_action"]
|
|
|
|
|
|
def test_exact_edge_fragment_emits_strict_add_edge_child():
|
|
preview = norm.normalize_proposal(
|
|
{
|
|
"id": "p-edge",
|
|
"proposal_type": "attach_evidence",
|
|
"status": "approved",
|
|
"payload": {
|
|
"proposed_supersession_edges": [
|
|
{
|
|
"from_claim": "11111111-1111-1111-1111-111111111111",
|
|
"to_claim_id": "22222222-2222-2222-2222-222222222222",
|
|
"edge_type": "supports",
|
|
"weight": 0.7,
|
|
}
|
|
]
|
|
},
|
|
}
|
|
)
|
|
|
|
assert preview["normalization_state"] == "strict_children_ready"
|
|
assert preview["blocked_count"] == 0
|
|
assert preview["strict_child_count"] == 1
|
|
child = preview["strict_child_proposals"][0]
|
|
assert child["proposal_type"] == "add_edge"
|
|
assert child["payload"]["apply_payload"] == {
|
|
"from_claim": "11111111-1111-1111-1111-111111111111",
|
|
"to_claim": "22222222-2222-2222-2222-222222222222",
|
|
"edge_type": "supports",
|
|
"weight": 0.7,
|
|
}
|
|
|
|
|
|
def test_exact_evidence_fragments_emit_one_attach_evidence_child():
|
|
preview = norm.normalize_proposal(
|
|
{
|
|
"id": "p-evidence",
|
|
"proposal_type": "attach_evidence",
|
|
"status": "approved",
|
|
"payload": {
|
|
"evidence": [
|
|
{
|
|
"claim_id": "33333333-3333-3333-3333-333333333333",
|
|
"source_id": "44444444-4444-4444-4444-444444444444",
|
|
"role": "grounds",
|
|
"weight": 0.9,
|
|
}
|
|
]
|
|
},
|
|
}
|
|
)
|
|
|
|
assert preview["normalization_state"] == "strict_children_ready"
|
|
assert preview["strict_child_count"] == 1
|
|
child = preview["strict_child_proposals"][0]
|
|
assert child["proposal_type"] == "attach_evidence"
|
|
assert child["payload"]["apply_payload"]["evidence"] == [
|
|
{
|
|
"claim_id": "33333333-3333-3333-3333-333333333333",
|
|
"source_id": "44444444-4444-4444-4444-444444444444",
|
|
"role": "grounds",
|
|
"weight": 0.9,
|
|
}
|
|
]
|
|
|
|
|
|
def test_existing_apply_payload_is_already_strict():
|
|
preview = norm.normalize_proposal(
|
|
{
|
|
"id": "p-strict",
|
|
"proposal_type": "add_edge",
|
|
"status": "approved",
|
|
"payload": {
|
|
"apply_payload": {
|
|
"from_claim": "11111111-1111-1111-1111-111111111111",
|
|
"to_claim": "22222222-2222-2222-2222-222222222222",
|
|
"edge_type": "supports",
|
|
}
|
|
},
|
|
}
|
|
)
|
|
|
|
assert preview["normalization_state"] == "already_strict_apply_payload"
|
|
assert preview["strict_child_count"] == 0
|
|
assert preview["blocked_count"] == 0
|