import json from idea44_soundgraph_studio_verifiable.core import AudioModule, AudioPatch, generate_ed25519_keypair, ProvenanceEvent def test_audio_module_cid_is_stable(): m = AudioModule.make("oscillator", {"freq": 440, "wave": "sine"}, version="0.1") cid1 = m.cid() # recompute from dict to ensure canonicalization is stable cid2 = AudioModule(id=m.id, type=m.type, params=m.params, version=m.version, license=m.license).cid() assert cid1 == cid2 def test_patch_merkle_and_inclusion_proof(): m1 = AudioModule.make("oscillator", {"freq": 220}) m2 = AudioModule.make("filter", {"type": "lowpass", "cutoff": 1000}) node1 = {"id": "n1", "module_cid": m1.cid(), "params": {}} node2 = {"id": "n2", "module_cid": m2.cid(), "params": {}} patch = AudioPatch(nodes=[node1, node2], edges=[("n1","n2")]) root = patch.merkle_root() assert isinstance(root, str) and len(root) == 64 proof, leaf = patch.inclusion_proof_for_module_cid(m1.cid()) # verify proof using the exported verification helper from idea44_soundgraph_studio_verifiable.core import verify_merkle_proof assert verify_merkle_proof(leaf, proof, root) def test_provenance_event_sign_and_verify(): sk, pk = generate_ed25519_keypair() ev = ProvenanceEvent(patch_id="patch-1", actor="alice", timestamp=123456.0, op_hash="deadbeef") ev.sign(sk) assert ev.verify(pk)