import unittest from marketmesh_privacy_preserving_federated_.core import Contract, DeltaSync, Aggregator from marketmesh_privacy_preserving_federated_.adapters.stripe import StripeAdapter from marketmesh_privacy_preserving_federated_.adapters.shopify import ShopifyAdapter class TestAggregationPipeline(unittest.TestCase): def test_protocol_and_aggregation_basic(self): # Define a minimal contract with a few KPIs contract = Contract(contract_id="c1", version=1, kpis=["revenue", "activation_rate", "visits"]) self.assertIsNotNone(contract) # Prepare two participant contributions via adapters mapping to canonical KPIs stripe = StripeAdapter("stripe-c1") shopify = ShopifyAdapter("shopify-c1") p1_raw = {"amount": 1200.0, "subscriber_count": 40, "visits": 3000, "activation_rate": 0.55, "signups": 250} p2_raw = {"amount": 800.0, "subscriber_count": 25, "visits": 1800, "activation_rate": 0.6, "signups": 180} p1 = stripe.map_to_canonical(p1_raw) p2 = shopify.map_to_canonical(p2_raw) # The aggregated KPI set should include the union of keys contributions = [p1, p2] aggregator = Aggregator(epsilon_per_kpi={"revenue": 1.0, "activation_rate": 0.5, "visits": 0.5}) aggregated = aggregator.aggregate(contributions) # Basic sanity: keys exist and values are numeric for k in ["revenue", "activation_rate", "visits"]: self.assertIn(k, aggregated) self.assertIsInstance(aggregated[k], float) def test_delta_sync_and_hash(self): # Simple delta sync payload creation and representation test payload = {"revenue": 1500.0, "customers": 60} ds = DeltaSync(contract_id="c1", version_vector={"v1": 1}, payload=payload, hash_="abcd1234") self.assertEqual(ds.contract_id, "c1") self.assertEqual(ds.payload, payload) self.assertEqual(ds.hash, "abcd1234") if __name__ == "__main__": unittest.main()