from energysphere.governance import GovernanceLedger from energysphere.models import ContractTemplate, PlanDelta from energysphere.registry import GraphContractRegistry from energysphere.server.main import app from energysphere.sync import DeltaSyncEngine from fastapi.testclient import TestClient def test_governance_ledger_is_chained_and_verified(): ledger = GovernanceLedger(signing_secret="secret") ledger.append_event("policy.approved", "alice", {"policy_id": "p-1"}) ledger.append_event("policy.updated", "bob", {"policy_id": "p-1"}) assert ledger.verify_chain() is True assert len(ledger.list_entries()) == 2 def test_delta_sync_deduplicates_by_delta_id(): engine = DeltaSyncEngine(replica_id="site-a") first = engine.issue_delta(PlanDelta(delta_id="d-1", changes={"a": 1}, timestamp=1.0)) second = engine.issue_delta(PlanDelta(delta_id="d-1", changes={"a": 2}, timestamp=2.0)) merged = engine.reconcile([first, second]) assert len(merged) == 1 assert merged[0].plan_delta.changes == {"a": 2} def test_registry_and_api_support_templates_and_ledger(): registry = GraphContractRegistry() template = ContractTemplate( template_id="tmpl-1", name="meter-template", domain="electricity", fields={"site_id": "string", "load": "number"}, ) registry.register_contract_template(template.template_id, template) report = registry.conformance_report("adapter-1", ["missing-contract"]) assert registry.list_contract_templates()[0]["template_id"] == "tmpl-1" assert report.status == "partial" assert "missing:missing-contract" in report.notes client = TestClient(app) response = client.post( "/governance/events", json={"event_type": "policy.approved", "actor": "alice", "payload": {"policy_id": "p-2"}}, ) assert response.status_code == 200 body = response.json() assert body["valid"] is True assert body["entry"]["event_type"] == "policy.approved"