79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from idea156_kappabridge_privacy_safe import (
|
|
AccessPolicyContract,
|
|
AdapterMarketplace,
|
|
AttestationAuthority,
|
|
ClimateCSVAdapter,
|
|
ContractRegistry,
|
|
DeltaSyncEngine,
|
|
FederationStore,
|
|
FederatedPlanner,
|
|
GenomicsFASTAAdapter,
|
|
LabProfile,
|
|
)
|
|
from idea156_kappabridge_privacy_safe.harness import ConformanceHarness
|
|
|
|
|
|
def test_registry_ledger_and_attestation(tmp_path: Path) -> None:
|
|
store = FederationStore(tmp_path / "kappa.db")
|
|
registry = ContractRegistry(store)
|
|
|
|
policy = AccessPolicyContract(name="open-policy", allowed_actions=["read", "request"], privacy_budget_epsilon=1.0)
|
|
registry.register(policy)
|
|
|
|
authority = AttestationAuthority("lab-a")
|
|
attestation = authority.attest(policy, purpose="governance")
|
|
assert authority.verify(attestation, policy)
|
|
|
|
assert registry.active_contracts(kind="AccessPolicy")[0]["name"] == "open-policy"
|
|
assert store.latest_seq() == 1
|
|
|
|
|
|
def test_delta_sync_replays_ledger(tmp_path: Path) -> None:
|
|
left = FederationStore(tmp_path / "left.db")
|
|
right = FederationStore(tmp_path / "right.db")
|
|
left_registry = ContractRegistry(left)
|
|
right_registry = ContractRegistry(right)
|
|
|
|
policy = AccessPolicyContract(name="sync-policy", allowed_actions=["read"])
|
|
left_registry.register(policy)
|
|
|
|
engine = DeltaSyncEngine(left, peer_id="lab-left")
|
|
envelope = engine.build_envelope(anchor_seq=0)
|
|
assert right_registry.store.latest_seq() == 0
|
|
applied = DeltaSyncEngine(right, peer_id="lab-right").ingest_envelope(envelope)
|
|
assert applied == 1
|
|
assert right_registry.store.latest_seq() == 1
|
|
assert right_registry.get(policy.contract_id)["name"] == "sync-policy"
|
|
|
|
|
|
def test_adapters_and_planner_conformance(tmp_path: Path) -> None:
|
|
climate_csv = tmp_path / "climate.csv"
|
|
climate_csv.write_text("station,temp,humidity\nA,12,40\nB,15,55\n", encoding="utf-8")
|
|
|
|
fasta = tmp_path / "genome.fasta"
|
|
fasta.write_text(
|
|
">seq1\nACGT\n>seq2\nGGTT\n",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
marketplace = AdapterMarketplace()
|
|
marketplace.register(ClimateCSVAdapter())
|
|
marketplace.register(GenomicsFASTAAdapter())
|
|
|
|
harness = ConformanceHarness(marketplace)
|
|
assert harness.validate("climate-csv", climate_csv, dataset_name="climate", discipline="climate").passed
|
|
assert harness.validate("genomics-fasta", fasta, dataset_name="genome", discipline="genomics").passed
|
|
|
|
planner = FederatedPlanner()
|
|
plan = planner.plan_joint_objective(
|
|
"joint climate-genomics study",
|
|
[LabProfile("lab-a", "climate", ["tabular"]), LabProfile("lab-b", "genomics", ["sequence"])],
|
|
["contract-a", "contract-b"],
|
|
)
|
|
assert plan.kind == "PlanDelta"
|
|
assert plan.steps
|