upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/git_remote_nostr/list.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/git_remote_nostr/list.rs')
-rw-r--r--tests/git_remote_nostr/list.rs362
1 files changed, 362 insertions, 0 deletions
diff --git a/tests/git_remote_nostr/list.rs b/tests/git_remote_nostr/list.rs
new file mode 100644
index 0000000..1b12bbd
--- /dev/null
+++ b/tests/git_remote_nostr/list.rs
@@ -0,0 +1,362 @@
1
2use super::*;
3
4mod without_state_announcement {
5
6 use super::*;
7
8 #[tokio::test]
9 #[serial]
10 async fn lists_head_and_2_branches_and_commit_ids_from_git_server() -> Result<()> {
11 let source_git_repo = prep_git_repo()?;
12 let source_path = source_git_repo.dir.to_str().unwrap().to_string();
13 std::fs::write(source_git_repo.dir.join("commit.md"), "some content")?;
14 let main_commit_id = source_git_repo.stage_and_commit("commit.md")?;
15
16 source_git_repo.create_branch("vnext")?;
17 source_git_repo.checkout("vnext")?;
18 std::fs::write(source_git_repo.dir.join("vnext.md"), "some content")?;
19 let vnext_commit_id = source_git_repo.stage_and_commit("vnext.md")?;
20 source_git_repo.checkout("main")?;
21
22 let git_repo = prep_git_repo()?;
23 let events = vec![
24 generate_test_key_1_metadata_event("fred"),
25 generate_test_key_1_relay_list_event(),
26 generate_repo_ref_event_with_git_server(vec![
27 source_git_repo.dir.to_str().unwrap().to_string(),
28 ]),
29 ];
30 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
31 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
32 Relay::new(8051, None, None),
33 Relay::new(8052, None, None),
34 Relay::new(8053, None, None),
35 Relay::new(8055, None, None),
36 Relay::new(8056, None, None),
37 Relay::new(8057, None, None),
38 );
39 r51.events = events.clone();
40 r55.events = events;
41
42 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
43 let mut p = cli_tester_after_fetch(&git_repo)?;
44 p.send_line("list")?;
45 p.expect(
46 format!(
47 "fetching ref list over filesystem from {}...\r\n",
48 source_path
49 )
50 .as_str(),
51 )?;
52 // println!("{}", p.expect_eventually("\r\n\r\n")?);
53 let res = p.expect_eventually("\r\n\r\n")?;
54 p.exit()?;
55 for p in [51, 52, 53, 55, 56, 57] {
56 relay::shutdown_relay(8000 + p)?;
57 }
58 assert_eq!(
59 res.split("\r\n")
60 .map(|e| e.to_string())
61 .collect::<HashSet<String>>(),
62 HashSet::from([
63 "@refs/heads/main HEAD".to_string(),
64 format!("{} refs/heads/main", main_commit_id),
65 format!("{} refs/heads/vnext", vnext_commit_id),
66 ]),
67 );
68 Ok(())
69 });
70 // launch relays
71 let _ = join!(
72 r51.listen_until_close(),
73 r52.listen_until_close(),
74 r53.listen_until_close(),
75 r55.listen_until_close(),
76 r56.listen_until_close(),
77 r57.listen_until_close(),
78 );
79 cli_tester_handle.join().unwrap()?;
80 Ok(())
81 }
82}
83mod with_state_announcement {
84
85 use super::*;
86
87 mod when_announcement_matches_git_server {
88
89 use super::*;
90
91 #[tokio::test]
92 #[serial]
93 async fn lists_head_and_2_branches_and_commit_ids_announcement() -> Result<()> {
94 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
95 let source_path = source_git_repo.dir.to_str().unwrap().to_string();
96
97 let main_commit_id = source_git_repo.get_tip_of_local_branch("main")?;
98 let example_commit_id = source_git_repo.get_tip_of_local_branch("example-branch")?;
99
100 let git_repo = prep_git_repo()?;
101 let events = vec![
102 generate_test_key_1_metadata_event("fred"),
103 generate_test_key_1_relay_list_event(),
104 generate_repo_ref_event_with_git_server(vec![
105 source_git_repo.dir.to_str().unwrap().to_string(),
106 ]),
107 state_event,
108 ];
109 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
110 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
111 Relay::new(8051, None, None),
112 Relay::new(8052, None, None),
113 Relay::new(8053, None, None),
114 Relay::new(8055, None, None),
115 Relay::new(8056, None, None),
116 Relay::new(8057, None, None),
117 );
118 r51.events = events.clone();
119 r55.events = events;
120
121 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
122 let mut p = cli_tester_after_fetch(&git_repo)?;
123 p.send_line("list")?;
124 p.expect(
125 format!(
126 "fetching ref list over filesystem from {}...\r\n",
127 source_path
128 )
129 .as_str(),
130 )?;
131 // println!("{}", p.expect_eventually("\r\n\r\n")?);
132 let res = p.expect_eventually("\r\n\r\n")?;
133 p.exit()?;
134 for p in [51, 52, 53, 55, 56, 57] {
135 relay::shutdown_relay(8000 + p)?;
136 }
137 assert_eq!(
138 res.split("\r\n")
139 .map(|e| e.to_string())
140 .collect::<HashSet<String>>(),
141 HashSet::from([
142 "@refs/heads/main HEAD".to_string(),
143 format!("{} refs/heads/main", main_commit_id),
144 format!("{} refs/heads/example-branch", example_commit_id),
145 ]),
146 );
147
148 Ok(())
149 });
150 // launch relays
151 let _ = join!(
152 r51.listen_until_close(),
153 r52.listen_until_close(),
154 r53.listen_until_close(),
155 r55.listen_until_close(),
156 r56.listen_until_close(),
157 r57.listen_until_close(),
158 );
159 cli_tester_handle.join().unwrap()?;
160 Ok(())
161 }
162 }
163 mod when_announcement_doesnt_match_git_server {
164
165 use super::*;
166
167 #[tokio::test]
168 #[serial]
169 async fn anouncement_state_is_used() -> Result<()> {
170 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
171 let source_path = source_git_repo.dir.to_str().unwrap().to_string();
172 let main_original_commit_id = source_git_repo.get_tip_of_local_branch("main")?;
173
174 {
175 // add commit to main on git server
176 let tmp_repo = GitTestRepo::clone_repo(&source_git_repo)?;
177 std::fs::write(tmp_repo.dir.join("commitx.md"), "some content")?;
178 tmp_repo.stage_and_commit("commitx.md")?;
179 let mut remote = tmp_repo.git_repo.find_remote("origin")?;
180 remote.push(&["refs/heads/main:refs/heads/main"], None)?;
181 }
182
183 let main_updated_commit_id = source_git_repo.get_tip_of_local_branch("main")?;
184 assert_ne!(main_original_commit_id, main_updated_commit_id);
185 let example_commit_id = source_git_repo.get_tip_of_local_branch("example-branch")?;
186
187 let git_repo = prep_git_repo()?;
188 let events = vec![
189 generate_test_key_1_metadata_event("fred"),
190 generate_test_key_1_relay_list_event(),
191 generate_repo_ref_event_with_git_server(vec![
192 source_git_repo.dir.to_str().unwrap().to_string(),
193 ]),
194 state_event,
195 ];
196 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
197 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
198 Relay::new(8051, None, None),
199 Relay::new(8052, None, None),
200 Relay::new(8053, None, None),
201 Relay::new(8055, None, None),
202 Relay::new(8056, None, None),
203 Relay::new(8057, None, None),
204 );
205 r51.events = events.clone();
206 r55.events = events;
207
208 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
209 let mut p = cli_tester_after_fetch(&git_repo)?;
210 p.send_line("list")?;
211 p.expect(
212 format!(
213 "fetching ref list over filesystem from {}...\r\n",
214 source_path
215 )
216 .as_str(),
217 )?;
218 p.expect(
219 format!(
220 "WARNING: {} refs/heads/main is out of sync with nostr \r\n",
221 source_path
222 )
223 .as_str(),
224 )?;
225
226 // println!("{}", p.expect_eventually("\r\n\r\n")?);
227 let res = p.expect_eventually("\r\n\r\n")?;
228 p.exit()?;
229 for p in [51, 52, 53, 55, 56, 57] {
230 relay::shutdown_relay(8000 + p)?;
231 }
232 assert_eq!(
233 res.split("\r\n")
234 .map(|e| e.to_string())
235 .collect::<HashSet<String>>(),
236 HashSet::from([
237 "@refs/heads/main HEAD".to_string(),
238 format!("{} refs/heads/main", main_original_commit_id),
239 format!("{} refs/heads/example-branch", example_commit_id),
240 ]),
241 );
242 Ok(())
243 });
244 // launch relays
245 let _ = join!(
246 r51.listen_until_close(),
247 r52.listen_until_close(),
248 r53.listen_until_close(),
249 r55.listen_until_close(),
250 r56.listen_until_close(),
251 r57.listen_until_close(),
252 );
253 cli_tester_handle.join().unwrap()?;
254 Ok(())
255 }
256 }
257
258 mod when_there_are_open_proposals {
259
260 use super::*;
261
262 #[tokio::test]
263 #[serial]
264 async fn open_proposal_listed_in_prs_namespace() -> Result<()> {
265 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
266 let source_path = source_git_repo.dir.to_str().unwrap().to_string();
267
268 let main_commit_id = source_git_repo.get_tip_of_local_branch("main")?;
269 let example_commit_id = source_git_repo.get_tip_of_local_branch("example-branch")?;
270
271 let git_repo = prep_git_repo()?;
272
273 let events = vec![
274 generate_test_key_1_metadata_event("fred"),
275 generate_test_key_1_relay_list_event(),
276 generate_repo_ref_event_with_git_server(vec![
277 source_git_repo.dir.to_str().unwrap().to_string(),
278 ]),
279 state_event,
280 ];
281 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
282 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
283 Relay::new(8051, None, None),
284 Relay::new(8052, None, None),
285 Relay::new(8053, None, None),
286 Relay::new(8055, None, None),
287 Relay::new(8056, None, None),
288 Relay::new(8057, None, None),
289 );
290 r51.events = events.clone();
291 r55.events = events;
292
293 let cli_tester_handle = std::thread::spawn(move || -> Result<String> {
294 cli_tester_create_proposals()?;
295
296 let mut p = cli_tester_after_fetch(&git_repo)?;
297 p.send_line("list")?;
298 p.expect(
299 format!(
300 "fetching ref list over filesystem from {}...\r\n",
301 source_path
302 )
303 .as_str(),
304 )?;
305 // println!("{}", p.expect_eventually("\r\n\r\n")?);
306 let res = p.expect_eventually("\r\n\r\n")?;
307
308 p.exit()?;
309 for p in [51, 52, 53, 55, 56, 57] {
310 relay::shutdown_relay(8000 + p)?;
311 }
312 Ok(res)
313 });
314 // launch relays
315 let _ = join!(
316 r51.listen_until_close(),
317 r52.listen_until_close(),
318 r53.listen_until_close(),
319 r55.listen_until_close(),
320 r56.listen_until_close(),
321 r57.listen_until_close(),
322 );
323
324 let res = cli_tester_handle.join().unwrap()?;
325
326 let proposal_creation_repo = cli_tester_create_proposal_branches_ready_to_send()?;
327
328 let mut pr_refs = vec![];
329 for name in [
330 FEATURE_BRANCH_NAME_1,
331 FEATURE_BRANCH_NAME_2,
332 FEATURE_BRANCH_NAME_3,
333 ] {
334 pr_refs.push(format!(
335 "{} refs/heads/{}",
336 proposal_creation_repo.get_tip_of_local_branch(name)?,
337 get_proposal_branch_name_from_events(&r55.events, name)?,
338 ));
339 }
340
341 assert_eq!(
342 res.split("\r\n")
343 .map(|e| e.to_string())
344 .collect::<HashSet<String>>(),
345 [
346 vec![
347 "@refs/heads/main HEAD".to_string(),
348 format!("{} refs/heads/main", main_commit_id),
349 format!("{} refs/heads/example-branch", example_commit_id),
350 ],
351 pr_refs,
352 ]
353 .concat()
354 .iter()
355 .cloned()
356 .collect::<HashSet<String>>()
357 );
358
359 Ok(())
360 }
361 }
362}