upleb.uk

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

summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2023-12-01 00:00:00 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2023-12-01 00:00:00 +0000
commit06be0bc44011411b78217459f505ed12281b32c4 (patch)
tree36cab80e309d33f20fedcc97258700a379aa348e /tests
parent492cc67887855cecb3fb501c4b61af50bf645b73 (diff)
feat(prs-list) list and pull selected as branch
- fetch prs and present as a selectable list - create and / or checkout branch for selected pr - apply latest patches as commits
Diffstat (limited to 'tests')
-rw-r--r--tests/prs_create.rs163
-rw-r--r--tests/prs_list.rs768
2 files changed, 889 insertions, 42 deletions
diff --git a/tests/prs_create.rs b/tests/prs_create.rs
index dc6eec0..d00bb9f 100644
--- a/tests/prs_create.rs
+++ b/tests/prs_create.rs
@@ -147,9 +147,6 @@ mod sends_pr_and_2_patches_to_3_relays {
147 147
148 use super::*; 148 use super::*;
149 149
150 static PR_KIND: u64 = 318;
151 static PATCH_KIND: u64 = 317;
152
153 fn prep_git_repo() -> Result<GitTestRepo> { 150 fn prep_git_repo() -> Result<GitTestRepo> {
154 let test_repo = GitTestRepo::default(); 151 let test_repo = GitTestRepo::default();
155 test_repo.populate()?; 152 test_repo.populate()?;
@@ -411,8 +408,31 @@ mod sends_pr_and_2_patches_to_3_relays {
411 use super::*; 408 use super::*;
412 #[test] 409 #[test]
413 #[serial] 410 #[serial]
411 fn pr_tags_repo_commit_as_identifier() -> Result<()> {
412 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
413 let root_commit = GitTestRepo::default().initial_commit()?;
414
415 for relay in [&r53, &r55, &r56] {
416 let pr_event: &nostr::Event = relay
417 .events
418 .iter()
419 .find(|e| e.kind.as_u64().eq(&PR_KIND))
420 .unwrap();
421
422 // root commit identifier tag
423 assert!(pr_event.tags.iter().any(
424 |t| t.as_vec()[0].eq("d") && t.as_vec()[1].eq(&format!("{}", root_commit))
425 ));
426 }
427 Ok(())
428 }
429
430 #[test]
431 #[serial]
414 fn pr_tags_repo_commit() -> Result<()> { 432 fn pr_tags_repo_commit() -> Result<()> {
415 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?; 433 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
434 let root_commit = GitTestRepo::default().initial_commit()?;
435
416 for relay in [&r53, &r55, &r56] { 436 for relay in [&r53, &r55, &r56] {
417 let pr_event: &nostr::Event = relay 437 let pr_event: &nostr::Event = relay
418 .events 438 .events
@@ -421,8 +441,10 @@ mod sends_pr_and_2_patches_to_3_relays {
421 .unwrap(); 441 .unwrap();
422 442
423 // root commit 'r' tag 443 // root commit 'r' tag
424 assert!(pr_event.tags.iter().any(|t| t.as_vec()[0].eq("r") 444 assert!(
425 && t.as_vec()[1].eq("r-9ee507fc4357d7ee16a5d8901bedcd103f23c17d"))); 445 pr_event.tags.iter().any(|t| t.as_vec()[0].eq("r")
446 && t.as_vec()[1].eq(&format!("r-{}", root_commit)))
447 );
426 } 448 }
427 Ok(()) 449 Ok(())
428 } 450 }
@@ -503,50 +525,107 @@ mod sends_pr_and_2_patches_to_3_relays {
503 525
504 mod patch_tags { 526 mod patch_tags {
505 use super::*; 527 use super::*;
528
529 fn prep() -> Result<nostr::Event> {
530 let (_, _, r53, _, _) = futures::executor::block_on(prep_run_create_pr())?;
531 Ok(r53
532 .events
533 .iter()
534 .find(|e| e.kind.as_u64().eq(&PATCH_KIND))
535 .unwrap()
536 .clone())
537 }
538
506 #[test] 539 #[test]
507 #[serial] 540 #[serial]
508 fn patch_tags_correctly_formatted() -> Result<()> { 541 fn commit_and_commit_r() -> Result<()> {
509 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?; 542 static COMMIT_ID: &str = "fe973a840fba2a8ab37dd505c154854a69a6505c";
510 for relay in [&r53, &r55, &r56] { 543 let most_recent_patch = prep()?;
511 let patch_events: Vec<&nostr::Event> = relay 544 assert!(
512 .events 545 most_recent_patch
546 .tags
513 .iter() 547 .iter()
514 .filter(|e| e.kind.as_u64().eq(&PATCH_KIND)) 548 .any(|t| t.as_vec()[0].eq("r") && t.as_vec()[1].eq(COMMIT_ID))
515 .collect(); 549 );
550 assert!(
551 most_recent_patch
552 .tags
553 .iter()
554 .any(|t| t.as_vec()[0].eq("commit") && t.as_vec()[1].eq(COMMIT_ID))
555 );
556 Ok(())
557 }
516 558
517 static COMMIT_ID: &str = "fe973a840fba2a8ab37dd505c154854a69a6505c"; 559 #[test]
518 let most_recent_patch = patch_events[0]; 560 #[serial]
561 fn parent_commit_and_parent_commit_r() -> Result<()> {
562 // commit parent 'r' and 'parent-commit' tag
563 static COMMIT_PARENT_ID: &str = "232efb37ebc67692c9e9ff58b83c0d3d63971a0a";
564 let most_recent_patch = prep()?;
565 assert!(
566 most_recent_patch
567 .tags
568 .iter()
569 .any(|t| t.as_vec()[0].eq("r") && t.as_vec()[1].eq(COMMIT_PARENT_ID))
570 );
571 assert!(
572 most_recent_patch.tags.iter().any(
573 |t| t.as_vec()[0].eq("parent-commit") && t.as_vec()[1].eq(COMMIT_PARENT_ID)
574 )
575 );
576 Ok(())
577 }
519 578
520 // commit 'r' and 'commit' tag 579 #[test]
521 assert!( 580 #[serial]
522 most_recent_patch 581 fn root_commit_as_r_with_r_hypen_prefix() -> Result<()> {
523 .tags 582 assert!(prep()?.tags.iter().any(|t| t.as_vec()[0].eq("r")
524 .iter() 583 && t.as_vec()[1].eq("r-9ee507fc4357d7ee16a5d8901bedcd103f23c17d")));
525 .any(|t| t.as_vec()[0].eq("r") && t.as_vec()[1].eq(COMMIT_ID)) 584 Ok(())
526 ); 585 }
527 assert!(
528 most_recent_patch
529 .tags
530 .iter()
531 .any(|t| t.as_vec()[0].eq("commit") && t.as_vec()[1].eq(COMMIT_ID))
532 );
533 586
534 // commit parent 't' and 'parent-commit' tag 587 #[test]
535 static COMMIT_PARENT_ID: &str = "232efb37ebc67692c9e9ff58b83c0d3d63971a0a"; 588 #[serial]
536 assert!( 589 fn description_with_commit_message() -> Result<()> {
537 most_recent_patch 590 assert_eq!(
538 .tags 591 prep()?
539 .iter() 592 .tags
540 .any(|t| t.as_vec()[0].eq("r") && t.as_vec()[1].eq(COMMIT_PARENT_ID)) 593 .iter()
541 ); 594 .find(|t| t.as_vec()[0].eq("description"))
542 assert!(most_recent_patch.tags.iter().any( 595 .unwrap()
543 |t| t.as_vec()[0].eq("parent-commit") && t.as_vec()[1].eq(COMMIT_PARENT_ID) 596 .as_vec()[1],
544 )); 597 "add t4.md"
598 );
599 Ok(())
600 }
545 601
546 // root commit 't' tag 602 #[test]
547 assert!(most_recent_patch.tags.iter().any(|t| t.as_vec()[0].eq("r") 603 #[serial]
548 && t.as_vec()[1].eq("r-9ee507fc4357d7ee16a5d8901bedcd103f23c17d"))); 604 fn commit_author() -> Result<()> {
549 } 605 assert_eq!(
606 prep()?
607 .tags
608 .iter()
609 .find(|t| t.as_vec()[0].eq("author"))
610 .unwrap()
611 .as_vec(),
612 vec!["author", "Joe Bloggs", "joe.bloggs@pm.me", "0,0"],
613 );
614 Ok(())
615 }
616
617 #[test]
618 #[serial]
619 fn commit_committer() -> Result<()> {
620 assert_eq!(
621 prep()?
622 .tags
623 .iter()
624 .find(|t| t.as_vec()[0].eq("committer"))
625 .unwrap()
626 .as_vec(),
627 vec!["committer", "Joe Bloggs", "joe.bloggs@pm.me", "0,0"],
628 );
550 Ok(()) 629 Ok(())
551 } 630 }
552 631
diff --git a/tests/prs_list.rs b/tests/prs_list.rs
new file mode 100644
index 0000000..7bc3935
--- /dev/null
+++ b/tests/prs_list.rs
@@ -0,0 +1,768 @@
1use anyhow::Result;
2use futures::join;
3use serial_test::serial;
4use test_utils::{git::GitTestRepo, relay::Relay, *};
5
6static FEATURE_BRANCH_NAME_1: &str = "feature-example-t";
7static FEATURE_BRANCH_NAME_2: &str = "feature-example-f";
8static FEATURE_BRANCH_NAME_3: &str = "feature-example-c";
9
10static PR_TITLE_1: &str = "pr a";
11static PR_TITLE_2: &str = "pr b";
12static PR_TITLE_3: &str = "pr c";
13
14fn cli_tester_create_prs() -> Result<GitTestRepo> {
15 let git_repo = GitTestRepo::default();
16 git_repo.populate()?;
17 cli_tester_create_pr(
18 &git_repo,
19 FEATURE_BRANCH_NAME_1,
20 "a",
21 PR_TITLE_1,
22 "pr a description",
23 )?;
24 cli_tester_create_pr(
25 &git_repo,
26 FEATURE_BRANCH_NAME_2,
27 "b",
28 PR_TITLE_2,
29 "pr b description",
30 )?;
31 cli_tester_create_pr(
32 &git_repo,
33 FEATURE_BRANCH_NAME_3,
34 "c",
35 PR_TITLE_3,
36 "pr c description",
37 )?;
38 Ok(git_repo)
39}
40
41fn create_and_populate_branch(
42 test_repo: &GitTestRepo,
43 branch_name: &str,
44 prefix: &str,
45 only_one_commit: bool,
46) -> Result<()> {
47 test_repo.checkout("main")?;
48 test_repo.create_branch(branch_name)?;
49 test_repo.checkout(branch_name)?;
50 std::fs::write(
51 test_repo.dir.join(format!("{}3.md", prefix)),
52 "some content",
53 )?;
54 test_repo.stage_and_commit(format!("add {}3.md", prefix).as_str())?;
55 if !only_one_commit {
56 std::fs::write(
57 test_repo.dir.join(format!("{}4.md", prefix)),
58 "some content",
59 )?;
60 test_repo.stage_and_commit(format!("add {}4.md", prefix).as_str())?;
61 }
62 Ok(())
63}
64
65fn cli_tester_create_pr(
66 test_repo: &GitTestRepo,
67 branch_name: &str,
68 prefix: &str,
69 title: &str,
70 description: &str,
71) -> Result<()> {
72 create_and_populate_branch(test_repo, branch_name, prefix, false)?;
73
74 let mut p = CliTester::new_from_dir(
75 &test_repo.dir,
76 [
77 "--nsec",
78 TEST_KEY_1_NSEC,
79 "--password",
80 TEST_PASSWORD,
81 "--disable-cli-spinners",
82 "prs",
83 "create",
84 "--title",
85 format!("\"{title}\"").as_str(),
86 "--description",
87 format!("\"{description}\"").as_str(),
88 ],
89 );
90 p.expect_end_eventually()?;
91 Ok(())
92}
93
94mod when_main_branch_is_uptodate {
95 use super::*;
96
97 mod when_pr_branch_doesnt_exist {
98 use super::*;
99
100 mod when_main_is_checked_out {
101 use super::*;
102
103 mod when_first_pr_selected {
104 use super::*;
105
106 // TODO: test when other prs with the same name but from other repositories are
107 // present on relays
108 async fn prep_and_run() -> Result<(GitTestRepo, GitTestRepo)> {
109 // fallback (51,52) user write (53, 55) repo (55, 56)
110 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
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 );
117
118 r51.events.push(generate_test_key_1_relay_list_event());
119 r51.events.push(generate_test_key_1_metadata_event("fred"));
120 r51.events.push(generate_repo_ref_event());
121
122 r55.events.push(generate_repo_ref_event());
123 r55.events.push(generate_test_key_1_metadata_event("fred"));
124 r55.events.push(generate_test_key_1_relay_list_event());
125
126 let cli_tester_handle =
127 std::thread::spawn(move || -> Result<(GitTestRepo, GitTestRepo)> {
128 let originating_repo = cli_tester_create_prs()?;
129
130 let test_repo = GitTestRepo::default();
131 test_repo.populate()?;
132 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
133
134 p.expect("finding PRs...\r\n")?;
135 let mut c = p.expect_choice(
136 "All PRs",
137 vec![
138 format!("\"{PR_TITLE_1}\""),
139 format!("\"{PR_TITLE_2}\""),
140 format!("\"{PR_TITLE_3}\""),
141 ],
142 )?;
143 c.succeeds_with(0, true)?;
144
145 p.expect_end_eventually_and_print()?;
146
147 for p in [51, 52, 53, 55, 56] {
148 relay::shutdown_relay(8000 + p)?;
149 }
150 Ok((originating_repo, test_repo))
151 });
152
153 // launch relay
154 let _ = join!(
155 r51.listen_until_close(),
156 r52.listen_until_close(),
157 r53.listen_until_close(),
158 r55.listen_until_close(),
159 r56.listen_until_close(),
160 );
161 let res = cli_tester_handle.join().unwrap()?;
162
163 Ok(res)
164 }
165
166 mod cli_prompts {
167 use super::*;
168 async fn run_async_prompts_to_choose_from_pr_titles() -> Result<()> {
169 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
170 Relay::new(8051, None, None),
171 Relay::new(8052, None, None),
172 Relay::new(8053, None, None),
173 Relay::new(8055, None, None),
174 Relay::new(8056, None, None),
175 );
176
177 r51.events.push(generate_test_key_1_relay_list_event());
178 r51.events.push(generate_test_key_1_metadata_event("fred"));
179 r51.events.push(generate_repo_ref_event());
180
181 r55.events.push(generate_repo_ref_event());
182 r55.events.push(generate_test_key_1_metadata_event("fred"));
183 r55.events.push(generate_test_key_1_relay_list_event());
184
185 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
186 cli_tester_create_prs()?;
187
188 let test_repo = GitTestRepo::default();
189 test_repo.populate()?;
190 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
191
192 p.expect("finding PRs...\r\n")?;
193 let mut c = p.expect_choice(
194 "All PRs",
195 vec![
196 format!("\"{PR_TITLE_1}\""),
197 format!("\"{PR_TITLE_2}\""),
198 format!("\"{PR_TITLE_3}\""),
199 ],
200 )?;
201 c.succeeds_with(0, true)?;
202 p.expect("finding commits...\r\n")?;
203 p.expect("checked out PR branch. pulled 2 new commits\r\n")?;
204 p.expect_end()?;
205
206 for p in [51, 52, 53, 55, 56] {
207 relay::shutdown_relay(8000 + p)?;
208 }
209 Ok(())
210 });
211
212 // launch relay
213 let _ = join!(
214 r51.listen_until_close(),
215 r52.listen_until_close(),
216 r53.listen_until_close(),
217 r55.listen_until_close(),
218 r56.listen_until_close(),
219 );
220 cli_tester_handle.join().unwrap()?;
221 println!("{:?}", r55.events);
222 Ok(())
223 }
224
225 #[test]
226 #[serial]
227 fn prompts_to_choose_from_pr_titles() -> Result<()> {
228 futures::executor::block_on(run_async_prompts_to_choose_from_pr_titles())
229 }
230 }
231
232 #[test]
233 #[serial]
234 fn pr_branch_created_with_correct_name() -> Result<()> {
235 let (_, test_repo) = futures::executor::block_on(prep_and_run())?;
236 assert_eq!(
237 vec![FEATURE_BRANCH_NAME_1, "main"],
238 test_repo.get_local_branch_names()?
239 );
240 Ok(())
241 }
242
243 #[test]
244 #[serial]
245 fn pr_branch_checked_out() -> Result<()> {
246 let (_, test_repo) = futures::executor::block_on(prep_and_run())?;
247 assert_eq!(
248 FEATURE_BRANCH_NAME_1,
249 test_repo.get_checked_out_branch_name()?,
250 );
251 Ok(())
252 }
253
254 #[test]
255 #[serial]
256 fn pr_branch_tip_is_most_recent_patch() -> Result<()> {
257 let (originating_repo, test_repo) =
258 futures::executor::block_on(prep_and_run())?;
259 assert_eq!(
260 originating_repo.get_tip_of_local_branch(FEATURE_BRANCH_NAME_1)?,
261 test_repo.get_tip_of_local_branch(FEATURE_BRANCH_NAME_1)?,
262 );
263 Ok(())
264 }
265 }
266 mod when_third_pr_selected {
267 use super::*;
268
269 async fn prep_and_run() -> Result<(GitTestRepo, GitTestRepo)> {
270 // fallback (51,52) user write (53, 55) repo (55, 56)
271 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
272 Relay::new(8051, None, None),
273 Relay::new(8052, None, None),
274 Relay::new(8053, None, None),
275 Relay::new(8055, None, None),
276 Relay::new(8056, None, None),
277 );
278
279 r51.events.push(generate_test_key_1_relay_list_event());
280 r51.events.push(generate_test_key_1_metadata_event("fred"));
281 r51.events.push(generate_repo_ref_event());
282
283 r55.events.push(generate_repo_ref_event());
284 r55.events.push(generate_test_key_1_metadata_event("fred"));
285 r55.events.push(generate_test_key_1_relay_list_event());
286
287 let cli_tester_handle =
288 std::thread::spawn(move || -> Result<(GitTestRepo, GitTestRepo)> {
289 let originating_repo = cli_tester_create_prs()?;
290
291 let test_repo = GitTestRepo::default();
292 test_repo.populate()?;
293 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
294
295 p.expect("finding PRs...\r\n")?;
296 let mut c = p.expect_choice(
297 "All PRs",
298 vec![
299 format!("\"{PR_TITLE_1}\""),
300 format!("\"{PR_TITLE_2}\""),
301 format!("\"{PR_TITLE_3}\""),
302 ],
303 )?;
304 c.succeeds_with(2, true)?;
305
306 p.expect_end_eventually_and_print()?;
307
308 for p in [51, 52, 53, 55, 56] {
309 relay::shutdown_relay(8000 + p)?;
310 }
311 Ok((originating_repo, test_repo))
312 });
313
314 // launch relay
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 );
322 let res = cli_tester_handle.join().unwrap()?;
323
324 Ok(res)
325 }
326
327 mod cli_prompts {
328 use super::*;
329 async fn run_async_prompts_to_choose_from_pr_titles() -> Result<()> {
330 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
331 Relay::new(8051, None, None),
332 Relay::new(8052, None, None),
333 Relay::new(8053, None, None),
334 Relay::new(8055, None, None),
335 Relay::new(8056, None, None),
336 );
337
338 r51.events.push(generate_test_key_1_relay_list_event());
339 r51.events.push(generate_test_key_1_metadata_event("fred"));
340 r51.events.push(generate_repo_ref_event());
341
342 r55.events.push(generate_repo_ref_event());
343 r55.events.push(generate_test_key_1_metadata_event("fred"));
344 r55.events.push(generate_test_key_1_relay_list_event());
345
346 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
347 cli_tester_create_prs()?;
348
349 let test_repo = GitTestRepo::default();
350 test_repo.populate()?;
351 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
352
353 p.expect("finding PRs...\r\n")?;
354 let mut c = p.expect_choice(
355 "All PRs",
356 vec![
357 format!("\"{PR_TITLE_1}\""),
358 format!("\"{PR_TITLE_2}\""),
359 format!("\"{PR_TITLE_3}\""),
360 ],
361 )?;
362 c.succeeds_with(2, true)?;
363 p.expect("finding commits...\r\n")?;
364 p.expect("checked out PR branch. pulled 2 new commits\r\n")?;
365 p.expect_end()?;
366
367 for p in [51, 52, 53, 55, 56] {
368 relay::shutdown_relay(8000 + p)?;
369 }
370 Ok(())
371 });
372
373 // launch relay
374 let _ = join!(
375 r51.listen_until_close(),
376 r52.listen_until_close(),
377 r53.listen_until_close(),
378 r55.listen_until_close(),
379 r56.listen_until_close(),
380 );
381 cli_tester_handle.join().unwrap()?;
382 println!("{:?}", r55.events);
383 Ok(())
384 }
385
386 #[test]
387 #[serial]
388 fn prompts_to_choose_from_pr_titles() -> Result<()> {
389 futures::executor::block_on(run_async_prompts_to_choose_from_pr_titles())
390 }
391 }
392
393 #[test]
394 #[serial]
395 fn pr_branch_created_with_correct_name() -> Result<()> {
396 let (_, test_repo) = futures::executor::block_on(prep_and_run())?;
397 assert_eq!(
398 vec![FEATURE_BRANCH_NAME_3, "main"],
399 test_repo.get_local_branch_names()?
400 );
401 Ok(())
402 }
403
404 #[test]
405 #[serial]
406 fn pr_branch_checked_out() -> Result<()> {
407 let (_, test_repo) = futures::executor::block_on(prep_and_run())?;
408 assert_eq!(
409 FEATURE_BRANCH_NAME_3,
410 test_repo.get_checked_out_branch_name()?,
411 );
412 Ok(())
413 }
414
415 #[test]
416 #[serial]
417 fn pr_branch_tip_is_most_recent_patch() -> Result<()> {
418 let (originating_repo, test_repo) =
419 futures::executor::block_on(prep_and_run())?;
420 assert_eq!(
421 originating_repo.get_tip_of_local_branch(FEATURE_BRANCH_NAME_3)?,
422 test_repo.get_tip_of_local_branch(FEATURE_BRANCH_NAME_3)?,
423 );
424 Ok(())
425 }
426 }
427 }
428 }
429
430 mod when_pr_branch_exists {
431 use super::*;
432
433 mod when_main_is_checked_out {
434 use super::*;
435
436 mod when_branch_is_up_to_date {
437 use super::*;
438 async fn prep_and_run() -> Result<(GitTestRepo, GitTestRepo)> {
439 // fallback (51,52) user write (53, 55) repo (55, 56)
440 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
441 Relay::new(8051, None, None),
442 Relay::new(8052, None, None),
443 Relay::new(8053, None, None),
444 Relay::new(8055, None, None),
445 Relay::new(8056, None, None),
446 );
447
448 r51.events.push(generate_test_key_1_relay_list_event());
449 r51.events.push(generate_test_key_1_metadata_event("fred"));
450 r51.events.push(generate_repo_ref_event());
451
452 r55.events.push(generate_repo_ref_event());
453 r55.events.push(generate_test_key_1_metadata_event("fred"));
454 r55.events.push(generate_test_key_1_relay_list_event());
455
456 let cli_tester_handle =
457 std::thread::spawn(move || -> Result<(GitTestRepo, GitTestRepo)> {
458 let originating_repo = cli_tester_create_prs()?;
459
460 let test_repo = GitTestRepo::default();
461 test_repo.populate()?;
462 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
463
464 create_and_populate_branch(
465 &test_repo,
466 FEATURE_BRANCH_NAME_1,
467 "a",
468 false,
469 )?;
470 test_repo.checkout("main")?;
471 p.expect("finding PRs...\r\n")?;
472 let mut c = p.expect_choice(
473 "All PRs",
474 vec![
475 format!("\"{PR_TITLE_1}\""),
476 format!("\"{PR_TITLE_2}\""),
477 format!("\"{PR_TITLE_3}\""),
478 ],
479 )?;
480 c.succeeds_with(0, true)?;
481 p.expect_end_eventually_and_print()?;
482
483 for p in [51, 52, 53, 55, 56] {
484 relay::shutdown_relay(8000 + p)?;
485 }
486 Ok((originating_repo, test_repo))
487 });
488
489 // launch relay
490 let _ = join!(
491 r51.listen_until_close(),
492 r52.listen_until_close(),
493 r53.listen_until_close(),
494 r55.listen_until_close(),
495 r56.listen_until_close(),
496 );
497 let res = cli_tester_handle.join().unwrap()?;
498
499 Ok(res)
500 }
501
502 mod cli_prompts {
503 use super::*;
504 async fn run_async_prompts_to_choose_from_pr_titles() -> Result<()> {
505 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
506 Relay::new(8051, None, None),
507 Relay::new(8052, None, None),
508 Relay::new(8053, None, None),
509 Relay::new(8055, None, None),
510 Relay::new(8056, None, None),
511 );
512
513 r51.events.push(generate_test_key_1_relay_list_event());
514 r51.events.push(generate_test_key_1_metadata_event("fred"));
515 r51.events.push(generate_repo_ref_event());
516
517 r55.events.push(generate_repo_ref_event());
518 r55.events.push(generate_test_key_1_metadata_event("fred"));
519 r55.events.push(generate_test_key_1_relay_list_event());
520
521 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
522 cli_tester_create_prs()?;
523
524 let test_repo = GitTestRepo::default();
525 test_repo.populate()?;
526 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
527
528 create_and_populate_branch(
529 &test_repo,
530 FEATURE_BRANCH_NAME_1,
531 "a",
532 false,
533 )?;
534 test_repo.checkout("main")?;
535
536 p.expect("finding PRs...\r\n")?;
537 let mut c = p.expect_choice(
538 "All PRs",
539 vec![
540 format!("\"{PR_TITLE_1}\""),
541 format!("\"{PR_TITLE_2}\""),
542 format!("\"{PR_TITLE_3}\""),
543 ],
544 )?;
545 c.succeeds_with(0, true)?;
546 p.expect("finding commits...\r\n")?;
547 p.expect("checked out PR branch. no new commits to pull\r\n")?;
548 p.expect_end()?;
549
550 for p in [51, 52, 53, 55, 56] {
551 relay::shutdown_relay(8000 + p)?;
552 }
553 Ok(())
554 });
555
556 // launch relay
557 let _ = join!(
558 r51.listen_until_close(),
559 r52.listen_until_close(),
560 r53.listen_until_close(),
561 r55.listen_until_close(),
562 r56.listen_until_close(),
563 );
564 cli_tester_handle.join().unwrap()?;
565 println!("{:?}", r55.events);
566 Ok(())
567 }
568
569 #[test]
570 #[serial]
571 fn prompts_to_choose_from_pr_titles() -> Result<()> {
572 futures::executor::block_on(run_async_prompts_to_choose_from_pr_titles())
573 }
574 }
575
576 #[test]
577 #[serial]
578 fn pr_branch_checked_out() -> Result<()> {
579 let (_, test_repo) = futures::executor::block_on(prep_and_run())?;
580 assert_eq!(
581 FEATURE_BRANCH_NAME_1,
582 test_repo.get_checked_out_branch_name()?,
583 );
584 Ok(())
585 }
586 }
587
588 mod when_branch_is_behind {
589 use super::*;
590
591 async fn prep_and_run() -> Result<(GitTestRepo, GitTestRepo)> {
592 // fallback (51,52) user write (53, 55) repo (55, 56)
593 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
594 Relay::new(8051, None, None),
595 Relay::new(8052, None, None),
596 Relay::new(8053, None, None),
597 Relay::new(8055, None, None),
598 Relay::new(8056, None, None),
599 );
600
601 r51.events.push(generate_test_key_1_relay_list_event());
602 r51.events.push(generate_test_key_1_metadata_event("fred"));
603 r51.events.push(generate_repo_ref_event());
604
605 r55.events.push(generate_repo_ref_event());
606 r55.events.push(generate_test_key_1_metadata_event("fred"));
607 r55.events.push(generate_test_key_1_relay_list_event());
608
609 let cli_tester_handle =
610 std::thread::spawn(move || -> Result<(GitTestRepo, GitTestRepo)> {
611 let originating_repo = cli_tester_create_prs()?;
612
613 let test_repo = GitTestRepo::default();
614 test_repo.populate()?;
615 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
616
617 create_and_populate_branch(
618 &test_repo,
619 FEATURE_BRANCH_NAME_1,
620 "a",
621 true,
622 )?;
623 test_repo.checkout("main")?;
624
625 p.expect("finding PRs...\r\n")?;
626 let mut c = p.expect_choice(
627 "All PRs",
628 vec![
629 format!("\"{PR_TITLE_1}\""),
630 format!("\"{PR_TITLE_2}\""),
631 format!("\"{PR_TITLE_3}\""),
632 ],
633 )?;
634 c.succeeds_with(0, true)?;
635
636 p.expect_end_eventually_and_print()?;
637
638 for p in [51, 52, 53, 55, 56] {
639 relay::shutdown_relay(8000 + p)?;
640 }
641 Ok((originating_repo, test_repo))
642 });
643
644 // launch relay
645 let _ = join!(
646 r51.listen_until_close(),
647 r52.listen_until_close(),
648 r53.listen_until_close(),
649 r55.listen_until_close(),
650 r56.listen_until_close(),
651 );
652 let res = cli_tester_handle.join().unwrap()?;
653
654 Ok(res)
655 }
656
657 mod cli_prompts {
658 use super::*;
659 async fn run_async_prompts_to_choose_from_pr_titles() -> Result<()> {
660 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
661 Relay::new(8051, None, None),
662 Relay::new(8052, None, None),
663 Relay::new(8053, None, None),
664 Relay::new(8055, None, None),
665 Relay::new(8056, None, None),
666 );
667
668 r51.events.push(generate_test_key_1_relay_list_event());
669 r51.events.push(generate_test_key_1_metadata_event("fred"));
670 r51.events.push(generate_repo_ref_event());
671
672 r55.events.push(generate_repo_ref_event());
673 r55.events.push(generate_test_key_1_metadata_event("fred"));
674 r55.events.push(generate_test_key_1_relay_list_event());
675
676 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
677 cli_tester_create_prs()?;
678
679 let test_repo = GitTestRepo::default();
680 test_repo.populate()?;
681 let mut p = CliTester::new_from_dir(&test_repo.dir, ["prs", "list"]);
682
683 create_and_populate_branch(
684 &test_repo,
685 FEATURE_BRANCH_NAME_1,
686 "a",
687 true,
688 )?;
689 test_repo.checkout("main")?;
690
691 p.expect("finding PRs...\r\n")?;
692 let mut c = p.expect_choice(
693 "All PRs",
694 vec![
695 format!("\"{PR_TITLE_1}\""),
696 format!("\"{PR_TITLE_2}\""),
697 format!("\"{PR_TITLE_3}\""),
698 ],
699 )?;
700 c.succeeds_with(0, true)?;
701 p.expect("finding commits...\r\n")?;
702 p.expect("checked out PR branch. pulled 1 new commits\r\n")?;
703 p.expect_end()?;
704
705 for p in [51, 52, 53, 55, 56] {
706 relay::shutdown_relay(8000 + p)?;
707 }
708 Ok(())
709 });
710
711 // launch relay
712 let _ = join!(
713 r51.listen_until_close(),
714 r52.listen_until_close(),
715 r53.listen_until_close(),
716 r55.listen_until_close(),
717 r56.listen_until_close(),
718 );
719 cli_tester_handle.join().unwrap()?;
720 println!("{:?}", r55.events);
721 Ok(())
722 }
723
724 #[test]
725 #[serial]
726 fn prompts_to_choose_from_pr_titles() -> Result<()> {
727 futures::executor::block_on(run_async_prompts_to_choose_from_pr_titles())
728 }
729 }
730
731 #[test]
732 #[serial]
733 fn pr_branch_checked_out() -> Result<()> {
734 let (_, test_repo) = futures::executor::block_on(prep_and_run())?;
735 assert_eq!(
736 FEATURE_BRANCH_NAME_1,
737 test_repo.get_checked_out_branch_name()?,
738 );
739 Ok(())
740 }
741
742 #[test]
743 #[serial]
744 fn pr_branch_tip_is_most_recent_patch() -> Result<()> {
745 let (originating_repo, test_repo) =
746 futures::executor::block_on(prep_and_run())?;
747 assert_eq!(
748 originating_repo.get_tip_of_local_branch(FEATURE_BRANCH_NAME_1)?,
749 test_repo.get_tip_of_local_branch(FEATURE_BRANCH_NAME_1)?,
750 );
751 Ok(())
752 }
753 }
754
755 mod when_branch_is_ahead {
756 // use super::*;
757 // TODO latest commit in pr builds off an older commit in pr
758 // instead of previous.
759 // TODO current git user created commit on branch
760 }
761
762 mod when_latest_event_rebases_branch {
763 // use super::*;
764 // TODO
765 }
766 }
767 }
768}