upleb.uk

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

summaryrefslogtreecommitdiff
path: root/tests/git_remote_helper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/git_remote_helper.rs')
-rw-r--r--tests/git_remote_helper.rs169
1 files changed, 168 insertions, 1 deletions
diff --git a/tests/git_remote_helper.rs b/tests/git_remote_helper.rs
index ea76445..fffcaa1 100644
--- a/tests/git_remote_helper.rs
+++ b/tests/git_remote_helper.rs
@@ -51,6 +51,77 @@ fn cli_tester_after_fetch(git_repo: &GitTestRepo) -> Result<CliTester> {
51 Ok(p) 51 Ok(p)
52} 52}
53 53
54async fn generate_repo_with_state_event() -> Result<(nostr::Event, GitTestRepo)> {
55 let git_repo = prep_git_repo()?;
56 let commit_id = git_repo.get_tip_of_local_branch("main")?.to_string();
57 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
58
59 let events = vec![
60 generate_test_key_1_metadata_event("fred"),
61 generate_test_key_1_relay_list_event(),
62 generate_repo_ref_event_with_git_server(source_git_repo.dir.to_str().unwrap()),
63 ];
64 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
65 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
66 Relay::new(8051, None, None),
67 Relay::new(8052, None, None),
68 Relay::new(8053, None, None),
69 Relay::new(8055, None, None),
70 Relay::new(8056, None, None),
71 Relay::new(8057, None, None),
72 );
73 r51.events = events.clone();
74 r55.events = events;
75
76 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
77 let mut p = cli_tester_after_fetch(&git_repo)?;
78 p.send_line("push refs/heads/main:refs/heads/main")?;
79 p.send_line("")?;
80 p.expect("ok refs/heads/main\r\n")?;
81 p.expect("\r\n")?;
82
83 p.exit()?;
84 for p in [51, 52, 53, 55, 56, 57] {
85 relay::shutdown_relay(8000 + p)?;
86 }
87 Ok(())
88 });
89 // launch relays
90 let _ = join!(
91 r51.listen_until_close(),
92 r52.listen_until_close(),
93 r53.listen_until_close(),
94 r55.listen_until_close(),
95 r56.listen_until_close(),
96 r57.listen_until_close(),
97 );
98 cli_tester_handle.join().unwrap()?;
99
100 let state_event = r56
101 .events
102 .iter()
103 .find(|e| e.kind().eq(&STATE_KIND))
104 .context("state event not created")?;
105
106 assert_eq!(
107 state_event
108 .tags
109 .iter()
110 .filter(|t| t.kind().to_string().as_str().ne("d"))
111 .map(|t| t.as_vec().to_vec())
112 .collect::<HashSet<Vec<String>>>(),
113 HashSet::from([
114 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
115 vec!["refs/heads/main".to_string(), commit_id,],
116 ]),
117 );
118
119 // wait for bigger timestamp
120 std::thread::sleep(std::time::Duration::from_millis(1000));
121
122 Ok((state_event.clone(), source_git_repo))
123}
124
54mod initially_runs_fetch { 125mod initially_runs_fetch {
55 126
56 use super::*; 127 use super::*;
@@ -523,7 +594,103 @@ mod push {
523 594
524 #[tokio::test] 595 #[tokio::test]
525 #[serial] 596 #[serial]
526 async fn sate_event_reflects_git_server_state() -> Result<()> { 597 async fn state_event_reflects_git_server_state() -> Result<()> {
598 async_run_test().await
599 }
600 }
601 }
602 mod existing_state_event {
603 use super::*;
604
605 mod state_on_git_server_published_in_nostr_state_event {
606
607 use super::*;
608
609 async fn async_run_test() -> Result<()> {
610 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
611
612 let git_repo = prep_git_repo()?;
613
614 std::fs::write(git_repo.dir.join("new.md"), "some content")?;
615 let main_commit_id = git_repo.stage_and_commit("new.md")?;
616 git_repo.create_branch("vnext")?;
617 git_repo.checkout("vnext")?;
618 std::fs::write(git_repo.dir.join("more.md"), "some content")?;
619 let vnext_commit_id = git_repo.stage_and_commit("more.md")?;
620
621 let events = vec![
622 generate_test_key_1_metadata_event("fred"),
623 generate_test_key_1_relay_list_event(),
624 generate_repo_ref_event_with_git_server(
625 source_git_repo.dir.to_str().unwrap(),
626 ),
627 state_event.clone(),
628 ];
629
630 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
631 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
632 Relay::new(8051, None, None),
633 Relay::new(8052, None, None),
634 Relay::new(8053, None, None),
635 Relay::new(8055, None, None),
636 Relay::new(8056, None, None),
637 Relay::new(8057, None, None),
638 );
639 r51.events = events.clone();
640 r55.events = events;
641
642 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
643 let mut p = cli_tester_after_fetch(&git_repo)?;
644 p.send_line("push refs/heads/main:refs/heads/main")?;
645 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
646 p.send_line("")?;
647 p.expect("ok refs/heads/main\r\n")?;
648 p.expect("ok refs/heads/vnext\r\n")?;
649 p.expect("\r\n")?;
650 p.exit()?;
651 for p in [51, 52, 53, 55, 56, 57] {
652 relay::shutdown_relay(8000 + p)?;
653 }
654 Ok(())
655 });
656 // launch relays
657 let _ = join!(
658 r51.listen_until_close(),
659 r52.listen_until_close(),
660 r53.listen_until_close(),
661 r55.listen_until_close(),
662 r56.listen_until_close(),
663 r57.listen_until_close(),
664 );
665
666 cli_tester_handle.join().unwrap()?;
667
668 let state_event = r56
669 .events
670 .iter()
671 .find(|e| e.kind().eq(&STATE_KIND))
672 .context("state event not created")?;
673
674 // println!("{:#?}", state_event);
675 assert_eq!(
676 state_event
677 .tags
678 .iter()
679 .filter(|t| t.kind().to_string().as_str().ne("d"))
680 .map(|t| t.as_vec().to_vec())
681 .collect::<HashSet<Vec<String>>>(),
682 HashSet::from([
683 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
684 vec!["refs/heads/main".to_string(), main_commit_id.to_string()],
685 vec!["refs/heads/vnext".to_string(), vnext_commit_id.to_string()],
686 ]),
687 );
688 Ok(())
689 }
690
691 #[tokio::test]
692 #[serial]
693 async fn state_event_reflects_updated_with_pushed_changes() -> Result<()> {
527 async_run_test().await 694 async_run_test().await
528 } 695 }
529 } 696 }