upleb.uk

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

summaryrefslogtreecommitdiff
path: root/tests/nip34_announcements.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-11-19 11:55:32 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-11-19 15:43:29 +0000
commitfa065ad128882755f2a988d6203b59a2ab5e38ff (patch)
treee8326de70a6e6ea56b5bf4250e0a00a3cda4afed /tests/nip34_announcements.rs
parent98c6fa4bfa897ff0b8f9c95ea698d4d065b5e9f3 (diff)
add landing page and nostr-relay-builder relay on same port
Diffstat (limited to 'tests/nip34_announcements.rs')
-rw-r--r--tests/nip34_announcements.rs111
1 files changed, 49 insertions, 62 deletions
diff --git a/tests/nip34_announcements.rs b/tests/nip34_announcements.rs
index 6e83bb6..535425d 100644
--- a/tests/nip34_announcements.rs
+++ b/tests/nip34_announcements.rs
@@ -36,7 +36,9 @@ const KIND_REPOSITORY_ANNOUNCEMENT: u16 = 30617;
36const KIND_REPOSITORY_STATE: u16 = 30618; 36const KIND_REPOSITORY_STATE: u16 = 30618;
37 37
38/// Helper to connect to a test relay 38/// Helper to connect to a test relay
39async fn connect_to_relay(url: &str) -> tokio_tungstenite::WebSocketStream<tokio_tungstenite::MaybeTlsStream<tokio::net::TcpStream>> { 39async fn connect_to_relay(
40 url: &str,
41) -> tokio_tungstenite::WebSocketStream<tokio_tungstenite::MaybeTlsStream<tokio::net::TcpStream>> {
40 let (ws, _) = connect_async(url) 42 let (ws, _) = connect_async(url)
41 .await 43 .await
42 .expect("Failed to connect to relay"); 44 .expect("Failed to connect to relay");
@@ -54,10 +56,7 @@ fn create_announcement(
54 let mut tags = vec![Tag::custom(TagKind::d(), vec![identifier.to_string()])]; 56 let mut tags = vec![Tag::custom(TagKind::d(), vec![identifier.to_string()])];
55 57
56 for url in clone_urls { 58 for url in clone_urls {
57 tags.push(Tag::custom( 59 tags.push(Tag::custom(TagKind::Clone, vec![url]));
58 TagKind::Clone,
59 vec![url],
60 ));
61 } 60 }
62 61
63 for relay in relays { 62 for relay in relays {
@@ -94,10 +93,10 @@ fn create_state(keys: &Keys, identifier: &str, branches: Vec<(&str, &str)>) -> n
94#[tokio::test] 93#[tokio::test]
95async fn test_relay_accepts_connection() { 94async fn test_relay_accepts_connection() {
96 let relay = TestRelay::start().await; 95 let relay = TestRelay::start().await;
97 96
98 // Try to connect 97 // Try to connect
99 let ws = connect_to_relay(relay.url()).await; 98 let ws = connect_to_relay(relay.url()).await;
100 99
101 drop(ws); // Clean disconnect 100 drop(ws); // Clean disconnect
102} 101}
103 102
@@ -119,14 +118,14 @@ async fn test_accepts_valid_announcement() {
119 118
120 // Send event 119 // Send event
121 let event_msg = json!(["EVENT", event]); 120 let event_msg = json!(["EVENT", event]);
122 ws.send(Message::Text(event_msg.to_string())) 121 ws.send(Message::Text(event_msg.to_string().into()))
123 .await 122 .await
124 .expect("Failed to send event"); 123 .expect("Failed to send event");
125 124
126 // Read response 125 // Read response
127 if let Some(Ok(Message::Text(text))) = ws.next().await { 126 if let Some(Ok(Message::Text(text))) = ws.next().await {
128 let response: Value = serde_json::from_str(&text).expect("Failed to parse response"); 127 let response: Value = serde_json::from_str(&text).expect("Failed to parse response");
129 128
130 // Should be ["OK", event_id, true, ""] 129 // Should be ["OK", event_id, true, ""]
131 assert_eq!(response[0], "OK"); 130 assert_eq!(response[0], "OK");
132 assert_eq!(response[1], event.id.to_hex()); 131 assert_eq!(response[1], event.id.to_hex());
@@ -146,9 +145,7 @@ async fn test_rejects_announcement_without_clone() {
146 let relay = TestRelay::start().await; 145 let relay = TestRelay::start().await;
147 let keys = Keys::generate(); 146 let keys = Keys::generate();
148 147
149 let (mut ws, _) = connect_async(relay.url()) 148 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
150 .await
151 .expect("Failed to connect");
152 149
153 // Missing clone tag 150 // Missing clone tag
154 let event = create_announcement( 151 let event = create_announcement(
@@ -160,18 +157,18 @@ async fn test_rejects_announcement_without_clone() {
160 ); 157 );
161 158
162 let event_msg = json!(["EVENT", event]); 159 let event_msg = json!(["EVENT", event]);
163 ws.send(Message::Text(event_msg.to_string())) 160 ws.send(Message::Text(event_msg.to_string().into()))
164 .await 161 .await
165 .expect("Failed to send event"); 162 .expect("Failed to send event");
166 163
167 if let Some(Ok(Message::Text(text))) = ws.next().await { 164 if let Some(Ok(Message::Text(text))) = ws.next().await {
168 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 165 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
169 166
170 // Should be rejected 167 // Should be rejected
171 assert_eq!(response[0], "OK"); 168 assert_eq!(response[0], "OK");
172 assert_eq!(response[1], event.id.to_hex()); 169 assert_eq!(response[1], event.id.to_hex());
173 assert_eq!(response[2], false, "Event should be rejected"); 170 assert_eq!(response[2], false, "Event should be rejected");
174 171
175 let message = response[3].as_str().unwrap(); 172 let message = response[3].as_str().unwrap();
176 assert!( 173 assert!(
177 message.contains("clone") || message.contains("invalid"), 174 message.contains("clone") || message.contains("invalid"),
@@ -190,9 +187,7 @@ async fn test_rejects_announcement_without_relay() {
190 let relay = TestRelay::start().await; 187 let relay = TestRelay::start().await;
191 let keys = Keys::generate(); 188 let keys = Keys::generate();
192 189
193 let (mut ws, _) = connect_async(relay.url()) 190 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
194 .await
195 .expect("Failed to connect");
196 191
197 // Missing relay tag 192 // Missing relay tag
198 let event = create_announcement( 193 let event = create_announcement(
@@ -204,18 +199,18 @@ async fn test_rejects_announcement_without_relay() {
204 ); 199 );
205 200
206 let event_msg = json!(["EVENT", event]); 201 let event_msg = json!(["EVENT", event]);
207 ws.send(Message::Text(event_msg.to_string())) 202 ws.send(Message::Text(event_msg.to_string().into()))
208 .await 203 .await
209 .expect("Failed to send event"); 204 .expect("Failed to send event");
210 205
211 if let Some(Ok(Message::Text(text))) = ws.next().await { 206 if let Some(Ok(Message::Text(text))) = ws.next().await {
212 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 207 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
213 208
214 // Should be rejected 209 // Should be rejected
215 assert_eq!(response[0], "OK"); 210 assert_eq!(response[0], "OK");
216 assert_eq!(response[1], event.id.to_hex()); 211 assert_eq!(response[1], event.id.to_hex());
217 assert_eq!(response[2], false, "Event should be rejected"); 212 assert_eq!(response[2], false, "Event should be rejected");
218 213
219 let message = response[3].as_str().unwrap(); 214 let message = response[3].as_str().unwrap();
220 assert!( 215 assert!(
221 message.contains("relays") || message.contains("invalid"), 216 message.contains("relays") || message.contains("invalid"),
@@ -233,9 +228,7 @@ async fn test_rejects_announcement_for_other_service() {
233 let relay = TestRelay::start().await; 228 let relay = TestRelay::start().await;
234 let keys = Keys::generate(); 229 let keys = Keys::generate();
235 230
236 let (mut ws, _) = connect_async(relay.url()) 231 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
237 .await
238 .expect("Failed to connect");
239 232
240 // Lists different service 233 // Lists different service
241 let event = create_announcement( 234 let event = create_announcement(
@@ -247,13 +240,13 @@ async fn test_rejects_announcement_for_other_service() {
247 ); 240 );
248 241
249 let event_msg = json!(["EVENT", event]); 242 let event_msg = json!(["EVENT", event]);
250 ws.send(Message::Text(event_msg.to_string())) 243 ws.send(Message::Text(event_msg.to_string().into()))
251 .await 244 .await
252 .expect("Failed to send event"); 245 .expect("Failed to send event");
253 246
254 if let Some(Ok(Message::Text(text))) = ws.next().await { 247 if let Some(Ok(Message::Text(text))) = ws.next().await {
255 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 248 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
256 249
257 // Should be rejected 250 // Should be rejected
258 assert_eq!(response[0], "OK"); 251 assert_eq!(response[0], "OK");
259 assert_eq!(response[1], event.id.to_hex()); 252 assert_eq!(response[1], event.id.to_hex());
@@ -269,9 +262,7 @@ async fn test_accepts_valid_state() {
269 let relay = TestRelay::start().await; 262 let relay = TestRelay::start().await;
270 let keys = Keys::generate(); 263 let keys = Keys::generate();
271 264
272 let (mut ws, _) = connect_async(relay.url()) 265 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
273 .await
274 .expect("Failed to connect");
275 266
276 let event = create_state( 267 let event = create_state(
277 &keys, 268 &keys,
@@ -280,13 +271,13 @@ async fn test_accepts_valid_state() {
280 ); 271 );
281 272
282 let event_msg = json!(["EVENT", event]); 273 let event_msg = json!(["EVENT", event]);
283 ws.send(Message::Text(event_msg.to_string())) 274 ws.send(Message::Text(event_msg.to_string().into()))
284 .await 275 .await
285 .expect("Failed to send event"); 276 .expect("Failed to send event");
286 277
287 if let Some(Ok(Message::Text(text))) = ws.next().await { 278 if let Some(Ok(Message::Text(text))) = ws.next().await {
288 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 279 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
289 280
290 // Should be accepted 281 // Should be accepted
291 assert_eq!(response[0], "OK"); 282 assert_eq!(response[0], "OK");
292 assert_eq!(response[1], event.id.to_hex()); 283 assert_eq!(response[1], event.id.to_hex());
@@ -302,9 +293,7 @@ async fn test_accepts_state_with_multiple_branches() {
302 let relay = TestRelay::start().await; 293 let relay = TestRelay::start().await;
303 let keys = Keys::generate(); 294 let keys = Keys::generate();
304 295
305 let (mut ws, _) = connect_async(relay.url()) 296 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
306 .await
307 .expect("Failed to connect");
308 297
309 let event = create_state( 298 let event = create_state(
310 &keys, 299 &keys,
@@ -317,13 +306,13 @@ async fn test_accepts_state_with_multiple_branches() {
317 ); 306 );
318 307
319 let event_msg = json!(["EVENT", event]); 308 let event_msg = json!(["EVENT", event]);
320 ws.send(Message::Text(event_msg.to_string())) 309 ws.send(Message::Text(event_msg.to_string().into()))
321 .await 310 .await
322 .expect("Failed to send event"); 311 .expect("Failed to send event");
323 312
324 if let Some(Ok(Message::Text(text))) = ws.next().await { 313 if let Some(Ok(Message::Text(text))) = ws.next().await {
325 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 314 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
326 315
327 assert_eq!(response[0], "OK"); 316 assert_eq!(response[0], "OK");
328 assert_eq!(response[2], true, "State event should be accepted"); 317 assert_eq!(response[2], true, "State event should be accepted");
329 } else { 318 } else {
@@ -337,9 +326,7 @@ async fn test_rejects_state_without_identifier() {
337 let relay = TestRelay::start().await; 326 let relay = TestRelay::start().await;
338 let keys = Keys::generate(); 327 let keys = Keys::generate();
339 328
340 let (mut ws, _) = connect_async(relay.url()) 329 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
341 .await
342 .expect("Failed to connect");
343 330
344 // Create state without identifier 331 // Create state without identifier
345 let event = EventBuilder::new(Kind::from(KIND_REPOSITORY_STATE), "") 332 let event = EventBuilder::new(Kind::from(KIND_REPOSITORY_STATE), "")
@@ -347,18 +334,18 @@ async fn test_rejects_state_without_identifier() {
347 .expect("Failed to sign event"); 334 .expect("Failed to sign event");
348 335
349 let event_msg = json!(["EVENT", event]); 336 let event_msg = json!(["EVENT", event]);
350 ws.send(Message::Text(event_msg.to_string())) 337 ws.send(Message::Text(event_msg.to_string().into()))
351 .await 338 .await
352 .expect("Failed to send event"); 339 .expect("Failed to send event");
353 340
354 if let Some(Ok(Message::Text(text))) = ws.next().await { 341 if let Some(Ok(Message::Text(text))) = ws.next().await {
355 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 342 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
356 343
357 // Should be rejected 344 // Should be rejected
358 assert_eq!(response[0], "OK"); 345 assert_eq!(response[0], "OK");
359 assert_eq!(response[1], event.id.to_hex()); 346 assert_eq!(response[1], event.id.to_hex());
360 assert_eq!(response[2], false, "Event should be rejected"); 347 assert_eq!(response[2], false, "Event should be rejected");
361 348
362 let message = response[3].as_str().unwrap(); 349 let message = response[3].as_str().unwrap();
363 assert!( 350 assert!(
364 message.contains("identifier") || message.contains("invalid"), 351 message.contains("identifier") || message.contains("invalid"),
@@ -376,21 +363,22 @@ async fn test_query_announcements() {
376 let relay = TestRelay::start().await; 363 let relay = TestRelay::start().await;
377 let keys = Keys::generate(); 364 let keys = Keys::generate();
378 365
379 let (mut ws, _) = connect_async(relay.url()) 366 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
380 .await
381 .expect("Failed to connect");
382 367
383 // Send an announcement 368 // Send an announcement
384 let event = create_announcement( 369 let event = create_announcement(
385 &keys, 370 &keys,
386 &relay.domain(), 371 &relay.domain(),
387 "query-test-repo", 372 "query-test-repo",
388 vec![format!("https://{}/alice/query-test-repo.git", relay.domain())], 373 vec![format!(
374 "https://{}/alice/query-test-repo.git",
375 relay.domain()
376 )],
389 vec![format!("wss://{}", relay.domain())], 377 vec![format!("wss://{}", relay.domain())],
390 ); 378 );
391 379
392 let event_msg = json!(["EVENT", event]); 380 let event_msg = json!(["EVENT", event]);
393 ws.send(Message::Text(event_msg.to_string())) 381 ws.send(Message::Text(event_msg.to_string().into()))
394 .await 382 .await
395 .expect("Failed to send event"); 383 .expect("Failed to send event");
396 384
@@ -409,7 +397,7 @@ async fn test_query_announcements() {
409 } 397 }
410 ]); 398 ]);
411 399
412 ws.send(Message::Text(req.to_string())) 400 ws.send(Message::Text(req.to_string().into()))
413 .await 401 .await
414 .expect("Failed to send REQ"); 402 .expect("Failed to send REQ");
415 403
@@ -420,7 +408,7 @@ async fn test_query_announcements() {
420 for _ in 0..10 { 408 for _ in 0..10 {
421 if let Some(Ok(Message::Text(text))) = ws.next().await { 409 if let Some(Ok(Message::Text(text))) = ws.next().await {
422 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 410 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
423 411
424 if response[0] == "EVENT" { 412 if response[0] == "EVENT" {
425 assert_eq!(response[1], "test-sub"); 413 assert_eq!(response[1], "test-sub");
426 found_event = true; 414 found_event = true;
@@ -442,9 +430,7 @@ async fn test_query_states() {
442 let relay = TestRelay::start().await; 430 let relay = TestRelay::start().await;
443 let keys = Keys::generate(); 431 let keys = Keys::generate();
444 432
445 let (mut ws, _) = connect_async(relay.url()) 433 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
446 .await
447 .expect("Failed to connect");
448 434
449 // Send a state event 435 // Send a state event
450 let event = create_state( 436 let event = create_state(
@@ -454,7 +440,7 @@ async fn test_query_states() {
454 ); 440 );
455 441
456 let event_msg = json!(["EVENT", event]); 442 let event_msg = json!(["EVENT", event]);
457 ws.send(Message::Text(event_msg.to_string())) 443 ws.send(Message::Text(event_msg.to_string().into()))
458 .await 444 .await
459 .expect("Failed to send event"); 445 .expect("Failed to send event");
460 446
@@ -473,7 +459,7 @@ async fn test_query_states() {
473 } 459 }
474 ]); 460 ]);
475 461
476 ws.send(Message::Text(req.to_string())) 462 ws.send(Message::Text(req.to_string().into()))
477 .await 463 .await
478 .expect("Failed to send REQ"); 464 .expect("Failed to send REQ");
479 465
@@ -484,7 +470,7 @@ async fn test_query_states() {
484 for _ in 0..10 { 470 for _ in 0..10 {
485 if let Some(Ok(Message::Text(text))) = ws.next().await { 471 if let Some(Ok(Message::Text(text))) = ws.next().await {
486 let response: Value = serde_json::from_str(&text).expect("Failed to parse"); 472 let response: Value = serde_json::from_str(&text).expect("Failed to parse");
487 473
488 if response[0] == "EVENT" { 474 if response[0] == "EVENT" {
489 assert_eq!(response[1], "test-sub"); 475 assert_eq!(response[1], "test-sub");
490 found_event = true; 476 found_event = true;
@@ -506,21 +492,22 @@ async fn test_duplicate_announcement() {
506 let relay = TestRelay::start().await; 492 let relay = TestRelay::start().await;
507 let keys = Keys::generate(); 493 let keys = Keys::generate();
508 494
509 let (mut ws, _) = connect_async(relay.url()) 495 let (mut ws, _) = connect_async(relay.url()).await.expect("Failed to connect");
510 .await
511 .expect("Failed to connect");
512 496
513 let event = create_announcement( 497 let event = create_announcement(
514 &keys, 498 &keys,
515 &relay.domain(), 499 &relay.domain(),
516 "duplicate-test", 500 "duplicate-test",
517 vec![format!("https://{}/alice/duplicate-test.git", relay.domain())], 501 vec![format!(
502 "https://{}/alice/duplicate-test.git",
503 relay.domain()
504 )],
518 vec![format!("wss://{}", relay.domain())], 505 vec![format!("wss://{}", relay.domain())],
519 ); 506 );
520 507
521 // Send first time 508 // Send first time
522 let event_msg = json!(["EVENT", event]); 509 let event_msg = json!(["EVENT", event]);
523 ws.send(Message::Text(event_msg.to_string())) 510 ws.send(Message::Text(event_msg.to_string().into()))
524 .await 511 .await
525 .expect("Failed to send event"); 512 .expect("Failed to send event");
526 513
@@ -531,14 +518,14 @@ async fn test_duplicate_announcement() {
531 518
532 // Send second time (duplicate) 519 // Send second time (duplicate)
533 let event_msg = json!(["EVENT", event]); 520 let event_msg = json!(["EVENT", event]);
534 ws.send(Message::Text(event_msg.to_string())) 521 ws.send(Message::Text(event_msg.to_string().into()))
535 .await 522 .await
536 .expect("Failed to send event"); 523 .expect("Failed to send event");
537 524
538 if let Some(Ok(Message::Text(text))) = ws.next().await { 525 if let Some(Ok(Message::Text(text))) = ws.next().await {
539 let response2: Value = serde_json::from_str(&text).expect("Failed to parse"); 526 let response2: Value = serde_json::from_str(&text).expect("Failed to parse");
540 assert_eq!(response2[2], true, "Duplicate should be acknowledged"); 527 assert_eq!(response2[2], true, "Duplicate should be acknowledged");
541 528
542 let message = response2[3].as_str().unwrap(); 529 let message = response2[3].as_str().unwrap();
543 assert!( 530 assert!(
544 message.contains("duplicate") || message.is_empty(), 531 message.contains("duplicate") || message.is_empty(),