This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / knot2 / crates / knot-index / tests / meta_repo.rs
3.0 kB 98 lines
1use knot_cob::{CobHome, CobStore}; 2use knot_cobs::{CollaboratorsChange, MembersChange, Registration, RegistryChange}; 3use knot_git::Layout; 4use knot_index::{Index, Resolved}; 5use knot_runtime::{K256Signer, SeededEntropy}; 6use knot_types::{KnotId, RepoDid, RepoName}; 7 8mod common; 9use common::{acc, at, grant, own, rkey}; 10 11#[test] 12fn the_meta_repo_round_trips_every_projection_from_git() { 13 let dir = tempfile::tempdir().unwrap(); 14 let layout = Layout::new(dir.path()); 15 let knot = KnotId::new("did:web:oyster.cafe").unwrap(); 16 let signer = K256Signer::generate(&SeededEntropy::new(1)); 17 18 let meta = layout.bootstrap_meta(&knot).unwrap(); 19 let store = CobStore::new(&meta); 20 let members = store 21 .create( 22 &CobHome::from(&knot), 23 &MembersChange::Add(grant("nel", "nel", 1)), 24 &signer, 25 at(1), 26 ) 27 .unwrap(); 28 store 29 .update( 30 &CobHome::from(&knot), 31 members.object, 32 &MembersChange::Add(grant("olaren", "nel", 2)), 33 &signer, 34 at(2), 35 ) 36 .unwrap(); 37 38 let repo = RepoDid::new("did:plc:squid").unwrap(); 39 store 40 .create( 41 &CobHome::from(&knot), 42 &RegistryChange::Register(Registration { 43 owner: own("nel"), 44 rkey: rkey("anemone"), 45 name: RepoName::new("anemone").unwrap(), 46 repo: repo.clone(), 47 created_at: at(1), 48 }), 49 &signer, 50 at(1), 51 ) 52 .unwrap(); 53 54 let git = layout.create(&repo).unwrap(); 55 CobStore::new(&git) 56 .create( 57 &CobHome::from(&repo), 58 &CollaboratorsChange::Add(grant("lyna", "nel", 1)), 59 &signer, 60 at(1), 61 ) 62 .unwrap(); 63 64 let meta_path = layout.meta_path(&knot).unwrap(); 65 let boot = || { 66 let index = Index::new(meta_path.clone(), layout.clone()); 67 index.rebuild().unwrap(); 68 index.warm_collaborators(); 69 index 70 }; 71 72 let first = boot(); 73 assert_eq!(first.is_member(&acc("nel")), Resolved::Ready(true)); 74 assert_eq!(first.is_member(&acc("olaren")), Resolved::Ready(true)); 75 assert_eq!( 76 first.resolve_repo(&own("nel"), &rkey("anemone")), 77 Resolved::Ready(Some(repo.clone())) 78 ); 79 assert_eq!( 80 first.is_collaborator(&repo, &acc("lyna")), 81 Resolved::Ready(true) 82 ); 83 84 let second = boot(); 85 ["nel", "olaren", "lyna", "stranger"] 86 .into_iter() 87 .for_each(|who| { 88 assert_eq!(first.is_member(&acc(who)), second.is_member(&acc(who))); 89 assert_eq!( 90 first.is_collaborator(&repo, &acc(who)), 91 second.is_collaborator(&repo, &acc(who)), 92 ); 93 }); 94 assert_eq!( 95 first.resolve_repo(&own("nel"), &rkey("anemone")), 96 second.resolve_repo(&own("nel"), &rkey("anemone")), 97 ); 98}