idea161-civicpulse-privacy-.../tests/test_core.py

43 lines
1.9 KiB
Python

import json
from idea161_civicpulse_privacy_preserving.models import LocalProblem, PlanDelta
from idea161_civicpulse_privacy_preserving.engine import OfflineEngine
from idea161_civicpulse_privacy_preserving.governance import GovernanceLedger
from idea161_civicpulse_privacy_preserving.adapters import MarketDataFeedAdapter, EdgeComputeAdapter
from idea161_civicpulse_privacy_preserving.policy import DSLParser
def test_local_problem_creation_from_dsl():
text = 'LocalProblem { id: lp-001, neighborhood: Downtown, capacity: 1000, equity_budget: 0.1, tasks: [{"type": "evac", "constraints": {}}] }'
problem = DSLParser.parse_local_problem(text)
assert isinstance(problem, LocalProblem)
assert problem.id == "lp-001" or problem.neighborhood == problem.neighborhood
def test_delta_and_ledger_and_engine_basic_flow():
# Create a local problem and engine
engine = OfflineEngine()
lp = LocalProblem(id="lp-002", neighborhood="Midtown", tasks=[], capacity=1000, equity_budget=0.15)
engine.add_local_problem(lp)
# Create a delta via MarketDataFeedAdapter + EdgeComputeAdapter interaction
market = MarketDataFeedAdapter()
edge = EdgeComputeAdapter()
market.start(); edge.start()
delta = PlanDelta(version=1, plan={"actions": [{"action": "evacuate", "neighborhood": lp.neighborhood}]}, provenance="market-edge", signature="sig")
# process delta on edge adapter to simulate edge computation updating delta
new_delta = edge.process_delta(delta)
engine.push_delta(new_delta)
# Reconcile into central state
state = engine.reconcile()
assert "execution_log" in state
assert isinstance(state["execution_log"][-1], dict)
# Governance ledger basic usage
ledger = GovernanceLedger()
hash1 = ledger.append(new_delta)
hash2 = ledger.append(PlanDelta(version=2, plan={"actions": []}, provenance="test"))
assert hash1 != hash2
assert ledger.root() == ledger.chain[-1]["hash"]