This repository has no description
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}