upleb.uk

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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2023-11-01 00:00:00 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2023-11-01 00:00:00 +0000
commit1b740dd135aafb52b94b710b3ae24e4aaaa99632 (patch)
tree986e4a3785e7899552cc616d46f0c3e3f480a992
parent47a5075b6385a8c0d28bae04c5862d93d0a6ffa6 (diff)
feat(prs-create) send to user relays
reuse client across login and send events
-rw-r--r--src/client.rs11
-rw-r--r--src/login.rs4
-rw-r--r--src/sub_commands/prs/create.rs55
-rw-r--r--tests/prs_create.rs214
4 files changed, 193 insertions, 91 deletions
diff --git a/src/client.rs b/src/client.rs
index 84bfb11..1037b1b 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -132,17 +132,6 @@ pub struct Params {
132 pub fallback_relays: Vec<String>, 132 pub fallback_relays: Vec<String>,
133} 133}
134 134
135impl Params {
136 pub fn with_keys(mut self, keys: nostr::Keys) -> Self {
137 self.keys = Some(keys);
138 self
139 }
140 pub fn with_fallback_relays(mut self, fallback_relays: Vec<String>) -> Self {
141 self.fallback_relays = fallback_relays;
142 self
143 }
144}
145
146fn get_dedup_events(relay_results: Vec<Result<Vec<nostr::Event>>>) -> Vec<Event> { 135fn get_dedup_events(relay_results: Vec<Result<Vec<nostr::Event>>>) -> Vec<Event> {
147 let mut dedup_events: Vec<Event> = vec![]; 136 let mut dedup_events: Vec<Event> = vec![];
148 for events in relay_results.into_iter().flatten() { 137 for events in relay_results.into_iter().flatten() {
diff --git a/src/login.rs b/src/login.rs
index e73373a..66fce55 100644
--- a/src/login.rs
+++ b/src/login.rs
@@ -21,7 +21,7 @@ pub async fn launch(
21 password: &Option<String>, 21 password: &Option<String>,
22 #[cfg(test)] client: Option<&MockConnect>, 22 #[cfg(test)] client: Option<&MockConnect>,
23 #[cfg(not(test))] client: Option<&Client>, 23 #[cfg(not(test))] client: Option<&Client>,
24) -> Result<nostr::Keys> { 24) -> Result<(nostr::Keys, UserRef)> {
25 // if nsec parameter 25 // if nsec parameter
26 let key = if let Some(nsec_unwrapped) = nsec { 26 let key = if let Some(nsec_unwrapped) = nsec {
27 // get key or fail without prompts 27 // get key or fail without prompts
@@ -87,7 +87,7 @@ pub async fn launch(
87 // print logged in 87 // print logged in
88 println!("logged in as {}", user_ref.metadata.name); 88 println!("logged in as {}", user_ref.metadata.name);
89 89
90 Ok(key) 90 Ok((key, user_ref.clone()))
91} 91}
92 92
93async fn get_user_details( 93async fn get_user_details(
diff --git a/src/sub_commands/prs/create.rs b/src/sub_commands/prs/create.rs
index 5986235..aad80f4 100644
--- a/src/sub_commands/prs/create.rs
+++ b/src/sub_commands/prs/create.rs
@@ -1,14 +1,17 @@
1use std::time::Duration; 1use std::time::Duration;
2 2
3use anyhow::{bail, Context, Result}; 3use anyhow::{bail, Context, Result};
4use console::Term;
5use futures::future::join_all; 4use futures::future::join_all;
6use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; 5use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
7use nostr::{prelude::sha1::Hash as Sha1Hash, EventBuilder, Marker, Tag, TagKind}; 6use nostr::{prelude::sha1::Hash as Sha1Hash, EventBuilder, Marker, Tag, TagKind};
8 7
8#[cfg(not(test))]
9use crate::client::Client;
10#[cfg(test)]
11use crate::client::MockConnect;
9use crate::{ 12use crate::{
10 cli_interactor::{Interactor, InteractorPrompt, PromptConfirmParms, PromptInputParms}, 13 cli_interactor::{Interactor, InteractorPrompt, PromptConfirmParms, PromptInputParms},
11 client::{Client, Connect, Params as ClientParams}, 14 client::Connect,
12 git::{Repo, RepoActions}, 15 git::{Repo, RepoActions},
13 login, Cli, 16 login, Cli,
14}; 17};
@@ -84,67 +87,47 @@ pub async fn launch(
84 .input(PromptInputParms::default().with_prompt("description (Optional)"))?, 87 .input(PromptInputParms::default().with_prompt("description (Optional)"))?,
85 }; 88 };
86 89
87 // create PR event 90 #[cfg(not(test))]
91 let mut client = Client::default();
92 #[cfg(test)]
93 let mut client = <MockConnect as std::default::Default>::default();
94
95 let (keys, user_ref) = login::launch(&cli_args.nsec, &cli_args.password, Some(&client)).await?;
88 96
89 // TODO add client here 97 client.set_keys(&keys).await;
90 let keys = login::launch(&cli_args.nsec, &cli_args.password, None).await?;
91 98
92 let events = 99 let events =
93 generate_pr_and_patch_events(&title, &description, &to_branch, &git_repo, &ahead, &keys)?; 100 generate_pr_and_patch_events(&title, &description, &to_branch, &git_repo, &ahead, &keys)?;
94 101
95 let my_write_relays: Vec<String> = vec![ 102 // TODO: get relays from repo event
96 "ws://localhost:8051".to_string(),
97 "ws://localhost:8052".to_string(),
98 ];
99
100 let repo_read_relays: Vec<String> = vec![ 103 let repo_read_relays: Vec<String> = vec![
101 "ws://localhost:8051".to_string(), 104 "ws://localhost:8055".to_string(),
102 "ws://localhost:8053".to_string(), 105 "ws://localhost:8056".to_string(),
103 ]; 106 ];
104 107
105 send_events( 108 send_events(
109 &client,
106 events, 110 events,
107 keys, 111 user_ref.relays.write(),
108 my_write_relays,
109 repo_read_relays, 112 repo_read_relays,
110 !cli_args.disable_cli_spinners, 113 !cli_args.disable_cli_spinners,
111 ) 114 )
112 .await?; 115 .await?;
113 // TODO check if there is already a similarly named PR 116 // TODO check if there is already a similarly named PR
114 117
115 // println!("failures:");
116 // println!("ws://relay.anon.io Error: Payment Required");
117
118 // should we have a relays in Repository event?
119 // yes
120 //
121
122 // TODO connect to relays and post
123
124 Ok(()) 118 Ok(())
125} 119}
126 120
127async fn send_events( 121async fn send_events(
122 #[cfg(test)] client: &crate::client::MockConnect,
123 #[cfg(not(test))] client: &Client,
128 events: Vec<nostr::Event>, 124 events: Vec<nostr::Event>,
129 keys: nostr::Keys,
130 my_write_relays: Vec<String>, 125 my_write_relays: Vec<String>,
131 repo_read_relays: Vec<String>, 126 repo_read_relays: Vec<String>,
132 animate: bool, 127 animate: bool,
133) -> Result<()> { 128) -> Result<()> {
134 let (_, _, _, all) = unique_and_duplicate_all(&my_write_relays, &repo_read_relays); 129 let (_, _, _, all) = unique_and_duplicate_all(&my_write_relays, &repo_read_relays);
135 130
136 let client = Client::new(
137 ClientParams::default()
138 .with_keys(keys)
139 // .with_fallback_relays(vec!["ws://localhost:8080".to_string()]),
140 .with_fallback_relays(all.iter().map(std::string::ToString::to_string).collect()),
141 );
142
143 let term = Term::stdout();
144 term.write_line("connecting to relays...")?;
145 client.connect().await?;
146 term.clear_last_lines(1)?;
147
148 println!( 131 println!(
149 "posting 1 pull request with {} commits...", 132 "posting 1 pull request with {} commits...",
150 events.len() - 1 133 events.len() - 1
diff --git a/tests/prs_create.rs b/tests/prs_create.rs
index 42f83b4..3a28016 100644
--- a/tests/prs_create.rs
+++ b/tests/prs_create.rs
@@ -169,6 +169,8 @@ mod sends_pr_and_2_patches_to_3_relays {
169 [ 169 [
170 "--nsec", 170 "--nsec",
171 TEST_KEY_1_NSEC, 171 TEST_KEY_1_NSEC,
172 "--password",
173 TEST_PASSWORD,
172 "--disable-cli-spinners", 174 "--disable-cli-spinners",
173 "prs", 175 "prs",
174 "create", 176 "create",
@@ -182,29 +184,49 @@ mod sends_pr_and_2_patches_to_3_relays {
182 184
183 fn expect_msgs_first(p: &mut CliTester) -> Result<()> { 185 fn expect_msgs_first(p: &mut CliTester) -> Result<()> {
184 p.expect("creating patch for 2 commits from 'head' that can be merged into 'main'\r\n")?; 186 p.expect("creating patch for 2 commits from 'head' that can be merged into 'main'\r\n")?;
185 p.expect( 187 p.expect("searching for your details...\r\n")?;
186 "logged in as npub175lyhnt6nn00qjw0v3navw9pxgv43txnku0tpxprl4h6mvpr6a5qlphudg\r\n",
187 )?;
188 p.expect("connecting to relays...\r\n")?;
189 p.expect("\r")?; 188 p.expect("\r")?;
189 p.expect("logged in as fred\r\n")?;
190 p.expect("posting 1 pull request with 2 commits...\r\n")?; 190 p.expect("posting 1 pull request with 2 commits...\r\n")?;
191 Ok(()) 191 Ok(())
192 } 192 }
193 193
194 async fn prep_run_create_pr() -> Result<(Relay<'static>, Relay<'static>, Relay<'static>)> { 194 async fn prep_run_create_pr() -> Result<(
195 Relay<'static>,
196 Relay<'static>,
197 Relay<'static>,
198 Relay<'static>,
199 Relay<'static>,
200 )> {
195 let git_repo = prep_git_repo()?; 201 let git_repo = prep_git_repo()?;
196 202 // fallback (51,52) user write (53, 55) repo (55, 56)
197 let (mut r51, mut r52, mut r53) = ( 203 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
198 Relay::new(8051, None, None), 204 Relay::new(
205 8051,
206 None,
207 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
208 relay.respond_events(
209 client_id,
210 &subscription_id,
211 &vec![
212 generate_test_key_1_metadata_event("fred"),
213 generate_test_key_1_relay_list_event(),
214 ],
215 )?;
216 Ok(())
217 }),
218 ),
199 Relay::new(8052, None, None), 219 Relay::new(8052, None, None),
200 Relay::new(8053, None, None), 220 Relay::new(8053, None, None),
221 Relay::new(8055, None, None),
222 Relay::new(8056, None, None),
201 ); 223 );
202 224
203 // // check relay had the right number of events 225 // // check relay had the right number of events
204 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 226 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
205 let mut p = cli_tester_create_pr(&git_repo); 227 let mut p = cli_tester_create_pr(&git_repo);
206 p.expect_end_eventually()?; 228 p.expect_end_eventually()?;
207 for p in [51, 52, 53] { 229 for p in [51, 52, 53, 55, 56] {
208 relay::shutdown_relay(8000 + p)?; 230 relay::shutdown_relay(8000 + p)?;
209 } 231 }
210 Ok(()) 232 Ok(())
@@ -215,16 +237,18 @@ mod sends_pr_and_2_patches_to_3_relays {
215 r51.listen_until_close(), 237 r51.listen_until_close(),
216 r52.listen_until_close(), 238 r52.listen_until_close(),
217 r53.listen_until_close(), 239 r53.listen_until_close(),
240 r55.listen_until_close(),
241 r56.listen_until_close(),
218 ); 242 );
219 cli_tester_handle.join().unwrap()?; 243 cli_tester_handle.join().unwrap()?;
220 Ok((r51, r52, r53)) 244 Ok((r51, r52, r53, r55, r56))
221 } 245 }
222 246
223 #[test] 247 #[test]
224 #[serial] 248 #[serial]
225 fn only_1_pr_kind_event_sent_to_each_relay() -> Result<()> { 249 fn only_1_pr_kind_event_sent_to_each_relay() -> Result<()> {
226 let (r51, r52, r53) = futures::executor::block_on(prep_run_create_pr())?; 250 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
227 for relay in [&r51, &r52, &r53] { 251 for relay in [&r53, &r55, &r56] {
228 assert_eq!( 252 assert_eq!(
229 relay 253 relay
230 .events 254 .events
@@ -239,9 +263,60 @@ mod sends_pr_and_2_patches_to_3_relays {
239 263
240 #[test] 264 #[test]
241 #[serial] 265 #[serial]
266 fn only_1_pr_kind_event_sent_to_user_relays() -> Result<()> {
267 let (_, _, r53, r55, _) = futures::executor::block_on(prep_run_create_pr())?;
268 for relay in [&r53, &r55] {
269 assert_eq!(
270 relay
271 .events
272 .iter()
273 .filter(|e| e.kind.as_u64().eq(&PR_KIND))
274 .count(),
275 1,
276 );
277 }
278 Ok(())
279 }
280
281 #[test]
282 #[serial]
283 fn only_1_pr_kind_event_sent_to_repo_relays() -> Result<()> {
284 let (_, _, _, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
285 for relay in [&r55, &r56] {
286 assert_eq!(
287 relay
288 .events
289 .iter()
290 .filter(|e| e.kind.as_u64().eq(&PR_KIND))
291 .count(),
292 1,
293 );
294 }
295 Ok(())
296 }
297
298 #[test]
299 #[serial]
300 fn pr_not_sent_to_fallback_relay() -> Result<()> {
301 let (r51, r52, _, _, _) = futures::executor::block_on(prep_run_create_pr())?;
302 for relay in [&r51, &r52] {
303 assert_eq!(
304 relay
305 .events
306 .iter()
307 .filter(|e| e.kind.as_u64().eq(&PR_KIND))
308 .count(),
309 0,
310 );
311 }
312 Ok(())
313 }
314
315 #[test]
316 #[serial]
242 fn only_2_patch_kind_events_sent_to_each_relay() -> Result<()> { 317 fn only_2_patch_kind_events_sent_to_each_relay() -> Result<()> {
243 let (r51, r52, r53) = futures::executor::block_on(prep_run_create_pr())?; 318 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
244 for relay in [&r51, &r52, &r53] { 319 for relay in [&r53, &r55, &r56] {
245 assert_eq!( 320 assert_eq!(
246 relay 321 relay
247 .events 322 .events
@@ -257,8 +332,8 @@ mod sends_pr_and_2_patches_to_3_relays {
257 #[test] 332 #[test]
258 #[serial] 333 #[serial]
259 fn patch_content_contains_patch_in_email_format() -> Result<()> { 334 fn patch_content_contains_patch_in_email_format() -> Result<()> {
260 let (r51, r52, r53) = futures::executor::block_on(prep_run_create_pr())?; 335 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
261 for relay in [&r51, &r52, &r53] { 336 for relay in [&r53, &r55, &r56] {
262 let patch_events: Vec<&nostr::Event> = relay 337 let patch_events: Vec<&nostr::Event> = relay
263 .events 338 .events
264 .iter() 339 .iter()
@@ -326,8 +401,8 @@ mod sends_pr_and_2_patches_to_3_relays {
326 #[test] 401 #[test]
327 #[serial] 402 #[serial]
328 fn pr_tags_repo_commit() -> Result<()> { 403 fn pr_tags_repo_commit() -> Result<()> {
329 let (r51, r52, r53) = futures::executor::block_on(prep_run_create_pr())?; 404 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
330 for relay in [&r51, &r52, &r53] { 405 for relay in [&r53, &r55, &r56] {
331 let pr_event: &nostr::Event = relay 406 let pr_event: &nostr::Event = relay
332 .events 407 .events
333 .iter() 408 .iter()
@@ -347,8 +422,8 @@ mod sends_pr_and_2_patches_to_3_relays {
347 #[test] 422 #[test]
348 #[serial] 423 #[serial]
349 fn patch_tags_correctly_formatted() -> Result<()> { 424 fn patch_tags_correctly_formatted() -> Result<()> {
350 let (r51, r52, r53) = futures::executor::block_on(prep_run_create_pr())?; 425 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
351 for relay in [&r51, &r52, &r53] { 426 for relay in [&r53, &r55, &r56] {
352 let patch_events: Vec<&nostr::Event> = relay 427 let patch_events: Vec<&nostr::Event> = relay
353 .events 428 .events
354 .iter() 429 .iter()
@@ -394,8 +469,8 @@ mod sends_pr_and_2_patches_to_3_relays {
394 #[test] 469 #[test]
395 #[serial] 470 #[serial]
396 fn patch_tags_pr_event_as_root() -> Result<()> { 471 fn patch_tags_pr_event_as_root() -> Result<()> {
397 let (r51, r52, r53) = futures::executor::block_on(prep_run_create_pr())?; 472 let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_create_pr())?;
398 for relay in [&r51, &r52, &r53] { 473 for relay in [&r53, &r55, &r56] {
399 let patch_events: Vec<&nostr::Event> = relay 474 let patch_events: Vec<&nostr::Event> = relay
400 .events 475 .events
401 .iter() 476 .iter()
@@ -428,10 +503,26 @@ mod sends_pr_and_2_patches_to_3_relays {
428 async fn run_test_async() -> Result<()> { 503 async fn run_test_async() -> Result<()> {
429 let git_repo = prep_git_repo()?; 504 let git_repo = prep_git_repo()?;
430 505
431 let (mut r51, mut r52, mut r53) = ( 506 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
432 Relay::new(8051, None, None), 507 Relay::new(
508 8051,
509 None,
510 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
511 relay.respond_events(
512 client_id,
513 &subscription_id,
514 &vec![
515 generate_test_key_1_metadata_event("fred"),
516 generate_test_key_1_relay_list_event(),
517 ],
518 )?;
519 Ok(())
520 }),
521 ),
433 Relay::new(8052, None, None), 522 Relay::new(8052, None, None),
434 Relay::new(8053, None, None), 523 Relay::new(8053, None, None),
524 Relay::new(8055, None, None),
525 Relay::new(8056, None, None),
435 ); 526 );
436 527
437 // // check relay had the right number of events 528 // // check relay had the right number of events
@@ -441,14 +532,14 @@ mod sends_pr_and_2_patches_to_3_relays {
441 relay::expect_send_with_progress( 532 relay::expect_send_with_progress(
442 &mut p, 533 &mut p,
443 vec![ 534 vec![
444 (" [my-relay] [repo-relay] ws://localhost:8051", true, ""), 535 (" [my-relay] [repo-relay] ws://localhost:8055", true, ""),
445 (" [my-relay] ws://localhost:8052", true, ""), 536 (" [my-relay] ws://localhost:8053", true, ""),
446 (" [repo-relay] ws://localhost:8053", true, ""), 537 (" [repo-relay] ws://localhost:8056", true, ""),
447 ], 538 ],
448 3, 539 3,
449 )?; 540 )?;
450 p.expect_end_with_whitespace()?; 541 p.expect_end_with_whitespace()?;
451 for p in [51, 52, 53] { 542 for p in [51, 52, 53, 55, 56] {
452 relay::shutdown_relay(8000 + p)?; 543 relay::shutdown_relay(8000 + p)?;
453 } 544 }
454 Ok(()) 545 Ok(())
@@ -459,6 +550,8 @@ mod sends_pr_and_2_patches_to_3_relays {
459 r51.listen_until_close(), 550 r51.listen_until_close(),
460 r52.listen_until_close(), 551 r52.listen_until_close(),
461 r53.listen_until_close(), 552 r53.listen_until_close(),
553 r55.listen_until_close(),
554 r56.listen_until_close(),
462 ); 555 );
463 cli_tester_handle.join().unwrap()?; 556 cli_tester_handle.join().unwrap()?;
464 Ok(()) 557 Ok(())
@@ -481,24 +574,40 @@ mod sends_pr_and_2_patches_to_3_relays {
481 async fn run_test_async() -> Result<()> { 574 async fn run_test_async() -> Result<()> {
482 let git_repo = prep_git_repo()?; 575 let git_repo = prep_git_repo()?;
483 576
484 let (mut r51, mut r52, mut r53) = ( 577 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
485 Relay::new(8051, None, None), 578 Relay::new(
579 8051,
580 None,
581 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
582 relay.respond_events(
583 client_id,
584 &subscription_id,
585 &vec![
586 generate_test_key_1_metadata_event("fred"),
587 generate_test_key_1_relay_list_event(),
588 ],
589 )?;
590 Ok(())
591 }),
592 ),
593 Relay::new(8052, None, None),
594 Relay::new(8053, None, None),
595 Relay::new(8055, None, None),
486 Relay::new( 596 Relay::new(
487 8052, 597 8056,
488 Some(&|relay, client_id, event| -> Result<()> { 598 Some(&|relay, client_id, event| -> Result<()> {
489 relay.respond_ok(client_id, event, Some("Payment Required"))?; 599 relay.respond_ok(client_id, event, Some("Payment Required"))?;
490 Ok(()) 600 Ok(())
491 }), 601 }),
492 None, 602 None,
493 ), 603 ),
494 Relay::new(8053, None, None),
495 ); 604 );
496 605
497 // // check relay had the right number of events 606 // // check relay had the right number of events
498 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 607 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
499 let mut p = cli_tester_create_pr(&git_repo); 608 let mut p = cli_tester_create_pr(&git_repo);
500 p.expect_end_eventually()?; 609 p.expect_end_eventually()?;
501 for p in [51, 52, 53] { 610 for p in [51, 52, 53, 55, 56] {
502 relay::shutdown_relay(8000 + p)?; 611 relay::shutdown_relay(8000 + p)?;
503 } 612 }
504 Ok(()) 613 Ok(())
@@ -509,10 +618,12 @@ mod sends_pr_and_2_patches_to_3_relays {
509 r51.listen_until_close(), 618 r51.listen_until_close(),
510 r52.listen_until_close(), 619 r52.listen_until_close(),
511 r53.listen_until_close(), 620 r53.listen_until_close(),
621 r55.listen_until_close(),
622 r56.listen_until_close(),
512 ); 623 );
513 cli_tester_handle.join().unwrap()?; 624 cli_tester_handle.join().unwrap()?;
514 625
515 assert_eq!(r52.events.len(), 1); 626 assert_eq!(r56.events.len(), 1);
516 627
517 Ok(()) 628 Ok(())
518 } 629 }
@@ -531,38 +642,55 @@ mod sends_pr_and_2_patches_to_3_relays {
531 async fn run_test_async() -> Result<(Relay<'static>, Relay<'static>, Relay<'static>)> { 642 async fn run_test_async() -> Result<(Relay<'static>, Relay<'static>, Relay<'static>)> {
532 let git_repo = prep_git_repo()?; 643 let git_repo = prep_git_repo()?;
533 644
534 let (mut r51, mut r52, mut r53) = ( 645 let (mut r51, mut r52, mut r53, mut r55, mut r56) = (
535 Relay::new(8051, None, None),
536 Relay::new( 646 Relay::new(
537 8052, 647 8051,
648 None,
649 Some(&|relay, client_id, subscription_id, _| -> Result<()> {
650 relay.respond_events(
651 client_id,
652 &subscription_id,
653 &vec![
654 generate_test_key_1_metadata_event("fred"),
655 generate_test_key_1_relay_list_event(),
656 ],
657 )?;
658 Ok(())
659 }),
660 ),
661 Relay::new(8052, None, None),
662 Relay::new(8053, None, None),
663 Relay::new(8055, None, None),
664 Relay::new(
665 8056,
538 Some(&|relay, client_id, event| -> Result<()> { 666 Some(&|relay, client_id, event| -> Result<()> {
539 relay.respond_ok(client_id, event, Some("Payment Required"))?; 667 relay.respond_ok(client_id, event, Some("Payment Required"))?;
540 Ok(()) 668 Ok(())
541 }), 669 }),
542 None, 670 None,
543 ), 671 ),
544 Relay::new(8053, None, None),
545 ); 672 );
546 673
547 // // check relay had the right number of events 674 // // check relay had the right number of events
548 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 675 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
549 let mut p = cli_tester_create_pr(&git_repo); 676 let mut p = cli_tester_create_pr(&git_repo);
550 expect_msgs_first(&mut p)?; 677 expect_msgs_first(&mut p)?;
678 // p.expect_end_with("bla")?;
551 relay::expect_send_with_progress( 679 relay::expect_send_with_progress(
552 &mut p, 680 &mut p,
553 vec![ 681 vec![
554 (" [my-relay] [repo-relay] ws://localhost:8051", true, ""), 682 (" [my-relay] [repo-relay] ws://localhost:8055", true, ""),
683 (" [my-relay] ws://localhost:8053", true, ""),
555 ( 684 (
556 " [my-relay] ws://localhost:8052", 685 " [repo-relay] ws://localhost:8056",
557 false, 686 false,
558 "error: Payment Required", 687 "error: Payment Required",
559 ), 688 ),
560 (" [repo-relay] ws://localhost:8053", true, ""),
561 ], 689 ],
562 3, 690 3,
563 )?; 691 )?;
564 p.expect_end_with_whitespace()?; 692 p.expect_end_with_whitespace()?;
565 for p in [51, 52, 53] { 693 for p in [51, 52, 53, 55, 56] {
566 relay::shutdown_relay(8000 + p)?; 694 relay::shutdown_relay(8000 + p)?;
567 } 695 }
568 696
@@ -574,6 +702,8 @@ mod sends_pr_and_2_patches_to_3_relays {
574 r51.listen_until_close(), 702 r51.listen_until_close(),
575 r52.listen_until_close(), 703 r52.listen_until_close(),
576 r53.listen_until_close(), 704 r53.listen_until_close(),
705 r55.listen_until_close(),
706 r56.listen_until_close(),
577 ); 707 );
578 cli_tester_handle.join().unwrap()?; 708 cli_tester_handle.join().unwrap()?;
579 Ok((r51, r52, r53)) 709 Ok((r51, r52, r53))