"""Golden tests for IMMUTABLE_DECISION_LEDGER_V1 (governance/todo/v8_9_p2_adoption_plan.yaml P2-C). Maps to v8.9 proposal golden case V89_039 (operator_override -- immutable log required) plus duplicate-id and missing-field rejection paths. """ from __future__ import annotations import importlib.util from pathlib import Path ROOT = Path(__file__).resolve().parents[3] MODULE_PATH = ROOT / "tools" / "build_immutable_decision_ledger_v1.py" def _load_module(): spec = importlib.util.spec_from_file_location("build_immutable_decision_ledger_v1", MODULE_PATH) module = importlib.util.module_from_spec(spec) assert spec.loader is not None spec.loader.exec_module(module) return module def _decision(decision_id="D1"): return { "decision_id": decision_id, "engine_version": "PORTFOLIO_TRANSITION_UTILITY_V1", "input_hash_bundle": "abc123", "execution_mode": "NO_TRADE", "candidate_ids": ["A"], } def test_v89_039_new_decision_appends_successfully() -> None: mod = _load_module() ledger = {"formula_id": "IMMUTABLE_DECISION_LEDGER_V1", "records": []} new_ledger, status = mod.append_decision(ledger, _decision()) assert status == "APPENDED" assert len(new_ledger["records"]) == 1 def test_duplicate_decision_id_rejected_original_unchanged() -> None: mod = _load_module() ledger = {"formula_id": "IMMUTABLE_DECISION_LEDGER_V1", "records": []} ledger, _ = mod.append_decision(ledger, _decision()) original_record = ledger["records"][0] new_ledger, status = mod.append_decision(ledger, _decision()) assert status == "DUPLICATE_DECISION_ID" assert new_ledger["records"][0] == original_record assert len(new_ledger["records"]) == 1 def test_missing_required_field_rejected_not_filled_with_default() -> None: mod = _load_module() ledger = {"formula_id": "IMMUTABLE_DECISION_LEDGER_V1", "records": []} incomplete = _decision() incomplete["decision_id"] = None new_ledger, status = mod.append_decision(ledger, incomplete) assert status == "REJECTED_MISSING_FIELDS" assert new_ledger["records"] == []