diff options
Diffstat (limited to 'tests/git_remote_helper.rs')
| -rw-r--r-- | tests/git_remote_helper.rs | 152 |
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 | ||
| 3 | use anyhow::{Context, Result}; | 3 | use anyhow::{Context, Result}; |
| 4 | use futures::join; | 4 | use futures::join; |
| 5 | use git2::Oid; | ||
| 5 | use nostr::nips::nip01::Coordinate; | 6 | use nostr::nips::nip01::Coordinate; |
| 6 | use nostr_sdk::{secp256k1::rand, Kind, ToBech32}; | 7 | use nostr_sdk::{secp256k1::rand, Event, JsonUtil, Kind, ToBech32}; |
| 7 | use relay::Relay; | 8 | use relay::Relay; |
| 8 | use serial_test::serial; | 9 | use serial_test::serial; |
| 9 | use test_utils::{git::GitTestRepo, *}; | 10 | use 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 | ||
| 809 | mod push { | 813 | mod 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(); |