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.rs152
1 files changed, 149 insertions, 3 deletions
diff --git a/tests/git_remote_helper.rs b/tests/git_remote_helper.rs
index 17138e4..98637e8 100644
--- a/tests/git_remote_helper.rs
+++ b/tests/git_remote_helper.rs
@@ -2,8 +2,9 @@ use std::{collections::HashSet, env::current_dir};
2 2
3use anyhow::{Context, Result}; 3use anyhow::{Context, Result};
4use futures::join; 4use futures::join;
5use git2::Oid;
5use nostr::nips::nip01::Coordinate; 6use nostr::nips::nip01::Coordinate;
6use nostr_sdk::{secp256k1::rand, Kind, ToBech32}; 7use nostr_sdk::{secp256k1::rand, Event, JsonUtil, Kind, ToBech32};
7use relay::Relay; 8use relay::Relay;
8use serial_test::serial; 9use serial_test::serial;
9use test_utils::{git::GitTestRepo, *}; 10use test_utils::{git::GitTestRepo, *};
@@ -41,6 +42,9 @@ fn set_git_nostr_login_config(test_repo: &GitTestRepo) -> Result<()> {
41 .context("cannot open git config")?; 42 .context("cannot open git config")?;
42 config.set_str("nostr.nsec", TEST_KEY_2_NSEC)?; 43 config.set_str("nostr.nsec", TEST_KEY_2_NSEC)?;
43 config.set_str("nostr.npub", TEST_KEY_2_NPUB)?; 44 config.set_str("nostr.npub", TEST_KEY_2_NPUB)?;
45 config.set_str("user.name", "test name")?;
46 config.set_str("user.email", "test@test.com")?;
47 config.set_bool("commit.gpgSign", false)?;
44 Ok(()) 48 Ok(())
45} 49}
46 50
@@ -808,8 +812,6 @@ mod fetch {
808 812
809mod push { 813mod push {
810 814
811 use nostr_sdk::Event;
812
813 use super::*; 815 use super::*;
814 816
815 #[tokio::test] 817 #[tokio::test]
@@ -1712,6 +1714,150 @@ mod push {
1712 1714
1713 #[tokio::test] 1715 #[tokio::test]
1714 #[serial] 1716 #[serial]
1717 async fn proposal_merge_commit_pushed_to_main_leads_to_status_event_issued() -> Result<()> {
1718 //
1719 let (events, source_git_repo) = prep_source_repo_and_events_including_proposals().await?;
1720 let source_path = source_git_repo.dir.to_str().unwrap().to_string();
1721
1722 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1723 Relay::new(8051, None, None),
1724 Relay::new(8052, None, None),
1725 Relay::new(8053, None, None),
1726 Relay::new(8055, None, None),
1727 Relay::new(8056, None, None),
1728 Relay::new(8057, None, None),
1729 );
1730 r51.events = events.clone();
1731 r55.events = events.clone();
1732
1733 let before = r55.events.iter().cloned().collect::<HashSet<Event>>();
1734
1735 let cli_tester_handle = std::thread::spawn(move || -> Result<(String, Oid)> {
1736 let branch_name = get_proposal_branch_name_from_events(&events, FEATURE_BRANCH_NAME_1)?;
1737
1738 let git_repo = clone_git_repo_with_nostr_url()?;
1739 git_repo.checkout_remote_branch(&branch_name)?;
1740 git_repo.checkout("refs/heads/main")?;
1741
1742 std::fs::write(git_repo.dir.join("new.md"), "some content")?;
1743 git_repo.stage_and_commit("new.md")?;
1744
1745 CliTester::new_git_with_remote_helper_from_dir(
1746 &git_repo.dir,
1747 ["merge", &branch_name, "-m", "proposal merge commit message"],
1748 )
1749 .expect_end_eventually_and_print()?;
1750
1751 let oid = git_repo.get_tip_of_local_branch("main")?;
1752
1753 let mut p = CliTester::new_git_with_remote_helper_from_dir(&git_repo.dir, ["push"]);
1754 cli_expect_nostr_fetch(&mut p)?;
1755 p.expect(format!("fetching refs list: {}...\r\n\r", source_path).as_str())?;
1756 p.expect(format!("To {}\r\n", get_nostr_remote_url()?).as_str())?;
1757 let output = p.expect_end_eventually()?;
1758
1759 for p in [51, 52, 53, 55, 56, 57] {
1760 relay::shutdown_relay(8000 + p)?;
1761 }
1762
1763 Ok((output, oid))
1764 });
1765 // launch relays
1766 let _ = join!(
1767 r51.listen_until_close(),
1768 r52.listen_until_close(),
1769 r53.listen_until_close(),
1770 r55.listen_until_close(),
1771 r56.listen_until_close(),
1772 r57.listen_until_close(),
1773 );
1774
1775 let (output, oid) = cli_tester_handle.join().unwrap()?;
1776
1777 assert_eq!(
1778 output,
1779 format!(" 431b84e..{} main -> main\r\n", &oid.to_string()[..7])
1780 );
1781
1782 let new_events = r55
1783 .events
1784 .iter()
1785 .cloned()
1786 .collect::<HashSet<Event>>()
1787 .difference(&before)
1788 .cloned()
1789 .collect::<Vec<Event>>();
1790
1791 assert_eq!(new_events.len(), 2, "{new_events:?}");
1792
1793 let proposal = r55
1794 .events
1795 .iter()
1796 .find(|e| {
1797 e.iter_tags()
1798 .find(|t| t.as_vec()[0].eq("branch-name"))
1799 .is_some_and(|t| t.as_vec()[1].eq(FEATURE_BRANCH_NAME_1))
1800 })
1801 .unwrap();
1802
1803 let merge_status = new_events
1804 .iter()
1805 .find(|e| e.kind().eq(&Kind::GitStatusApplied))
1806 .unwrap();
1807
1808 assert_eq!(
1809 oid.to_string(),
1810 merge_status
1811 .tags
1812 .iter()
1813 .find(|t| t.as_vec()[0].eq("merge-commit-id"))
1814 .unwrap()
1815 .as_vec()[1],
1816 "status sets correct merge-commit-id tag"
1817 );
1818
1819 let proposal_tip = r55
1820 .events
1821 .iter()
1822 .filter(|e| {
1823 e.iter_tags()
1824 .any(|t| t.as_vec()[1].eq(&proposal.id().to_string()))
1825 && e.kind().eq(&Kind::GitPatch)
1826 })
1827 .last()
1828 .unwrap();
1829
1830 assert_eq!(
1831 proposal_tip.id().to_string(),
1832 merge_status
1833 .tags
1834 .iter()
1835 .find(|t| t.as_vec().len().eq(&4) && t.as_vec()[3].eq("mention"))
1836 .unwrap()
1837 .as_vec()[1],
1838 "status mentions proposal tip event \r\nmerge status:\r\n{}\r\nproposal tip:\r\n{}",
1839 merge_status.as_json(),
1840 proposal_tip.as_json(),
1841 );
1842
1843 assert_eq!(
1844 proposal.id().to_string(),
1845 merge_status
1846 .tags
1847 .iter()
1848 .find(|t| t.is_root())
1849 .unwrap()
1850 .as_vec()[1],
1851 "status tags proposal id as root \r\nmerge status:\r\n{}\r\nproposal:\r\n{}",
1852 merge_status.as_json(),
1853 proposal.as_json(),
1854 );
1855
1856 Ok(())
1857 }
1858
1859 #[tokio::test]
1860 #[serial]
1715 async fn push_2_commits_to_existing_proposal() -> Result<()> { 1861 async fn push_2_commits_to_existing_proposal() -> Result<()> {
1716 let (events, source_git_repo) = prep_source_repo_and_events_including_proposals().await?; 1862 let (events, source_git_repo) = prep_source_repo_and_events_including_proposals().await?;
1717 let source_path = source_git_repo.dir.to_str().unwrap().to_string(); 1863 let source_path = source_git_repo.dir.to_str().unwrap().to_string();