CLI app for developers prototyping atproto functionality
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Normalize the snapshot timing normalization

+42 -65
+14
tests/common/mod.rs
··· 270 270 })) 271 271 } 272 272 } 273 + 274 + /// Helper to normalize timing in rendered reports for snapshot testing. 275 + pub(crate) fn normalize_timing(rendered: String) -> String { 276 + // Replace patterns like "elapsed: 1ms" with "elapsed: Xms" for consistent snapshots. 277 + let mut result = rendered.clone(); 278 + let start = result.find("elapsed: "); 279 + if let Some(pos) = start { 280 + let remaining = &result[pos + 9..]; 281 + if let Some(end) = remaining.find("ms") { 282 + result.replace_range(pos + 9..pos + 9 + end, "X"); 283 + } 284 + } 285 + result 286 + }
+12 -26
tests/labeler_endtoend.rs
··· 236 236 String::from_utf8(buf).expect("invalid utf-8") 237 237 } 238 238 239 - /// Helper to normalize timing in rendered reports for snapshot testing. 240 - fn normalize_timing(rendered: String) -> String { 241 - // Replace patterns like "elapsed: 1ms" with "elapsed: Xms" for consistent snapshots. 242 - let mut result = rendered.clone(); 243 - let start = result.find("elapsed: "); 244 - if let Some(pos) = start { 245 - let remaining = &result[pos + 9..]; 246 - if let Some(end) = remaining.find("ms") { 247 - result.replace_range(pos + 9..pos + 9 + end, "X"); 248 - } 249 - } 250 - result 251 - } 252 - 253 239 #[tokio::test] 254 240 async fn all_pass_exits_zero_and_renders_all_ok() { 255 241 // Fully healthy labeler with a real ECDSA-signed label whose ··· 299 285 300 286 let report = run_pipeline(target, opts).await; 301 287 let rendered = render_report_to_string(&report); 302 - let normalized = normalize_timing(rendered); 288 + let normalized = common::normalize_timing(rendered); 303 289 304 290 insta::assert_snapshot!("all_pass_exits_zero_and_renders_all_ok", normalized); 305 291 assert_eq!(report.exit_code(), 0, "Expected exit code 0"); ··· 352 338 353 339 let report = run_pipeline(target, opts).await; 354 340 let rendered = render_report_to_string(&report); 355 - let normalized = normalize_timing(rendered); 341 + let normalized = common::normalize_timing(rendered); 356 342 357 343 insta::assert_snapshot!( 358 344 "identity_only_failure_exits_one_with_severity_breakdown", ··· 397 383 398 384 let report = run_pipeline(target, opts).await; 399 385 let rendered = render_report_to_string(&report); 400 - let normalized = normalize_timing(rendered); 386 + let normalized = common::normalize_timing(rendered); 401 387 402 388 insta::assert_snapshot!("http_decode_failure_exits_one", normalized); 403 389 assert_eq!(report.exit_code(), 1, "Expected exit code 1"); ··· 448 434 449 435 let report = run_pipeline(target, opts).await; 450 436 let rendered = render_report_to_string(&report); 451 - let normalized = normalize_timing(rendered); 437 + let normalized = common::normalize_timing(rendered); 452 438 453 439 insta::assert_snapshot!("subscription_transport_error_exits_two", normalized); 454 440 assert_eq!( ··· 532 518 533 519 let report = run_pipeline(target, opts).await; 534 520 let rendered = render_report_to_string(&report); 535 - let normalized = normalize_timing(rendered); 521 + let normalized = common::normalize_timing(rendered); 536 522 537 523 insta::assert_snapshot!( 538 524 "current_key_fail_history_pass_exits_zero_with_advisory", ··· 614 600 615 601 let report = run_pipeline(target, opts).await; 616 602 let rendered = render_report_to_string(&report); 617 - let normalized = normalize_timing(rendered); 603 + let normalized = common::normalize_timing(rendered); 618 604 619 605 insta::assert_snapshot!("current_key_fail_history_also_fail_exits_one", normalized); 620 606 assert_eq!(report.exit_code(), 1, "Expected exit code 1"); ··· 693 679 694 680 let report = run_pipeline(target, opts).await; 695 681 let rendered = render_report_to_string(&report); 696 - let normalized = normalize_timing(rendered); 682 + let normalized = common::normalize_timing(rendered); 697 683 698 684 insta::assert_snapshot!("did_web_current_key_fail_exits_one", normalized); 699 685 assert_eq!(report.exit_code(), 1, "Expected exit code 1"); ··· 737 723 738 724 let report = run_pipeline(target, opts).await; 739 725 let rendered = render_report_to_string(&report); 740 - let normalized = normalize_timing(rendered); 726 + let normalized = common::normalize_timing(rendered); 741 727 742 728 insta::assert_snapshot!( 743 729 "canonicalization_error_distinct_diagnostic_code", ··· 806 792 807 793 let report = run_pipeline(target, opts).await; 808 794 let rendered = render_report_to_string(&report); 809 - let normalized = normalize_timing(rendered); 795 + let normalized = common::normalize_timing(rendered); 810 796 811 797 insta::assert_snapshot!( 812 798 "plc_directory_unreachable_network_error_no_false_fail", ··· 851 837 852 838 let report = run_pipeline(target, opts).await; 853 839 let rendered = render_report_to_string(&report); 854 - let normalized = normalize_timing(rendered); 840 + let normalized = common::normalize_timing(rendered); 855 841 856 842 insta::assert_snapshot!( 857 843 "empty_labeler_skipped_crypto_only_advisory_exits_zero", ··· 900 886 901 887 let report = run_pipeline(target, opts).await; 902 888 let rendered = render_report_to_string(&report); 903 - let normalized = normalize_timing(rendered); 889 + let normalized = common::normalize_timing(rendered); 904 890 905 891 insta::assert_snapshot!("exit_code_summary_for_network_only_run_is_two", normalized); 906 892 // Network-only errors (not spec violations) exit 2. ··· 934 920 935 921 let report = run_pipeline(target, opts).await; 936 922 let rendered = render_report_to_string(&report); 937 - let normalized = normalize_timing(rendered); 923 + let normalized = common::normalize_timing(rendered); 938 924 939 925 insta::assert_snapshot!("skipped_reasons_rendered", normalized); 940 926 // Verify [SKIP] lines with reasons appear.
+8 -31
tests/labeler_subscription.rs
··· 115 115 tee 116 116 } 117 117 118 - /// Helper to normalize elapsed time in snapshots. 119 - /// 120 - /// Replaces `elapsed: <N>ms` with `elapsed: XXms`, advancing past each match 121 - /// to avoid re-matching the replacement on the next iteration. 122 - fn normalize_timing(rendered: String) -> String { 123 - let mut result = String::with_capacity(rendered.len()); 124 - let mut rest = rendered.as_str(); 125 - while let Some(pos) = rest.find("elapsed: ") { 126 - let after = pos + "elapsed: ".len(); 127 - result.push_str(&rest[..after]); 128 - let tail = &rest[after..]; 129 - if let Some(end) = tail.find("ms") { 130 - result.push_str("XXms"); 131 - rest = &tail[end + 2..]; 132 - } else { 133 - result.push_str(tail); 134 - return result; 135 - } 136 - } 137 - result.push_str(rest); 138 - result 139 - } 140 - 141 118 /// Encodes a frame with length prefix: [4-byte big-endian length][frame bytes]. 142 119 fn encode_frame_with_length(header: &FrameHeader, payload_bytes: &[u8]) -> Vec<u8> { 143 120 let mut header_bytes = Vec::new(); ··· 294 271 }; 295 272 296 273 let report = run_pipeline(target, opts).await; 297 - let rendered = normalize_timing(render_report_to_string(&report)); 274 + let rendered = common::normalize_timing(render_report_to_string(&report)); 298 275 299 276 insta::assert_snapshot!(rendered); 300 277 } ··· 342 319 }; 343 320 344 321 let report = run_pipeline(target, opts).await; 345 - let rendered = normalize_timing(render_report_to_string(&report)); 322 + let rendered = common::normalize_timing(render_report_to_string(&report)); 346 323 347 324 insta::assert_snapshot!(rendered); 348 325 } ··· 376 353 }; 377 354 378 355 let report = run_pipeline(target, opts).await; 379 - let rendered = render_report_to_string(&report); 356 + let rendered = common::normalize_timing(render_report_to_string(&report)); 380 357 381 358 insta::assert_snapshot!(rendered); 382 359 } ··· 421 398 }; 422 399 423 400 let report = run_pipeline(target, opts).await; 424 - let rendered = normalize_timing(render_report_to_string(&report)); 401 + let rendered = common::normalize_timing(render_report_to_string(&report)); 425 402 426 403 insta::assert_snapshot!(rendered); 427 404 } ··· 467 444 }; 468 445 469 446 let report = run_pipeline(target, opts).await; 470 - let rendered = normalize_timing(render_report_to_string(&report)); 447 + let rendered = common::normalize_timing(render_report_to_string(&report)); 471 448 472 449 insta::assert_snapshot!(rendered); 473 450 } ··· 500 477 }; 501 478 502 479 let report = run_pipeline(target, opts).await; 503 - let rendered = render_report_to_string(&report); 480 + let rendered = common::normalize_timing(render_report_to_string(&report)); 504 481 505 482 insta::assert_snapshot!(rendered); 506 483 } ··· 545 522 }; 546 523 547 524 let report = run_pipeline(target, opts).await; 548 - let rendered = normalize_timing(render_report_to_string(&report)); 525 + let rendered = common::normalize_timing(render_report_to_string(&report)); 549 526 550 527 insta::assert_snapshot!(rendered); 551 528 } ··· 601 578 }; 602 579 603 580 let report = run_pipeline(target, opts).await; 604 - let rendered = normalize_timing(render_report_to_string(&report)); 581 + let rendered = common::normalize_timing(render_report_to_string(&report)); 605 582 606 583 insta::assert_snapshot!(rendered); 607 584 }
+1 -1
tests/snapshots/labeler_subscription__backfill_completes_within_budget_passes.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: XXms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__backfill_exceeds_budget_triggers_live_tail.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: XXms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__empty_stream_advisories.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: 0ms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__error_frame_malformed_payload_spec_violation.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: XXms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__live_tail_connect_failure_emits_network_error.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: XXms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__malformed_frame_emits_spec_violation.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: XXms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__mid_stream_transport_error_does_not_reset_idle_gap.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: XXms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>
+1 -1
tests/snapshots/labeler_subscription__unreachable_endpoint_network_error.snap
··· 3 3 expression: rendered 4 4 --- 5 5 Target: https://example.com/labeler 6 - elapsed: 0ms 6 + elapsed: Xms 7 7 8 8 == Identity == 9 9 [SKIP] target resolution — no DID supplied; run with a handle, a DID, or --did <did>