diff options
Diffstat (limited to 'tests/ngit_init.rs')
| -rw-r--r-- | tests/ngit_init.rs | 360 |
1 files changed, 187 insertions, 173 deletions
diff --git a/tests/ngit_init.rs b/tests/ngit_init.rs index 1a23177..f6b30ef 100644 --- a/tests/ngit_init.rs +++ b/tests/ngit_init.rs | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | use anyhow::Result; | 1 | use anyhow::Result; |
| 2 | use nostr_sdk::Kind; | 2 | use nostr_sdk::Kind; |
| 3 | use rstest::*; | ||
| 3 | use serial_test::serial; | 4 | use serial_test::serial; |
| 4 | use test_utils::{git::GitTestRepo, *}; | 5 | use test_utils::{git::GitTestRepo, *}; |
| 5 | 6 | ||
| @@ -120,68 +121,107 @@ mod when_repo_not_previously_claimed { | |||
| 120 | 121 | ||
| 121 | use super::*; | 122 | use super::*; |
| 122 | 123 | ||
| 124 | #[derive(Clone)] | ||
| 125 | pub struct SentToCorrectRelaysScenario { | ||
| 126 | pub r51_repo_event_count: usize, | ||
| 127 | pub r52_repo_event_count: usize, | ||
| 128 | pub r53_repo_event_count: usize, | ||
| 129 | pub r55_repo_event_count: usize, | ||
| 130 | pub r56_repo_event_count: usize, | ||
| 131 | pub r57_repo_event_count: usize, | ||
| 132 | } | ||
| 133 | |||
| 134 | #[fixture] | ||
| 135 | async fn scenario() -> SentToCorrectRelaysScenario { | ||
| 136 | let (r51, r52, r53, r55, r56, r57) = | ||
| 137 | prep_run_init().await.expect("prep_run_init failed"); | ||
| 138 | |||
| 139 | // Extract event counts for verification | ||
| 140 | let r51_repo_event_count = r51 | ||
| 141 | .events | ||
| 142 | .iter() | ||
| 143 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 144 | .count(); | ||
| 145 | let r52_repo_event_count = r52 | ||
| 146 | .events | ||
| 147 | .iter() | ||
| 148 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 149 | .count(); | ||
| 150 | let r53_repo_event_count = r53 | ||
| 151 | .events | ||
| 152 | .iter() | ||
| 153 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 154 | .count(); | ||
| 155 | let r55_repo_event_count = r55 | ||
| 156 | .events | ||
| 157 | .iter() | ||
| 158 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 159 | .count(); | ||
| 160 | let r56_repo_event_count = r56 | ||
| 161 | .events | ||
| 162 | .iter() | ||
| 163 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 164 | .count(); | ||
| 165 | let r57_repo_event_count = r57 | ||
| 166 | .events | ||
| 167 | .iter() | ||
| 168 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 169 | .count(); | ||
| 170 | |||
| 171 | SentToCorrectRelaysScenario { | ||
| 172 | r51_repo_event_count, | ||
| 173 | r52_repo_event_count, | ||
| 174 | r53_repo_event_count, | ||
| 175 | r55_repo_event_count, | ||
| 176 | r56_repo_event_count, | ||
| 177 | r57_repo_event_count, | ||
| 178 | } | ||
| 179 | } | ||
| 180 | |||
| 181 | #[rstest] | ||
| 123 | #[tokio::test] | 182 | #[tokio::test] |
| 124 | #[serial] | 183 | #[serial] |
| 125 | async fn only_1_repository_kind_event_sent_to_user_relays() -> Result<()> { | 184 | async fn only_1_repository_kind_event_sent_to_user_relays( |
| 126 | let (_, _, r53, r55, _, _) = prep_run_init().await?; | 185 | #[future] scenario: SentToCorrectRelaysScenario, |
| 127 | for relay in [&r53, &r55] { | 186 | ) -> Result<()> { |
| 128 | assert_eq!( | 187 | let s = scenario.await; |
| 129 | relay | 188 | assert_eq!(s.r53_repo_event_count, 1); |
| 130 | .events | 189 | assert_eq!(s.r55_repo_event_count, 1); |
| 131 | .iter() | ||
| 132 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 133 | .count(), | ||
| 134 | 1, | ||
| 135 | ); | ||
| 136 | } | ||
| 137 | Ok(()) | 190 | Ok(()) |
| 138 | } | 191 | } |
| 139 | 192 | ||
| 193 | #[rstest] | ||
| 140 | #[tokio::test] | 194 | #[tokio::test] |
| 141 | #[serial] | 195 | #[serial] |
| 142 | async fn only_1_repository_kind_event_sent_to_specified_repo_relays() -> Result<()> { | 196 | async fn only_1_repository_kind_event_sent_to_specified_repo_relays( |
| 143 | let (_, _, _, r55, r56, _) = prep_run_init().await?; | 197 | #[future] scenario: SentToCorrectRelaysScenario, |
| 144 | for relay in [&r55, &r56] { | 198 | ) -> Result<()> { |
| 145 | assert_eq!( | 199 | let s = scenario.await; |
| 146 | relay | 200 | assert_eq!(s.r55_repo_event_count, 1); |
| 147 | .events | 201 | assert_eq!(s.r56_repo_event_count, 1); |
| 148 | .iter() | ||
| 149 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 150 | .count(), | ||
| 151 | 1, | ||
| 152 | ); | ||
| 153 | } | ||
| 154 | Ok(()) | 202 | Ok(()) |
| 155 | } | 203 | } |
| 156 | 204 | ||
| 205 | #[rstest] | ||
| 157 | #[tokio::test] | 206 | #[tokio::test] |
| 158 | #[serial] | 207 | #[serial] |
| 159 | async fn only_1_repository_kind_event_sent_to_fallback_relays() -> Result<()> { | 208 | async fn only_1_repository_kind_event_sent_to_fallback_relays( |
| 160 | let (r51, r52, _, _, _, _) = prep_run_init().await?; | 209 | #[future] scenario: SentToCorrectRelaysScenario, |
| 161 | for relay in [&r51, &r52] { | 210 | ) -> Result<()> { |
| 162 | assert_eq!( | 211 | let s = scenario.await; |
| 163 | relay | 212 | assert_eq!(s.r51_repo_event_count, 1); |
| 164 | .events | 213 | assert_eq!(s.r52_repo_event_count, 1); |
| 165 | .iter() | ||
| 166 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 167 | .count(), | ||
| 168 | 1, | ||
| 169 | ); | ||
| 170 | } | ||
| 171 | Ok(()) | 214 | Ok(()) |
| 172 | } | 215 | } |
| 173 | 216 | ||
| 217 | #[rstest] | ||
| 174 | #[tokio::test] | 218 | #[tokio::test] |
| 175 | #[serial] | 219 | #[serial] |
| 176 | async fn only_1_repository_kind_event_sent_to_blaster_relays() -> Result<()> { | 220 | async fn only_1_repository_kind_event_sent_to_blaster_relays( |
| 177 | let (_, _, _, _, _, r57) = prep_run_init().await?; | 221 | #[future] scenario: SentToCorrectRelaysScenario, |
| 178 | assert_eq!( | 222 | ) -> Result<()> { |
| 179 | r57.events | 223 | let s = scenario.await; |
| 180 | .iter() | 224 | assert_eq!(s.r57_repo_event_count, 1); |
| 181 | .filter(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 182 | .count(), | ||
| 183 | 1, | ||
| 184 | ); | ||
| 185 | Ok(()) | 225 | Ok(()) |
| 186 | } | 226 | } |
| 187 | } | 227 | } |
| @@ -271,179 +311,153 @@ mod when_repo_not_previously_claimed { | |||
| 271 | mod tags_as_specified_in_args { | 311 | mod tags_as_specified_in_args { |
| 272 | use super::*; | 312 | use super::*; |
| 273 | 313 | ||
| 314 | #[derive(Clone)] | ||
| 315 | pub struct TagsAsSpecifiedScenario { | ||
| 316 | pub event: nostr::Event, | ||
| 317 | } | ||
| 318 | |||
| 319 | #[fixture] | ||
| 320 | async fn scenario() -> TagsAsSpecifiedScenario { | ||
| 321 | let (_, _, r53, _r55, _r56, _r57) = | ||
| 322 | prep_run_init().await.expect("prep_run_init failed"); | ||
| 323 | |||
| 324 | // Extract the GitRepoAnnouncement event (should be same on all relays) | ||
| 325 | let event = r53 | ||
| 326 | .events | ||
| 327 | .iter() | ||
| 328 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 329 | .expect("GitRepoAnnouncement event not found") | ||
| 330 | .clone(); | ||
| 331 | |||
| 332 | TagsAsSpecifiedScenario { event } | ||
| 333 | } | ||
| 334 | |||
| 335 | #[rstest] | ||
| 274 | #[tokio::test] | 336 | #[tokio::test] |
| 275 | #[serial] | 337 | #[serial] |
| 276 | async fn d_replaceable_event_identifier() -> Result<()> { | 338 | async fn d_replaceable_event_identifier( |
| 277 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 339 | #[future] scenario: TagsAsSpecifiedScenario, |
| 278 | for relay in [&r53, &r55, &r56, &r57] { | 340 | ) -> Result<()> { |
| 279 | let event: &nostr::Event = relay | 341 | let s = scenario.await; |
| 280 | .events | 342 | assert!( |
| 281 | .iter() | 343 | s.event.tags.iter().any( |
| 282 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 283 | .unwrap(); | ||
| 284 | |||
| 285 | assert!(event.tags.iter().any( | ||
| 286 | |t| t.as_slice()[0].eq("d") && t.as_slice()[1].eq("example-identifier") | 344 | |t| t.as_slice()[0].eq("d") && t.as_slice()[1].eq("example-identifier") |
| 287 | )); | 345 | ) |
| 288 | } | 346 | ); |
| 289 | Ok(()) | 347 | Ok(()) |
| 290 | } | 348 | } |
| 291 | 349 | ||
| 350 | #[rstest] | ||
| 292 | #[tokio::test] | 351 | #[tokio::test] |
| 293 | #[serial] | 352 | #[serial] |
| 294 | async fn earliest_unique_commit_as_reference_with_euc_marker() -> Result<()> { | 353 | async fn earliest_unique_commit_as_reference_with_euc_marker( |
| 295 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 354 | #[future] scenario: TagsAsSpecifiedScenario, |
| 296 | for relay in [&r53, &r55, &r56, &r57] { | 355 | ) -> Result<()> { |
| 297 | let event: &nostr::Event = relay | 356 | let s = scenario.await; |
| 298 | .events | 357 | assert!(s.event.tags.iter().any(|t| t.as_slice()[0].eq("r") |
| 299 | .iter() | 358 | && t.as_slice()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d") |
| 300 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | 359 | && t.as_slice()[2].eq("euc"))); |
| 301 | .unwrap(); | ||
| 302 | |||
| 303 | assert!(event.tags.iter().any(|t| t.as_slice()[0].eq("r") | ||
| 304 | && t.as_slice()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d") | ||
| 305 | && t.as_slice()[2].eq("euc"))); | ||
| 306 | } | ||
| 307 | Ok(()) | 360 | Ok(()) |
| 308 | } | 361 | } |
| 309 | 362 | ||
| 363 | #[rstest] | ||
| 310 | #[tokio::test] | 364 | #[tokio::test] |
| 311 | #[serial] | 365 | #[serial] |
| 312 | async fn name() -> Result<()> { | 366 | async fn name(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 313 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 367 | let s = scenario.await; |
| 314 | for relay in [&r53, &r55, &r56, &r57] { | 368 | assert!( |
| 315 | let event: &nostr::Event = relay | 369 | s.event |
| 316 | .events | 370 | .tags |
| 317 | .iter() | 371 | .iter() |
| 318 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | 372 | .any(|t| t.as_slice()[0].eq("name") && t.as_slice()[1].eq("example-name")) |
| 319 | .unwrap(); | 373 | ); |
| 320 | |||
| 321 | assert!( | ||
| 322 | event | ||
| 323 | .tags | ||
| 324 | .iter() | ||
| 325 | .any(|t| t.as_slice()[0].eq("name") | ||
| 326 | && t.as_slice()[1].eq("example-name")) | ||
| 327 | ); | ||
| 328 | } | ||
| 329 | Ok(()) | 374 | Ok(()) |
| 330 | } | 375 | } |
| 331 | 376 | ||
| 377 | #[rstest] | ||
| 332 | #[tokio::test] | 378 | #[tokio::test] |
| 333 | #[serial] | 379 | #[serial] |
| 334 | async fn alt() -> Result<()> { | 380 | async fn alt(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 335 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 381 | let s = scenario.await; |
| 336 | for relay in [&r53, &r55, &r56, &r57] { | 382 | assert!(s.event.tags.iter().any(|t| t.as_slice()[0].eq("alt") |
| 337 | let event: &nostr::Event = relay | 383 | && t.as_slice()[1].eq("git repository: example-name"))); |
| 338 | .events | ||
| 339 | .iter() | ||
| 340 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 341 | .unwrap(); | ||
| 342 | |||
| 343 | assert!(event.tags.iter().any(|t| t.as_slice()[0].eq("alt") | ||
| 344 | && t.as_slice()[1].eq("git repository: example-name"))); | ||
| 345 | } | ||
| 346 | Ok(()) | 384 | Ok(()) |
| 347 | } | 385 | } |
| 348 | 386 | ||
| 387 | #[rstest] | ||
| 349 | #[tokio::test] | 388 | #[tokio::test] |
| 350 | #[serial] | 389 | #[serial] |
| 351 | async fn description() -> Result<()> { | 390 | async fn description(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 352 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 391 | let s = scenario.await; |
| 353 | for relay in [&r53, &r55, &r56, &r57] { | 392 | assert!( |
| 354 | let event: &nostr::Event = relay | 393 | s.event |
| 355 | .events | 394 | .tags |
| 356 | .iter() | 395 | .iter() |
| 357 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | 396 | .any(|t| t.as_slice()[0].eq("description") |
| 358 | .unwrap(); | 397 | && t.as_slice()[1].eq("example-description")) |
| 359 | 398 | ); | |
| 360 | assert!(event.tags.iter().any(|t| t.as_slice()[0].eq("description") | ||
| 361 | && t.as_slice()[1].eq("example-description"))); | ||
| 362 | } | ||
| 363 | Ok(()) | 399 | Ok(()) |
| 364 | } | 400 | } |
| 365 | 401 | ||
| 402 | #[rstest] | ||
| 366 | #[tokio::test] | 403 | #[tokio::test] |
| 367 | #[serial] | 404 | #[serial] |
| 368 | async fn git_server() -> Result<()> { | 405 | async fn git_server(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 369 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 406 | let s = scenario.await; |
| 370 | for relay in [&r53, &r55, &r56, &r57] { | 407 | assert!( |
| 371 | let event: &nostr::Event = relay | 408 | s.event.tags.iter().any(|t| t.as_slice()[0].eq("clone") |
| 372 | .events | 409 | && t.as_slice()[1].eq("https://git.myhosting.com/my-repo.git")) /* todo check it defaults to origin */ |
| 373 | .iter() | 410 | ); |
| 374 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | ||
| 375 | .unwrap(); | ||
| 376 | |||
| 377 | assert!( | ||
| 378 | event.tags.iter().any(|t| t.as_slice()[0].eq("clone") | ||
| 379 | && t.as_slice()[1].eq("https://git.myhosting.com/my-repo.git")) /* todo check it defaults to origin */ | ||
| 380 | ); | ||
| 381 | } | ||
| 382 | Ok(()) | 411 | Ok(()) |
| 383 | } | 412 | } |
| 384 | 413 | ||
| 414 | #[rstest] | ||
| 385 | #[tokio::test] | 415 | #[tokio::test] |
| 386 | #[serial] | 416 | #[serial] |
| 387 | async fn relays() -> Result<()> { | 417 | async fn relays(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 388 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 418 | let s = scenario.await; |
| 389 | for relay in [&r53, &r55, &r56, &r57] { | 419 | let relays_tag = s |
| 390 | let event: &nostr::Event = relay | 420 | .event |
| 391 | .events | 421 | .tags |
| 392 | .iter() | 422 | .iter() |
| 393 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | 423 | .find(|t| t.as_slice()[0].eq("relays")) |
| 394 | .unwrap(); | 424 | .unwrap() |
| 395 | let relays_tag = event | 425 | .as_slice(); |
| 396 | .tags | 426 | assert_eq!(relays_tag[1], "ws://localhost:8055",); |
| 397 | .iter() | 427 | assert_eq!(relays_tag[2], "ws://localhost:8056",); |
| 398 | .find(|t| t.as_slice()[0].eq("relays")) | ||
| 399 | .unwrap() | ||
| 400 | .as_slice(); | ||
| 401 | assert_eq!(relays_tag[1], "ws://localhost:8055",); | ||
| 402 | assert_eq!(relays_tag[2], "ws://localhost:8056",); | ||
| 403 | } | ||
| 404 | Ok(()) | 428 | Ok(()) |
| 405 | } | 429 | } |
| 406 | 430 | ||
| 431 | #[rstest] | ||
| 407 | #[tokio::test] | 432 | #[tokio::test] |
| 408 | #[serial] | 433 | #[serial] |
| 409 | async fn web() -> Result<()> { | 434 | async fn web(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 410 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 435 | let s = scenario.await; |
| 411 | for relay in [&r53, &r55, &r56, &r57] { | 436 | let web_tag = s |
| 412 | let event: &nostr::Event = relay | 437 | .event |
| 413 | .events | 438 | .tags |
| 414 | .iter() | 439 | .iter() |
| 415 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | 440 | .find(|t| t.as_slice()[0].eq("web")) |
| 416 | .unwrap(); | 441 | .unwrap() |
| 417 | let web_tag = event | 442 | .as_slice(); |
| 418 | .tags | 443 | assert_eq!(web_tag[1], "https://exampleproject.xyz",); |
| 419 | .iter() | 444 | assert_eq!(web_tag[2], "https://gitworkshop.dev/123",); |
| 420 | .find(|t| t.as_slice()[0].eq("web")) | ||
| 421 | .unwrap() | ||
| 422 | .as_slice(); | ||
| 423 | assert_eq!(web_tag[1], "https://exampleproject.xyz",); | ||
| 424 | assert_eq!(web_tag[2], "https://gitworkshop.dev/123",); | ||
| 425 | } | ||
| 426 | Ok(()) | 445 | Ok(()) |
| 427 | } | 446 | } |
| 428 | 447 | ||
| 448 | #[rstest] | ||
| 429 | #[tokio::test] | 449 | #[tokio::test] |
| 430 | #[serial] | 450 | #[serial] |
| 431 | async fn maintainers() -> Result<()> { | 451 | async fn maintainers(#[future] scenario: TagsAsSpecifiedScenario) -> Result<()> { |
| 432 | let (_, _, r53, r55, r56, r57) = prep_run_init().await?; | 452 | let s = scenario.await; |
| 433 | for relay in [&r53, &r55, &r56, &r57] { | 453 | let maintainers_tag = s |
| 434 | let event: &nostr::Event = relay | 454 | .event |
| 435 | .events | 455 | .tags |
| 436 | .iter() | 456 | .iter() |
| 437 | .find(|e| e.kind.eq(&Kind::GitRepoAnnouncement)) | 457 | .find(|t| t.as_slice()[0].eq("maintainers")) |
| 438 | .unwrap(); | 458 | .unwrap() |
| 439 | let maintainers_tag = event | 459 | .as_slice(); |
| 440 | .tags | 460 | assert_eq!(maintainers_tag[1], TEST_KEY_1_KEYS.public_key().to_string()); |
| 441 | .iter() | ||
| 442 | .find(|t| t.as_slice()[0].eq("maintainers")) | ||
| 443 | .unwrap() | ||
| 444 | .as_slice(); | ||
| 445 | assert_eq!(maintainers_tag[1], TEST_KEY_1_KEYS.public_key().to_string()); | ||
| 446 | } | ||
| 447 | Ok(()) | 461 | Ok(()) |
| 448 | } | 462 | } |
| 449 | } | 463 | } |