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 / common / mod.rs
5.4 kB 195 lines
1#![allow(dead_code)] 2 3use std::path::PathBuf; 4 5use knot_cob::{CobHome, CobId, CobStore}; 6use knot_cobs::{CollaboratorsChange, Grant, MembersChange, Registration, RegistryChange, Removal}; 7use knot_git::{Layout, Repo}; 8use knot_index::Index; 9use knot_runtime::{K256Signer, SeededEntropy}; 10use knot_types::{AccountDid, KnotId, OwnerDid, RepoDid, RepoName, RepoRkey, UnixSeconds}; 11use tempfile::TempDir; 12 13pub fn acc(suffix: &str) -> AccountDid { 14 AccountDid::new(format!("did:plc:{suffix}")).unwrap() 15} 16 17pub fn own(suffix: &str) -> OwnerDid { 18 OwnerDid::new(format!("did:plc:{suffix}")).unwrap() 19} 20 21pub fn repo_did(suffix: &str) -> RepoDid { 22 RepoDid::new(format!("did:plc:{suffix}")).unwrap() 23} 24 25pub fn rkey(value: &str) -> RepoRkey { 26 RepoRkey::new(value).unwrap() 27} 28 29pub fn at(seconds: i64) -> UnixSeconds { 30 UnixSeconds::new(seconds) 31} 32 33pub fn meta_home() -> CobHome { 34 CobHome::from(&KnotId::new("did:web:knot.nel.pet").unwrap()) 35} 36 37pub fn grant(subject: &str, added_by: &str, seconds: i64) -> Grant { 38 Grant { 39 subject: acc(subject), 40 added_by: acc(added_by), 41 created_at: at(seconds), 42 } 43} 44 45pub fn registration(owner_id: &str, key: &str, repo: &RepoDid, seconds: i64) -> Registration { 46 Registration { 47 owner: own(owner_id), 48 rkey: rkey(key), 49 name: RepoName::new(key).unwrap(), 50 repo: repo.clone(), 51 created_at: at(seconds), 52 } 53} 54 55pub fn named_registration( 56 owner_id: &str, 57 key: &str, 58 display: &str, 59 repo: &RepoDid, 60 seconds: i64, 61) -> Registration { 62 Registration { 63 owner: own(owner_id), 64 rkey: rkey(key), 65 name: RepoName::new(display).unwrap(), 66 repo: repo.clone(), 67 created_at: at(seconds), 68 } 69} 70 71pub struct World { 72 _dir: TempDir, 73 pub meta_path: PathBuf, 74 pub layout: Layout, 75 pub signer: K256Signer, 76} 77 78impl World { 79 pub fn new() -> Self { 80 Self::seeded(1) 81 } 82 83 pub fn seeded(seed: u64) -> Self { 84 let dir = tempfile::tempdir().unwrap(); 85 let meta_path = dir.path().join("meta"); 86 Repo::create(&meta_path).unwrap(); 87 let layout = Layout::new(dir.path().join("repos")); 88 let signer = K256Signer::generate(&SeededEntropy::new(seed)); 89 Self { 90 _dir: dir, 91 meta_path, 92 layout, 93 signer, 94 } 95 } 96 97 pub fn index(&self) -> Index { 98 Index::new(&self.meta_path, self.layout.clone()) 99 } 100 101 pub fn seed_members(&self) -> CobId { 102 let meta = Repo::open(&self.meta_path).unwrap(); 103 let store = CobStore::new(&meta); 104 let created = store 105 .create( 106 &meta_home(), 107 &MembersChange::Add(grant("nel", "nel", 1)), 108 &self.signer, 109 at(1), 110 ) 111 .unwrap(); 112 store 113 .update( 114 &meta_home(), 115 created.object, 116 &MembersChange::Add(grant("olaren", "nel", 2)), 117 &self.signer, 118 at(2), 119 ) 120 .unwrap(); 121 created.object 122 } 123 124 pub fn add_member(&self, object: CobId, subject: &str, seconds: i64) { 125 let meta = Repo::open(&self.meta_path).unwrap(); 126 let store = CobStore::new(&meta); 127 store 128 .update( 129 &meta_home(), 130 object, 131 &MembersChange::Add(grant(subject, "nel", seconds)), 132 &self.signer, 133 at(seconds), 134 ) 135 .unwrap(); 136 } 137 138 pub fn seed_registry(&self, repo: &RepoDid) -> CobId { 139 let meta = Repo::open(&self.meta_path).unwrap(); 140 let store = CobStore::new(&meta); 141 store 142 .create( 143 &meta_home(), 144 &RegistryChange::Register(registration("nel", "anemone", repo, 1)), 145 &self.signer, 146 at(1), 147 ) 148 .unwrap() 149 .object 150 } 151 152 pub fn register_extra(&self, repo: &RepoDid, key: &str, registry: CobId) { 153 let meta = Repo::open(&self.meta_path).unwrap(); 154 let store = CobStore::new(&meta); 155 store 156 .update( 157 &meta_home(), 158 registry, 159 &RegistryChange::Register(registration("nel", key, repo, 2)), 160 &self.signer, 161 at(2), 162 ) 163 .unwrap(); 164 } 165 166 pub fn seed_collaborator(&self, repo: &RepoDid, subject: &str) -> CobId { 167 let git = self.layout.create(repo).unwrap(); 168 let store = CobStore::new(&git); 169 store 170 .create( 171 &CobHome::from(repo), 172 &CollaboratorsChange::Add(grant(subject, "nel", 1)), 173 &self.signer, 174 at(1), 175 ) 176 .unwrap() 177 .object 178 } 179 180 pub fn remove_collaborator(&self, repo: &RepoDid, object: CobId, subject: &str, seconds: i64) { 181 let git = self.layout.open(repo).unwrap(); 182 let store = CobStore::new(&git); 183 store 184 .update( 185 &CobHome::from(repo), 186 object, 187 &CollaboratorsChange::Remove(Removal { 188 subject: acc(subject), 189 }), 190 &self.signer, 191 at(seconds), 192 ) 193 .unwrap(); 194 } 195}