railiance-platform/tests/test_backup_credential_contract_export.py
codex 1900e24f80
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 2s
Accept both backup readers and deliver the email-connect pair.
Record founder acceptance on CCR-2026-0036 and CCR-2026-0037, install the reader roles, and admit only the email-connect node delivery. Treat a missing OpenBao token period as non-periodic.

Assistant: grok
Assistant-Session: 01a11cdb-f9fe-7011-947c-936e72007e54
2026-10-09 00:05:35 +02:00

67 lines
2.5 KiB
Python

"""Public export preserves the canonical YAML approval state and exact policy."""
import hashlib
import importlib.util
import json
import sys
from pathlib import Path
import pytest
import yaml
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "scripts"))
spec = importlib.util.spec_from_file_location(
"exporter", ROOT / "scripts/render_backup_credential_contract.py"
)
e = importlib.util.module_from_spec(spec)
spec.loader.exec_module(e)
@pytest.mark.parametrize("application", e.PROFILES)
def test_owner_yaml_updates_export_without_node_yaml_dependency(application, tmp_path):
source = (
ROOT
/ "credential-change-requests"
/ f"{e.PROFILES[application]['ccr']}-{application}-backup-primary.yaml"
)
ccr = yaml.safe_load(source.read_text())
ccr["status"] = "applied"
ccr["openbao"]["auth"]["bound_claims_confirmed"] = True
ccr["review"]["comments"] = []
ccr["delivery"]["admission"] = {
"node_executor_approved": False,
"provider_scope_verified": False,
"reader_boundary_verified": False,
"source_ref": None,
}
candidate = tmp_path / "reviewed.yaml"
candidate.write_text(yaml.safe_dump(ccr))
raw = e.render(candidate, application)
exported = json.loads(raw)
assert exported["status"] == "applied"
assert exported["source_ccr_sha256"] == hashlib.sha256(candidate.read_bytes()).hexdigest()
assert len(exported["policy_sha256"]) == 64
# Export is a representation, not an approval: missing reviews/admission fail.
with pytest.raises(Exception):
e.contract(raw, application, True, hashlib.sha256(raw).hexdigest())
def test_export_rejects_source_secret_marker(tmp_path):
source = ROOT / "credential-change-requests/CCR-2026-0036-coulomb-social-backup-primary.yaml"
ccr = json.loads(source.read_bytes())
ccr["accidental_value"] = "AGE-SECRET-KEY-1SYNTHETIC"
candidate = tmp_path / "bad.yaml"
candidate.write_text(yaml.safe_dump(ccr))
with pytest.raises(ValueError, match="invalid_reader_contract"):
e.render(candidate, "coulomb-social")
def test_export_cannot_change_reader_namespace(tmp_path):
source = ROOT / "credential-change-requests/CCR-2026-0036-coulomb-social-backup-primary.yaml"
ccr = json.loads(source.read_bytes())
ccr["openbao"]["auth"]["bound_claims"]["service_account_namespaces"] = ["email-connect"]
candidate = tmp_path / "bad.yaml"
candidate.write_text(yaml.safe_dump(ccr))
with pytest.raises(Exception):
e.render(candidate, "coulomb-social")