diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2023-11-01 00:00:00 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2023-11-01 00:00:00 +0000 |
| commit | 1b740dd135aafb52b94b710b3ae24e4aaaa99632 (patch) | |
| tree | 986e4a3785e7899552cc616d46f0c3e3f480a992 | |
| parent | 47a5075b6385a8c0d28bae04c5862d93d0a6ffa6 (diff) | |
feat(prs-create) send to user relays
reuse client across login and send events
| -rw-r--r-- | src/client.rs | 11 | ||||
| -rw-r--r-- | src/login.rs | 4 | ||||
| -rw-r--r-- | src/sub_commands/prs/create.rs | 55 | ||||
| -rw-r--r-- | tests/prs_create.rs | 214 |
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 | ||
| 135 | impl 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 | |||
| 146 | fn get_dedup_events(relay_results: Vec<Result<Vec<nostr::Event>>>) -> Vec<Event> { | 135 | fn 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 | ||
| 93 | async fn get_user_details( | 93 | async 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 @@ | |||
| 1 | use std::time::Duration; | 1 | use std::time::Duration; |
| 2 | 2 | ||
| 3 | use anyhow::{bail, Context, Result}; | 3 | use anyhow::{bail, Context, Result}; |
| 4 | use console::Term; | ||
| 5 | use futures::future::join_all; | 4 | use futures::future::join_all; |
| 6 | use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; | 5 | use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; |
| 7 | use nostr::{prelude::sha1::Hash as Sha1Hash, EventBuilder, Marker, Tag, TagKind}; | 6 | use nostr::{prelude::sha1::Hash as Sha1Hash, EventBuilder, Marker, Tag, TagKind}; |
| 8 | 7 | ||
| 8 | #[cfg(not(test))] | ||
| 9 | use crate::client::Client; | ||
| 10 | #[cfg(test)] | ||
| 11 | use crate::client::MockConnect; | ||
| 9 | use crate::{ | 12 | use 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 | ||
| 127 | async fn send_events( | 121 | async 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)) |