diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-02-13 06:27:34 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-02-13 06:27:34 +0000 |
| commit | 3112576195aef212622d27ad9164336796c1953e (patch) | |
| tree | 0e897bcb8309c2d4c8f33d7c1590c2dcc0577508 /tests | |
| parent | 9cd3e43b899b23b7f6e75276fa3d19bf9550f8fd (diff) | |
feat(prs-create)!: pr to nip34-like cover letter
up the pr event type to a nip34-like cover letter format
this sets the building blocks in place to enable simplier clients to
use the 'cover letter' feature in `git format-patch` to create the
experience as a pr event
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/prs_create.rs | 219 |
1 files changed, 123 insertions, 96 deletions
diff --git a/tests/prs_create.rs b/tests/prs_create.rs index 8db45d7..6272ccd 100644 --- a/tests/prs_create.rs +++ b/tests/prs_create.rs | |||
| @@ -141,6 +141,15 @@ fn cli_message_creating_patches() -> Result<()> { | |||
| 141 | Ok(()) | 141 | Ok(()) |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | fn is_cover_letter(event: &nostr::Event) -> bool { | ||
| 145 | event.kind.as_u64().eq(&PR_KIND) && event.iter_tags().any(|t| t.as_vec()[1].eq("cover-letter")) | ||
| 146 | } | ||
| 147 | |||
| 148 | fn is_patch(event: &nostr::Event) -> bool { | ||
| 149 | event.kind.as_u64().eq(&PATCH_KIND) | ||
| 150 | && !event.iter_tags().any(|t| t.as_vec()[1].eq("cover-letter")) | ||
| 151 | } | ||
| 152 | |||
| 144 | mod sends_pr_and_2_patches_to_3_relays { | 153 | mod sends_pr_and_2_patches_to_3_relays { |
| 145 | use futures::join; | 154 | use futures::join; |
| 146 | use test_utils::relay::Relay; | 155 | use test_utils::relay::Relay; |
| @@ -258,11 +267,7 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 258 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 267 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 259 | for relay in [&r53, &r55, &r56] { | 268 | for relay in [&r53, &r55, &r56] { |
| 260 | assert_eq!( | 269 | assert_eq!( |
| 261 | relay | 270 | relay.events.iter().filter(|e| is_cover_letter(e)).count(), |
| 262 | .events | ||
| 263 | .iter() | ||
| 264 | .filter(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 265 | .count(), | ||
| 266 | 1, | 271 | 1, |
| 267 | ); | 272 | ); |
| 268 | } | 273 | } |
| @@ -275,11 +280,7 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 275 | let (_, _, r53, r55, _) = prep_run_create_pr().await?; | 280 | let (_, _, r53, r55, _) = prep_run_create_pr().await?; |
| 276 | for relay in [&r53, &r55] { | 281 | for relay in [&r53, &r55] { |
| 277 | assert_eq!( | 282 | assert_eq!( |
| 278 | relay | 283 | relay.events.iter().filter(|e| is_cover_letter(e)).count(), |
| 279 | .events | ||
| 280 | .iter() | ||
| 281 | .filter(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 282 | .count(), | ||
| 283 | 1, | 284 | 1, |
| 284 | ); | 285 | ); |
| 285 | } | 286 | } |
| @@ -292,12 +293,8 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 292 | let (_, _, _, r55, r56) = prep_run_create_pr().await?; | 293 | let (_, _, _, r55, r56) = prep_run_create_pr().await?; |
| 293 | for relay in [&r55, &r56] { | 294 | for relay in [&r55, &r56] { |
| 294 | assert_eq!( | 295 | assert_eq!( |
| 295 | relay | 296 | relay.events.iter().filter(|e| is_cover_letter(e)).count(), |
| 296 | .events | 297 | 1 |
| 297 | .iter() | ||
| 298 | .filter(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 299 | .count(), | ||
| 300 | 1, | ||
| 301 | ); | 298 | ); |
| 302 | } | 299 | } |
| 303 | Ok(()) | 300 | Ok(()) |
| @@ -309,11 +306,7 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 309 | let (r51, r52, _, _, _) = prep_run_create_pr().await?; | 306 | let (r51, r52, _, _, _) = prep_run_create_pr().await?; |
| 310 | for relay in [&r51, &r52] { | 307 | for relay in [&r51, &r52] { |
| 311 | assert_eq!( | 308 | assert_eq!( |
| 312 | relay | 309 | relay.events.iter().filter(|e| is_cover_letter(e)).count(), |
| 313 | .events | ||
| 314 | .iter() | ||
| 315 | .filter(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 316 | .count(), | ||
| 317 | 0, | 310 | 0, |
| 318 | ); | 311 | ); |
| 319 | } | 312 | } |
| @@ -325,14 +318,7 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 325 | async fn only_2_patch_kind_events_sent_to_each_relay() -> Result<()> { | 318 | async fn only_2_patch_kind_events_sent_to_each_relay() -> Result<()> { |
| 326 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 319 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 327 | for relay in [&r53, &r55, &r56] { | 320 | for relay in [&r53, &r55, &r56] { |
| 328 | assert_eq!( | 321 | assert_eq!(relay.events.iter().filter(|e| is_patch(e)).count(), 2,); |
| 329 | relay | ||
| 330 | .events | ||
| 331 | .iter() | ||
| 332 | .filter(|e| e.kind.as_u64().eq(&PATCH_KIND)) | ||
| 333 | .count(), | ||
| 334 | 2, | ||
| 335 | ); | ||
| 336 | } | 322 | } |
| 337 | Ok(()) | 323 | Ok(()) |
| 338 | } | 324 | } |
| @@ -343,11 +329,8 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 343 | { | 329 | { |
| 344 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 330 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 345 | for relay in [&r53, &r55, &r56] { | 331 | for relay in [&r53, &r55, &r56] { |
| 346 | let patch_events: Vec<&nostr::Event> = relay | 332 | let patch_events: Vec<&nostr::Event> = |
| 347 | .events | 333 | relay.events.iter().filter(|e| is_patch(e)).collect(); |
| 348 | .iter() | ||
| 349 | .filter(|e| e.kind.as_u64().eq(&PATCH_KIND)) | ||
| 350 | .collect(); | ||
| 351 | 334 | ||
| 352 | assert_eq!( | 335 | assert_eq!( |
| 353 | patch_events[0].content, | 336 | patch_events[0].content, |
| @@ -410,21 +393,19 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 410 | 393 | ||
| 411 | #[tokio::test] | 394 | #[tokio::test] |
| 412 | #[serial] | 395 | #[serial] |
| 413 | async fn pr_tags_repo_commit() -> Result<()> { | 396 | async fn root_commit_as_r() -> Result<()> { |
| 414 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 397 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 415 | let root_commit = GitTestRepo::default().initial_commit()?; | ||
| 416 | |||
| 417 | for relay in [&r53, &r55, &r56] { | 398 | for relay in [&r53, &r55, &r56] { |
| 418 | let pr_event: &nostr::Event = relay | 399 | let pr_event: &nostr::Event = |
| 419 | .events | 400 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); |
| 420 | .iter() | ||
| 421 | .find(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 422 | .unwrap(); | ||
| 423 | 401 | ||
| 424 | // root commit 'r' tag | 402 | assert_eq!( |
| 425 | assert!( | 403 | pr_event |
| 426 | pr_event.tags.iter().any(|t| t.as_vec()[0].eq("r") | 404 | .iter_tags() |
| 427 | && t.as_vec()[1].eq(&format!("r-{}", root_commit))) | 405 | .find(|t| t.as_vec()[0].eq("r")) |
| 406 | .unwrap() | ||
| 407 | .as_vec()[1], | ||
| 408 | "9ee507fc4357d7ee16a5d8901bedcd103f23c17d" | ||
| 428 | ); | 409 | ); |
| 429 | } | 410 | } |
| 430 | Ok(()) | 411 | Ok(()) |
| @@ -432,23 +413,55 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 432 | 413 | ||
| 433 | #[tokio::test] | 414 | #[tokio::test] |
| 434 | #[serial] | 415 | #[serial] |
| 435 | async fn pr_tags_title_as_name() -> Result<()> { | 416 | async fn a_tag_for_repo_event() -> Result<()> { |
| 436 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 417 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 437 | for relay in [&r53, &r55, &r56] { | 418 | for relay in [&r53, &r55, &r56] { |
| 438 | let pr_event: &nostr::Event = relay | 419 | let pr_event: &nostr::Event = |
| 439 | .events | 420 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); |
| 440 | .iter() | 421 | assert!(pr_event.iter_tags().any(|t| t.as_vec()[0].eq("a") |
| 441 | .find(|e| e.kind.as_u64().eq(&PR_KIND)) | 422 | && t.as_vec()[1].eq(&format!( |
| 442 | .unwrap(); | 423 | "{REPOSITORY_KIND}:{TEST_KEY_1_PUBKEY_HEX}:{}", |
| 424 | generate_repo_ref_event().identifier().unwrap() | ||
| 425 | )))); | ||
| 426 | } | ||
| 427 | Ok(()) | ||
| 428 | } | ||
| 443 | 429 | ||
| 444 | assert_eq!( | 430 | #[tokio::test] |
| 431 | #[serial] | ||
| 432 | async fn p_tags_for_maintainers() -> Result<()> { | ||
| 433 | let maintainers = &generate_repo_ref_event() | ||
| 434 | .iter_tags() | ||
| 435 | .find(|t| t.as_vec()[0].eq(&"maintainers")) | ||
| 436 | .unwrap() | ||
| 437 | .as_vec() | ||
| 438 | .clone()[1..]; | ||
| 439 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | ||
| 440 | for relay in [&r53, &r55, &r56] { | ||
| 441 | for m in maintainers { | ||
| 442 | let pr_event: &nostr::Event = | ||
| 443 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); | ||
| 444 | assert!( | ||
| 445 | pr_event | ||
| 446 | .iter_tags() | ||
| 447 | .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) }) | ||
| 448 | ); | ||
| 449 | } | ||
| 450 | } | ||
| 451 | Ok(()) | ||
| 452 | } | ||
| 453 | |||
| 454 | #[tokio::test] | ||
| 455 | #[serial] | ||
| 456 | async fn t_tag_cover_letter() -> Result<()> { | ||
| 457 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | ||
| 458 | for relay in [&r53, &r55, &r56] { | ||
| 459 | let pr_event: &nostr::Event = | ||
| 460 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); | ||
| 461 | assert!( | ||
| 445 | pr_event | 462 | pr_event |
| 446 | .tags | 463 | .iter_tags() |
| 447 | .iter() | 464 | .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"cover-letter") }) |
| 448 | .find(|t| t.as_vec()[0].eq("name")) | ||
| 449 | .unwrap() | ||
| 450 | .as_vec()[1], | ||
| 451 | "exampletitle" | ||
| 452 | ); | 465 | ); |
| 453 | } | 466 | } |
| 454 | Ok(()) | 467 | Ok(()) |
| @@ -456,23 +469,15 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 456 | 469 | ||
| 457 | #[tokio::test] | 470 | #[tokio::test] |
| 458 | #[serial] | 471 | #[serial] |
| 459 | async fn pr_tags_description() -> Result<()> { | 472 | async fn t_tag_root() -> Result<()> { |
| 460 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 473 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 461 | for relay in [&r53, &r55, &r56] { | 474 | for relay in [&r53, &r55, &r56] { |
| 462 | let pr_event: &nostr::Event = relay | 475 | let pr_event: &nostr::Event = |
| 463 | .events | 476 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); |
| 464 | .iter() | 477 | assert!( |
| 465 | .find(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 466 | .unwrap(); | ||
| 467 | |||
| 468 | assert_eq!( | ||
| 469 | pr_event | 478 | pr_event |
| 470 | .tags | 479 | .iter_tags() |
| 471 | .iter() | 480 | .any(|t| { t.as_vec()[0].eq("t") && t.as_vec()[1].eq(&"root") }) |
| 472 | .find(|t| t.as_vec()[0].eq("description")) | ||
| 473 | .unwrap() | ||
| 474 | .as_vec()[1], | ||
| 475 | "exampledescription" | ||
| 476 | ); | 481 | ); |
| 477 | } | 482 | } |
| 478 | Ok(()) | 483 | Ok(()) |
| @@ -483,17 +488,13 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 483 | async fn pr_tags_branch_name() -> Result<()> { | 488 | async fn pr_tags_branch_name() -> Result<()> { |
| 484 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 489 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 485 | for relay in [&r53, &r55, &r56] { | 490 | for relay in [&r53, &r55, &r56] { |
| 486 | let pr_event: &nostr::Event = relay | 491 | let pr_event: &nostr::Event = |
| 487 | .events | 492 | relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); |
| 488 | .iter() | ||
| 489 | .find(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 490 | .unwrap(); | ||
| 491 | 493 | ||
| 492 | // branch-name tag | 494 | // branch-name tag |
| 493 | assert_eq!( | 495 | assert_eq!( |
| 494 | pr_event | 496 | pr_event |
| 495 | .tags | 497 | .iter_tags() |
| 496 | .iter() | ||
| 497 | .find(|t| t.as_vec()[0].eq("branch-name")) | 498 | .find(|t| t.as_vec()[0].eq("branch-name")) |
| 498 | .unwrap() | 499 | .unwrap() |
| 499 | .as_vec()[1], | 500 | .as_vec()[1], |
| @@ -509,12 +510,7 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 509 | 510 | ||
| 510 | async fn prep() -> Result<nostr::Event> { | 511 | async fn prep() -> Result<nostr::Event> { |
| 511 | let (_, _, r53, _, _) = prep_run_create_pr().await?; | 512 | let (_, _, r53, _, _) = prep_run_create_pr().await?; |
| 512 | Ok(r53 | 513 | Ok(r53.events.iter().find(|e| is_patch(e)).unwrap().clone()) |
| 513 | .events | ||
| 514 | .iter() | ||
| 515 | .find(|e| e.kind.as_u64().eq(&PATCH_KIND)) | ||
| 516 | .unwrap() | ||
| 517 | .clone()) | ||
| 518 | } | 514 | } |
| 519 | 515 | ||
| 520 | #[tokio::test] | 516 | #[tokio::test] |
| @@ -561,6 +557,39 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 561 | 557 | ||
| 562 | #[tokio::test] | 558 | #[tokio::test] |
| 563 | #[serial] | 559 | #[serial] |
| 560 | async fn p_tags_for_maintainers() -> Result<()> { | ||
| 561 | let maintainers = &generate_repo_ref_event() | ||
| 562 | .iter_tags() | ||
| 563 | .find(|t| t.as_vec()[0].eq(&"maintainers")) | ||
| 564 | .unwrap() | ||
| 565 | .as_vec() | ||
| 566 | .clone()[1..]; | ||
| 567 | for m in maintainers { | ||
| 568 | assert!( | ||
| 569 | prep() | ||
| 570 | .await? | ||
| 571 | .iter_tags() | ||
| 572 | .any(|t| { t.as_vec()[0].eq("p") && t.as_vec()[1].eq(m) }) | ||
| 573 | ); | ||
| 574 | } | ||
| 575 | Ok(()) | ||
| 576 | } | ||
| 577 | |||
| 578 | #[tokio::test] | ||
| 579 | #[serial] | ||
| 580 | async fn a_tag_for_repo_event() -> Result<()> { | ||
| 581 | assert!(prep().await?.tags.iter().any(|t| { | ||
| 582 | t.as_vec()[0].eq("a") | ||
| 583 | && t.as_vec()[1].eq(&format!( | ||
| 584 | "{REPOSITORY_KIND}:{TEST_KEY_1_PUBKEY_HEX}:{}", | ||
| 585 | generate_repo_ref_event().identifier().unwrap() | ||
| 586 | )) | ||
| 587 | })); | ||
| 588 | Ok(()) | ||
| 589 | } | ||
| 590 | |||
| 591 | #[tokio::test] | ||
| 592 | #[serial] | ||
| 564 | async fn description_with_commit_message() -> Result<()> { | 593 | async fn description_with_commit_message() -> Result<()> { |
| 565 | assert_eq!( | 594 | assert_eq!( |
| 566 | prep() | 595 | prep() |
| @@ -612,18 +641,11 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 612 | async fn patch_tags_pr_event_as_root() -> Result<()> { | 641 | async fn patch_tags_pr_event_as_root() -> Result<()> { |
| 613 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; | 642 | let (_, _, r53, r55, r56) = prep_run_create_pr().await?; |
| 614 | for relay in [&r53, &r55, &r56] { | 643 | for relay in [&r53, &r55, &r56] { |
| 615 | let patch_events: Vec<&nostr::Event> = relay | 644 | let patch_events: Vec<&nostr::Event> = |
| 616 | .events | 645 | relay.events.iter().filter(|e| is_patch(e)).collect(); |
| 617 | .iter() | ||
| 618 | .filter(|e| e.kind.as_u64().eq(&PATCH_KIND)) | ||
| 619 | .collect(); | ||
| 620 | 646 | ||
| 621 | let most_recent_patch = patch_events[0]; | 647 | let most_recent_patch = patch_events[0]; |
| 622 | let pr_event = relay | 648 | let pr_event = relay.events.iter().find(|e| is_cover_letter(e)).unwrap(); |
| 623 | .events | ||
| 624 | .iter() | ||
| 625 | .find(|e| e.kind.as_u64().eq(&PR_KIND)) | ||
| 626 | .unwrap(); | ||
| 627 | 649 | ||
| 628 | let root_event_tag = most_recent_patch | 650 | let root_event_tag = most_recent_patch |
| 629 | .tags | 651 | .tags |
| @@ -892,3 +914,8 @@ mod sends_pr_and_2_patches_to_3_relays { | |||
| 892 | } | 914 | } |
| 893 | } | 915 | } |
| 894 | } | 916 | } |
| 917 | |||
| 918 | mod without_cover_letter { | ||
| 919 | use super::*; | ||
| 920 | // TODO | ||
| 921 | } | ||