diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-04-22 07:26:15 +0100 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-05-07 09:10:33 +0100 |
| commit | 10498b953d36304b441fcb162155c2487046206f (patch) | |
| tree | cea78cfbb83dbbe5ddae12ffde18df94ae7d6746 /tests/send.rs | |
| parent | c4853f69dc25408ff70cccbe923d2cd400385fc2 (diff) | |
feat(send): `in-reply-to` tags npubs and events
in addition to being used to create a new proposal revision,
in-reply-to can now be used to reference other events and npubs.
for example an issues or kind 1 threads where the proposal is relevant
the proposal will only be marked as a revision if the first parameter is
a reference to an existing proposal root
Diffstat (limited to 'tests/send.rs')
| -rw-r--r-- | tests/send.rs | 274 |
1 files changed, 267 insertions, 7 deletions
diff --git a/tests/send.rs b/tests/send.rs index a38546a..8474c19 100644 --- a/tests/send.rs +++ b/tests/send.rs | |||
| @@ -1284,9 +1284,14 @@ mod when_range_ommited_prompts_for_selection_defaulting_ahead_of_main { | |||
| 1284 | } | 1284 | } |
| 1285 | } | 1285 | } |
| 1286 | 1286 | ||
| 1287 | mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specified { | 1287 | mod root_proposal_specified_using_in_reply_to_with_range_of_head_2_and_cover_letter_details_specified { |
| 1288 | |||
| 1289 | use nostr::ToBech32; | ||
| 1290 | |||
| 1288 | use super::*; | 1291 | use super::*; |
| 1292 | |||
| 1289 | fn cli_tester_create_proposal(git_repo: &GitTestRepo) -> CliTester { | 1293 | fn cli_tester_create_proposal(git_repo: &GitTestRepo) -> CliTester { |
| 1294 | let proposal_root_bech32 = get_pretend_proposal_root_event().id.to_bech32().unwrap(); | ||
| 1290 | let args = vec![ | 1295 | let args = vec![ |
| 1291 | "--nsec", | 1296 | "--nsec", |
| 1292 | TEST_KEY_1_NSEC, | 1297 | TEST_KEY_1_NSEC, |
| @@ -1296,7 +1301,8 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1296 | "send", | 1301 | "send", |
| 1297 | "HEAD~2", | 1302 | "HEAD~2", |
| 1298 | "--in-reply-to", | 1303 | "--in-reply-to", |
| 1299 | "nevent1qqsypm62fzw7qynvlc4gjl3tr0jw4vmh659nvr2cc5qyhdg92a5yy0qzypumuen7l8wthtz45p3ftn58pvrs9xlumvkuu2xet8egzkcklqtesxygzam", | 1304 | &proposal_root_bech32, |
| 1305 | // "nevent1qqsged665nx6zz36puey9hzf6ds4n5ctxxzm7c6pfnmvu9l4c9988vgzyr6nuj7d02wdauzfeajx043c5yepjk9v6wm3avycy07kltdsy0tksh0zxyx", | ||
| 1300 | "--title", | 1306 | "--title", |
| 1301 | "exampletitle", | 1307 | "exampletitle", |
| 1302 | "--description", | 1308 | "--description", |
| @@ -1305,7 +1311,12 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1305 | CliTester::new_from_dir(&git_repo.dir, args) | 1311 | CliTester::new_from_dir(&git_repo.dir, args) |
| 1306 | } | 1312 | } |
| 1307 | fn expect_msgs_first(p: &mut CliTester, include_cover_letter: bool) -> Result<()> { | 1313 | fn expect_msgs_first(p: &mut CliTester, include_cover_letter: bool) -> Result<()> { |
| 1308 | p.expect("creating proposal revision for: nevent1qqsypm62fzw7qynvlc4gjl3tr0jw4vmh659nvr2cc5qyhdg92a5yy0qzypumuen7l8wthtz45p3ftn58pvrs9xlumvkuu2xet8egzkcklqtesxygzam\r\n")?; | 1314 | let proposal_root_bech32 = get_pretend_proposal_root_event().id.to_bech32().unwrap(); |
| 1315 | p.expect(format!( | ||
| 1316 | "creating proposal revision for: {}\r\n", | ||
| 1317 | proposal_root_bech32, | ||
| 1318 | ))?; | ||
| 1319 | // p.expect("creating proposal revision for: nevent1qqsged665nx6zz36puey9hzf6ds4n5ctxxzm7c6pfnmvu9l4c9988vgzyr6nuj7d02wdauzfeajx043c5yepjk9v6wm3avycy07kltdsy0tksh0zxyx\r\n")?; | ||
| 1309 | p.expect("creating proposal from 2 commits:\r\n")?; | 1320 | p.expect("creating proposal from 2 commits:\r\n")?; |
| 1310 | p.expect("fe973a8 add t4.md\r\n")?; | 1321 | p.expect("fe973a8 add t4.md\r\n")?; |
| 1311 | p.expect("232efb3 add t3.md\r\n")?; | 1322 | p.expect("232efb3 add t3.md\r\n")?; |
| @@ -1343,6 +1354,7 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1343 | &vec![ | 1354 | &vec![ |
| 1344 | generate_test_key_1_metadata_event("fred"), | 1355 | generate_test_key_1_metadata_event("fred"), |
| 1345 | generate_test_key_1_relay_list_event(), | 1356 | generate_test_key_1_relay_list_event(), |
| 1357 | get_pretend_proposal_root_event(), | ||
| 1346 | ], | 1358 | ], |
| 1347 | )?; | 1359 | )?; |
| 1348 | Ok(()) | 1360 | Ok(()) |
| @@ -1357,7 +1369,7 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1357 | relay.respond_events( | 1369 | relay.respond_events( |
| 1358 | client_id, | 1370 | client_id, |
| 1359 | &subscription_id, | 1371 | &subscription_id, |
| 1360 | &vec![generate_repo_ref_event()], | 1372 | &vec![generate_repo_ref_event(), get_pretend_proposal_root_event()], |
| 1361 | )?; | 1373 | )?; |
| 1362 | Ok(()) | 1374 | Ok(()) |
| 1363 | }), | 1375 | }), |
| @@ -1405,6 +1417,7 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1405 | &vec![ | 1417 | &vec![ |
| 1406 | generate_test_key_1_metadata_event("fred"), | 1418 | generate_test_key_1_metadata_event("fred"), |
| 1407 | generate_test_key_1_relay_list_event(), | 1419 | generate_test_key_1_relay_list_event(), |
| 1420 | get_pretend_proposal_root_event(), | ||
| 1408 | ], | 1421 | ], |
| 1409 | )?; | 1422 | )?; |
| 1410 | Ok(()) | 1423 | Ok(()) |
| @@ -1419,7 +1432,7 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1419 | relay.respond_events( | 1432 | relay.respond_events( |
| 1420 | client_id, | 1433 | client_id, |
| 1421 | &subscription_id, | 1434 | &subscription_id, |
| 1422 | &vec![generate_repo_ref_event()], | 1435 | &vec![generate_repo_ref_event(), get_pretend_proposal_root_event()], |
| 1423 | )?; | 1436 | )?; |
| 1424 | Ok(()) | 1437 | Ok(()) |
| 1425 | }), | 1438 | }), |
| @@ -1430,7 +1443,6 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1430 | // // check relay had the right number of events | 1443 | // // check relay had the right number of events |
| 1431 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | 1444 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { |
| 1432 | let mut p = cli_tester_create_proposal(&git_repo); | 1445 | let mut p = cli_tester_create_proposal(&git_repo); |
| 1433 | |||
| 1434 | expect_msgs_first(&mut p, true)?; | 1446 | expect_msgs_first(&mut p, true)?; |
| 1435 | relay::expect_send_with_progress( | 1447 | relay::expect_send_with_progress( |
| 1436 | &mut p, | 1448 | &mut p, |
| @@ -1516,7 +1528,7 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1516 | .unwrap() | 1528 | .unwrap() |
| 1517 | .as_vec()[1], | 1529 | .as_vec()[1], |
| 1518 | // id of state nevent | 1530 | // id of state nevent |
| 1519 | "40ef4a489de0126cfe2a897e2b1be4eab377d50b360d58c5004bb5055768423c", | 1531 | "8cb75aa4cda10a3a0f3242dc49d36159d30b3185bf63414cf6ce17f5c14a73b1", |
| 1520 | ); | 1532 | ); |
| 1521 | } | 1533 | } |
| 1522 | Ok(()) | 1534 | Ok(()) |
| @@ -1552,3 +1564,251 @@ mod in_reply_to_specified_with_range_of_head_2_and_cover_letter_details_specifie | |||
| 1552 | Ok(()) | 1564 | Ok(()) |
| 1553 | } | 1565 | } |
| 1554 | } | 1566 | } |
| 1567 | |||
| 1568 | mod in_reply_to_mentions_issue { | ||
| 1569 | use nostr::ToBech32; | ||
| 1570 | |||
| 1571 | use super::*; | ||
| 1572 | pub fn get_pretend_issue_event() -> nostr::Event { | ||
| 1573 | serde_json::from_str(r#"{"created_at":1709286372,"content":"please provide feedback\nthis is an example ngit issue to demonstrate gitworkshop.dev.\n\nplease provide feedback with in reply to this issue or by creating a new issue.","tags":[["r","26689f97810fc656c7134c76e2a37d33b2e40ce7"],["a","30617:a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d:ngit","wss://relay.damus.io","root"],["p","a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d"]],"kind":1621,"pubkey":"a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d","id":"e944765d625ae7323d080da0df069c726a0e5490a17b452f854d85e18f781588","sig":"a1af9e89a35f1f7ef93e3de33986bd86cb7c4d7d9abb233c0c6405f32b5788171e47f84551afe8515b3107d12f03472721ea784b8791ff3f25e66a3169a54c20"}"#).unwrap() | ||
| 1574 | } | ||
| 1575 | |||
| 1576 | fn cli_tester_create_proposal(git_repo: &GitTestRepo) -> CliTester { | ||
| 1577 | let proposal_root_bech32 = get_pretend_issue_event().id.to_bech32().unwrap(); | ||
| 1578 | let args = vec![ | ||
| 1579 | "--nsec", | ||
| 1580 | TEST_KEY_1_NSEC, | ||
| 1581 | "--password", | ||
| 1582 | TEST_PASSWORD, | ||
| 1583 | "--disable-cli-spinners", | ||
| 1584 | "send", | ||
| 1585 | "HEAD~2", | ||
| 1586 | "--in-reply-to", | ||
| 1587 | &proposal_root_bech32, | ||
| 1588 | // "note1a9z8vhtzttnny0ggpksd7p5uwf4qu4ys59a52tu9fkz7rrmczkyqc46ngg", | ||
| 1589 | "--title", | ||
| 1590 | "exampletitle", | ||
| 1591 | "--description", | ||
| 1592 | "exampledescription", | ||
| 1593 | ]; | ||
| 1594 | CliTester::new_from_dir(&git_repo.dir, args) | ||
| 1595 | } | ||
| 1596 | |||
| 1597 | async fn prep_run_create_proposal() -> Result<( | ||
| 1598 | Relay<'static>, | ||
| 1599 | Relay<'static>, | ||
| 1600 | Relay<'static>, | ||
| 1601 | Relay<'static>, | ||
| 1602 | Relay<'static>, | ||
| 1603 | )> { | ||
| 1604 | let git_repo = prep_git_repo()?; | ||
| 1605 | // fallback (51,52) user write (53, 55) repo (55, 56) | ||
| 1606 | let (mut r51, mut r52, mut r53, mut r55, mut r56) = ( | ||
| 1607 | Relay::new( | ||
| 1608 | 8051, | ||
| 1609 | None, | ||
| 1610 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 1611 | relay.respond_events( | ||
| 1612 | client_id, | ||
| 1613 | &subscription_id, | ||
| 1614 | &vec![ | ||
| 1615 | generate_test_key_1_metadata_event("fred"), | ||
| 1616 | generate_test_key_1_relay_list_event(), | ||
| 1617 | get_pretend_issue_event(), | ||
| 1618 | ], | ||
| 1619 | )?; | ||
| 1620 | Ok(()) | ||
| 1621 | }), | ||
| 1622 | ), | ||
| 1623 | Relay::new(8052, None, None), | ||
| 1624 | Relay::new(8053, None, None), | ||
| 1625 | Relay::new( | ||
| 1626 | 8055, | ||
| 1627 | None, | ||
| 1628 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 1629 | relay.respond_events( | ||
| 1630 | client_id, | ||
| 1631 | &subscription_id, | ||
| 1632 | &vec![generate_repo_ref_event(), get_pretend_issue_event()], | ||
| 1633 | )?; | ||
| 1634 | Ok(()) | ||
| 1635 | }), | ||
| 1636 | ), | ||
| 1637 | Relay::new(8056, None, None), | ||
| 1638 | ); | ||
| 1639 | |||
| 1640 | // // check relay had the right number of events | ||
| 1641 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | ||
| 1642 | let mut p = cli_tester_create_proposal(&git_repo); | ||
| 1643 | p.expect_end_eventually()?; | ||
| 1644 | for p in [51, 52, 53, 55, 56] { | ||
| 1645 | relay::shutdown_relay(8000 + p)?; | ||
| 1646 | } | ||
| 1647 | Ok(()) | ||
| 1648 | }); | ||
| 1649 | |||
| 1650 | // launch relay | ||
| 1651 | let _ = join!( | ||
| 1652 | r51.listen_until_close(), | ||
| 1653 | r52.listen_until_close(), | ||
| 1654 | r53.listen_until_close(), | ||
| 1655 | r55.listen_until_close(), | ||
| 1656 | r56.listen_until_close(), | ||
| 1657 | ); | ||
| 1658 | cli_tester_handle.join().unwrap()?; | ||
| 1659 | Ok((r51, r52, r53, r55, r56)) | ||
| 1660 | } | ||
| 1661 | |||
| 1662 | #[tokio::test] | ||
| 1663 | #[serial] | ||
| 1664 | async fn issue_event_mentioned_in_tagged_cover_letter() -> Result<()> { | ||
| 1665 | let (_, _, r53, r55, r56) = prep_run_create_proposal().await?; | ||
| 1666 | for relay in [&r53, &r55, &r56] { | ||
| 1667 | let cover_letter_event: &nostr::Event = | ||
| 1668 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); | ||
| 1669 | assert!(cover_letter_event.iter_tags().any(|t| { | ||
| 1670 | t.as_vec()[0].eq("e") | ||
| 1671 | && t.as_vec()[1].eq(&get_pretend_issue_event().id.to_hex()) | ||
| 1672 | && t.as_vec()[3].eq(&"mention") | ||
| 1673 | })); | ||
| 1674 | } | ||
| 1675 | Ok(()) | ||
| 1676 | } | ||
| 1677 | |||
| 1678 | #[tokio::test] | ||
| 1679 | #[serial] | ||
| 1680 | async fn isnt_tagged_as_revision() -> Result<()> { | ||
| 1681 | let (_, _, r53, r55, r56) = prep_run_create_proposal().await?; | ||
| 1682 | for relay in [&r53, &r55, &r56] { | ||
| 1683 | let cover_letter_event: &nostr::Event = | ||
| 1684 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); | ||
| 1685 | assert!( | ||
| 1686 | !cover_letter_event | ||
| 1687 | .iter_tags() | ||
| 1688 | .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"revision-root") }) | ||
| 1689 | ); | ||
| 1690 | } | ||
| 1691 | Ok(()) | ||
| 1692 | } | ||
| 1693 | } | ||
| 1694 | mod in_reply_to_mentions_npub_and_nprofile_which_get_mentioned_in_proposal_root { | ||
| 1695 | use nostr::JsonUtil; | ||
| 1696 | |||
| 1697 | use super::*; | ||
| 1698 | |||
| 1699 | fn cli_tester_create_proposal(git_repo: &GitTestRepo) -> CliTester { | ||
| 1700 | let args = vec![ | ||
| 1701 | "--nsec", | ||
| 1702 | TEST_KEY_1_NSEC, | ||
| 1703 | "--password", | ||
| 1704 | TEST_PASSWORD, | ||
| 1705 | "--disable-cli-spinners", | ||
| 1706 | "send", | ||
| 1707 | "HEAD~2", | ||
| 1708 | "--in-reply-to", | ||
| 1709 | // nsec1q3c5xnsm5m4wgsrhwnz04p0d5mevkryyggqgdpa9jwulpq9gldhswgtxvq | ||
| 1710 | "npub1knxeegzqg0xqflsryvg7l7x7nmpe7kd7pl7zazug0a7t99tdsphszuyapx", | ||
| 1711 | // nsec1nx5ulvcndhcuu8k6q8fenw50l6y75sec7pj8vr0r68l6a44w3lqspvj02k | ||
| 1712 | "nprofile1qqsvru3yqrec6dxjn06f8cjh79jcu9wyaxu4y6v47yzpsx7vjm4xcuc33z2n3", | ||
| 1713 | "--title", | ||
| 1714 | "exampletitle", | ||
| 1715 | "--description", | ||
| 1716 | "exampledescription", | ||
| 1717 | ]; | ||
| 1718 | CliTester::new_from_dir(&git_repo.dir, args) | ||
| 1719 | } | ||
| 1720 | |||
| 1721 | async fn prep_run_create_proposal() -> Result<( | ||
| 1722 | Relay<'static>, | ||
| 1723 | Relay<'static>, | ||
| 1724 | Relay<'static>, | ||
| 1725 | Relay<'static>, | ||
| 1726 | Relay<'static>, | ||
| 1727 | )> { | ||
| 1728 | let git_repo = prep_git_repo()?; | ||
| 1729 | // fallback (51,52) user write (53, 55) repo (55, 56) | ||
| 1730 | let (mut r51, mut r52, mut r53, mut r55, mut r56) = ( | ||
| 1731 | Relay::new( | ||
| 1732 | 8051, | ||
| 1733 | None, | ||
| 1734 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 1735 | relay.respond_events( | ||
| 1736 | client_id, | ||
| 1737 | &subscription_id, | ||
| 1738 | &vec![ | ||
| 1739 | generate_test_key_1_metadata_event("fred"), | ||
| 1740 | generate_test_key_1_relay_list_event(), | ||
| 1741 | ], | ||
| 1742 | )?; | ||
| 1743 | Ok(()) | ||
| 1744 | }), | ||
| 1745 | ), | ||
| 1746 | Relay::new(8052, None, None), | ||
| 1747 | Relay::new(8053, None, None), | ||
| 1748 | Relay::new( | ||
| 1749 | 8055, | ||
| 1750 | None, | ||
| 1751 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 1752 | relay.respond_events( | ||
| 1753 | client_id, | ||
| 1754 | &subscription_id, | ||
| 1755 | &vec![generate_repo_ref_event()], | ||
| 1756 | )?; | ||
| 1757 | Ok(()) | ||
| 1758 | }), | ||
| 1759 | ), | ||
| 1760 | Relay::new(8056, None, None), | ||
| 1761 | ); | ||
| 1762 | |||
| 1763 | // // check relay had the right number of events | ||
| 1764 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | ||
| 1765 | let mut p = cli_tester_create_proposal(&git_repo); | ||
| 1766 | p.expect_end_eventually()?; | ||
| 1767 | for p in [51, 52, 53, 55, 56] { | ||
| 1768 | relay::shutdown_relay(8000 + p)?; | ||
| 1769 | } | ||
| 1770 | Ok(()) | ||
| 1771 | }); | ||
| 1772 | |||
| 1773 | // launch relay | ||
| 1774 | let _ = join!( | ||
| 1775 | r51.listen_until_close(), | ||
| 1776 | r52.listen_until_close(), | ||
| 1777 | r53.listen_until_close(), | ||
| 1778 | r55.listen_until_close(), | ||
| 1779 | r56.listen_until_close(), | ||
| 1780 | ); | ||
| 1781 | cli_tester_handle.join().unwrap()?; | ||
| 1782 | Ok((r51, r52, r53, r55, r56)) | ||
| 1783 | } | ||
| 1784 | |||
| 1785 | #[tokio::test] | ||
| 1786 | #[serial] | ||
| 1787 | async fn npub_and_nprofile_mentioned_in_tagged_cover_letter() -> Result<()> { | ||
| 1788 | let (_, _, r53, r55, r56) = prep_run_create_proposal().await?; | ||
| 1789 | for relay in [&r53, &r55, &r56] { | ||
| 1790 | let cover_letter_event: &nostr::Event = | ||
| 1791 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); | ||
| 1792 | println!("{:?}", &cover_letter_event.as_json()); | ||
| 1793 | assert!(cover_letter_event.iter_tags().any(|t| { | ||
| 1794 | t.as_vec()[0].eq("p") | ||
| 1795 | && t.as_vec()[1].eq(&nostr::Keys::parse( | ||
| 1796 | "nsec1q3c5xnsm5m4wgsrhwnz04p0d5mevkryyggqgdpa9jwulpq9gldhswgtxvq", | ||
| 1797 | ) | ||
| 1798 | .unwrap() | ||
| 1799 | .public_key() | ||
| 1800 | .to_hex()) | ||
| 1801 | })); | ||
| 1802 | assert!(cover_letter_event.iter_tags().any(|t| { | ||
| 1803 | t.as_vec()[0].eq("p") | ||
| 1804 | && t.as_vec()[1].eq(&nostr::Keys::parse( | ||
| 1805 | "nsec1nx5ulvcndhcuu8k6q8fenw50l6y75sec7pj8vr0r68l6a44w3lqspvj02k", | ||
| 1806 | ) | ||
| 1807 | .unwrap() | ||
| 1808 | .public_key() | ||
| 1809 | .to_hex()) | ||
| 1810 | })); | ||
| 1811 | } | ||
| 1812 | Ok(()) | ||
| 1813 | } | ||
| 1814 | } | ||