openenergysphere-federated-.../tests/test_governance_sync_api.py

55 lines
2.0 KiB
Python

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"