upleb.uk

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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/nip77_negentropy.rs69
1 files changed, 40 insertions, 29 deletions
diff --git a/tests/nip77_negentropy.rs b/tests/nip77_negentropy.rs
index fccfe67..29e62d8 100644
--- a/tests/nip77_negentropy.rs
+++ b/tests/nip77_negentropy.rs
@@ -35,56 +35,67 @@ use common::{sync_helpers::*, TestRelay};
35/// 3. Create a fresh client with empty local database 35/// 3. Create a fresh client with empty local database
36/// 4. Call client.sync() to perform negentropy reconciliation 36/// 4. Call client.sync() to perform negentropy reconciliation
37/// 5. Verify reconciliation found the events on the relay 37/// 5. Verify reconciliation found the events on the relay
38///
39/// Uses kind 10317 (GitUserGraspList) events which are unconditionally accepted
40/// by the relay without requiring a promoted repository. This avoids the
41/// announcements-purgatory system which holds kind 30617 events until git data
42/// arrives, meaning announcement events are not stored in the DB and would not
43/// appear in negentropy sync results.
38#[tokio::test] 44#[tokio::test]
39async fn test_nip77_negentropy_sync_finds_events() { 45async fn test_nip77_negentropy_sync_finds_events() {
40 // 1. Start relay 46 // 1. Start relay
41 let relay = TestRelay::start().await; 47 let relay = TestRelay::start().await;
42 println!("Relay started at {}", relay.url()); 48 println!("Relay started at {}", relay.url());
43 49
44 // 2. Create keys and publish events 50 // 2. Create two distinct keypairs - each publishes a kind 10317 event.
45 let keys = Keys::generate(); 51 // Kind 10317 (GitUserGraspList) is unconditionally accepted and stored in
46 52 // the relay DB, unlike kind 30617 announcements which go to purgatory.
47 // Create a repository announcement that will be accepted by the relay 53 let keys1 = Keys::generate();
48 let announcement = create_repo_announcement(&keys, &[&relay.domain()], "test-repo-nip77"); 54 let keys2 = Keys::generate();
49 let event1_id = announcement.id; 55
56 // Build kind 10317 events (replaceable per pubkey, so two keys = two stored events)
57 let event1 = EventBuilder::new(Kind::GitUserGraspList, "")
58 .tags(vec![Tag::identifier("grasp-list-nip77-a")])
59 .sign_with_keys(&keys1)
60 .expect("Failed to sign event 1");
61 let event1_id = event1.id;
50 println!( 62 println!(
51 "Created event 1: {} (kind {})", 63 "Created event 1: {} (kind {})",
52 event1_id, 64 event1_id,
53 announcement.kind.as_u16() 65 event1.kind.as_u16()
54 ); 66 );
55 67
56 // Create a second event (issue referencing the repo) 68 let event2 = EventBuilder::new(Kind::GitUserGraspList, "")
57 let repo_coord = format!( 69 .tags(vec![Tag::identifier("grasp-list-nip77-b")])
58 "{}:{}:{}", 70 .sign_with_keys(&keys2)
59 Kind::GitRepoAnnouncement.as_u16(), 71 .expect("Failed to sign event 2");
60 keys.public_key().to_hex(), 72 let event2_id = event2.id;
61 "test-repo-nip77"
62 );
63 let issue = build_layer2_issue_event(&keys, &repo_coord, "Test issue for NIP-77")
64 .expect("Failed to build issue event");
65 let event2_id = issue.id;
66 println!( 73 println!(
67 "Created event 2: {} (kind {})", 74 "Created event 2: {} (kind {})",
68 event2_id, 75 event2_id,
69 issue.kind.as_u16() 76 event2.kind.as_u16()
70 ); 77 );
71 78
72 // 3. Send events to relay using TestClient 79 // 3. Send events to relay using TestClient
73 let publish_client = TestClient::new(relay.url(), keys.clone()) 80 let publish_client1 = TestClient::new(relay.url(), keys1.clone())
74 .await 81 .await
75 .expect("Failed to connect to relay"); 82 .expect("Failed to connect to relay");
83 publish_client1
84 .send_event(&event1)
85 .await
86 .expect("Failed to send event 1");
87 publish_client1.disconnect().await;
76 88
77 publish_client 89 let publish_client2 = TestClient::new(relay.url(), keys2.clone())
78 .send_event(&announcement)
79 .await 90 .await
80 .expect("Failed to send announcement"); 91 .expect("Failed to connect to relay");
81 publish_client 92 publish_client2
82 .send_event(&issue) 93 .send_event(&event2)
83 .await 94 .await
84 .expect("Failed to send issue"); 95 .expect("Failed to send event 2");
85 println!("Events published to relay"); 96 publish_client2.disconnect().await;
86 97
87 publish_client.disconnect().await; 98 println!("Events published to relay");
88 99
89 // 4. Wait a moment for events to be stored 100 // 4. Wait a moment for events to be stored
90 tokio::time::sleep(Duration::from_millis(200)).await; 101 tokio::time::sleep(Duration::from_millis(200)).await;
@@ -104,8 +115,8 @@ async fn test_nip77_negentropy_sync_finds_events() {
104 115
105 // 6. Perform negentropy sync with filter matching our events 116 // 6. Perform negentropy sync with filter matching our events
106 let filter = Filter::new() 117 let filter = Filter::new()
107 .author(keys.public_key()) 118 .authors(vec![keys1.public_key(), keys2.public_key()])
108 .kinds(vec![Kind::GitRepoAnnouncement, Kind::GitIssue]); 119 .kind(Kind::GitUserGraspList);
109 120
110 println!("Starting negentropy sync with filter: {:?}", filter); 121 println!("Starting negentropy sync with filter: {:?}", filter);
111 122