"""Reject structurally plausible planning results that lose case traceability.""" import copy import pytest from scripts.ops.test_planning.contracts import validate_families, validate_profile, DIMENSIONS def source(case_id): return {"campaign_id": "FA01", "suite_id": "S1", "case_id": case_id, "fields": {"description": "Read mode through RPC."}} @pytest.fixture def families(): return {"campaign_id": "FA01", "suite_id": "S1", "families": [ {"member_case_ids": ["C1", "C2"], "objectives": [{"case_id": "C1"}, {"case_id": "C2"}], "source_evidence": [{"case_id": "C1", "field": "description", "quote": "through RPC"}]}]} def test_exact_partition_is_accepted(families): assert validate_families(families, [source("C1"), source("C2")])["case_count"] == 2 @pytest.mark.parametrize("fault", ["omitted", "invented", "duplicate", "owner", "objective", "evidence"]) def test_invalid_case_assignments_cannot_pass(families, fault): family = families["families"][0] if fault == "omitted": family["member_case_ids"].pop() elif fault == "invented": family["member_case_ids"].append("C3") elif fault == "duplicate": families["families"].append(copy.deepcopy(family)) elif fault == "owner": families["suite_id"] = "S2" elif fault == "objective": family["objectives"][1]["case_id"] = "C1" else: family["source_evidence"][0]["quote"] = "invented machinery" with pytest.raises(ValueError): validate_families(families, [source("C1"), source("C2")]) def test_profile_evidence_must_come_from_a_real_field(): profile = {"campaign_id": "FA01", "suite_id": "S1", "case_id": "C1", "facts": {key: None for key in DIMENSIONS}, "inferred_suggestions": []} profile["facts"]["target_interface"] = [{"value": "RPC", "evidence": [ {"field": "description", "quote": "RPC"}]}] validate_profile(profile, source("C1")) profile["facts"]["target_interface"][0]["evidence"][0]["field"] = "unprovided_document" with pytest.raises(ValueError): validate_profile(profile, source("C1"))