diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/git_remote_helper.rs | 169 |
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 | ||
| 54 | async 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 | |||
| 54 | mod initially_runs_fetch { | 125 | mod 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 | } |