55 lines
2.0 KiB
Python
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"
|