Skip to content

test(gmail): close #1503's patch-coverage gaps in sync's live-progress and reconciliation paths - #1506

Open
newhoggy wants to merge 1 commit into
mainfrom
coverage-gaps-1502-gmail-sync
Open

test(gmail): close #1503's patch-coverage gaps in sync's live-progress and reconciliation paths#1506
newhoggy wants to merge 1 commit into
mainfrom
coverage-gaps-1502-gmail-sync

Conversation

@newhoggy

@newhoggy newhoggy commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Summary

  • feat(gmail): pipeline sync's listing/fetch phases and add live multi-bar progress #1503's coverage bot flagged four patch-coverage gaps that landed uncovered when it merged (comment: feat(gmail): pipeline sync's listing/fetch phases and add live multi-bar progress #1503 (comment)). This closes all four:
    • run_sync_command's show_progress branch (sync.rs:130-142) was structurally untestable — it called std::io::stderr().is_terminal() directly instead of taking it as a parameter, unlike should_show_progress which already does this for exactly this reason. Threaded a stderr_is_terminal: bool param through so a test can force the live-progress path.
    • LoadOutcome::Present + opts.full == true (engine.rs:159-168, forces reconciliation despite a valid watermark) was untested.
    • LoadOutcome::Corrupt (engine.rs:186-195, a malformed state.json triggers reconciliation rather than a hard error) was untested.
    • fetch_and_archive_messages_streaming's duplicate-id dedup (engine.rs:458, a page-boundary race in the live-streamed listing) was untested.
  • The coverage bot's "indirect changes" section also flagged engine.rs:579-582 (inside fetch_and_archive_messages, used only by run_incremental) as losing coverage on code feat(gmail): pipeline sync's listing/fetch phases and add live multi-bar progress #1503 never touched, with no test removed either — most likely CI measurement noise rather than a real gap, so left as-is.

Test plan

  • cargo build --lib --tests --features mcp
  • cargo test --features mcp --lib cli::gmail::sync:: (77 passed)
  • cargo clippy --tests --features mcp -- -D warnings

…corrupt state.json, and streaming id dedup

PR #1503's coverage bot flagged four patch-coverage gaps in the pipelined
sync (gmail/sync.rs, gmail/sync/engine.rs), now merged into main uncovered:

- run_sync_command's show_progress branch was structurally untestable —
  it called std::io::stderr().is_terminal() directly instead of taking it
  as a parameter the way should_show_progress already does. Threaded
  stderr_is_terminal through so a test can force the live-progress path.
- LoadOutcome::Present + --full (forces reconciliation despite a valid
  watermark) was untested.
- LoadOutcome::Corrupt (malformed state.json triggers reconciliation
  rather than a hard error) was untested.
- fetch_and_archive_messages_streaming's duplicate-id dedup (a
  page-boundary race in the live-streamed listing) was untested.
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

Coverage

Total: 97.33% 🟢 0.03 pp vs main

Comparing 20b45cc..c71ee77 (merge-base → PR head)

File Before After Δ
src/cli/gmail/sync.rs 97.79% 99.28% 🟢 1.5 pp
src/cli/gmail/sync/engine.rs 97.25% 99% 🟢 1.75 pp

Patch coverage

Patch: 100% (160/160 new lines covered)

File Patch Uncovered new lines
src/cli/gmail/sync.rs 100% (62/62)
src/cli/gmail/sync/engine.rs 100% (98/98)

Indirect coverage changes

🔴 0 lines lost coverage, 🟢 34 lines gained coverage on unchanged code.

Indirect changes
  • src/cli/gmail/sync.rs:138 🟢 uncovered → covered
  • src/cli/gmail/sync.rs:139 🟢 uncovered → covered
  • src/cli/gmail/sync.rs:140 🟢 uncovered → covered
  • src/cli/gmail/sync.rs:141 🟢 uncovered → covered
  • src/cli/gmail/sync.rs:145 🟢 uncovered → covered
  • src/cli/gmail/sync.rs:148 🟢 uncovered → covered
  • src/cli/gmail/sync.rs:149 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:154 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:158 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:159 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:160 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:161 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:162 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:163 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:164 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:165 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:166 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:167 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:168 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:182 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:183 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:184 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:185 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:186 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:187 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:188 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:189 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:190 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:191 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:192 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:193 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:194 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:195 🟢 uncovered → covered
  • src/cli/gmail/sync/engine.rs:458 🟢 uncovered → covered

📦 Full per-file coverage summary · run summary

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant