diff options
| -rw-r--r-- | tests/nip77_negentropy.rs | 69 |
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] |
| 39 | async fn test_nip77_negentropy_sync_finds_events() { | 45 | async 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 | ||