Skip to content

test: improve test coverage from 43% — analysis and roadmap #403

@junhoyeo

Description

@junhoyeo

Current State

Coverage badge: coverage

Overall: 43% (4,784 covered / 11,125 coverable lines)

The coverage was stuck at 0% due to a CI bug (wrong tarpaulin JSON filename), fixed in c187ac1. Now that it's reporting correctly, here's what's actually uncovered.

0% Coverage — Completely Untested (2,534 lines)

TUI Rendering (~2,000 lines)

These are ratatui rendering functions that require a terminal — inherently difficult to unit test.

File Coverable Lines
tui/ui/stats.rs 422
tui/ui/overview.rs 223
tui/ui/models.rs 190
tui/ui/footer.rs 190
tui/mod.rs 148
tui/ui/daily.rs 133
tui/ui/bar_chart.rs 117
tui/ui/widgets.rs 113
tui/ui/dialog/source_picker.rs 162
tui/ui/dialog/group_by_picker.rs 84
tui/ui/mod.rs 67
tui/ui/header.rs 52
tui/ui/spinner.rs 32
tui/config.rs 32
tui/ui/dialog/overlay.rs 14

Network/Pricing (~211 lines)

Requires HTTP mocking to test without real network calls.

File Coverable Lines
pricing/openrouter.rs 126
pricing/cache.rs 44
pricing/litellm.rs 41

Session Parsers (~116 lines)

Pure parsing logic with no external deps — easiest wins.

File Coverable Lines
sessions/amp.rs 66
sessions/kilo.rs 50

Low Coverage (<40%) — High-Value Targets

File Coverage Covered/Total Notes
main.rs 10.7% 150/1403 CLI dispatch — tested via integration tests but tarpaulin can't trace subprocess
cursor.rs 12% 64/535 Cursor API sync — needs HTTP mocking
auth.rs 27.9% 36/129 Device auth flow — needs API mocking
commands/wrapped.rs 30.4% 270/889 Image generation — heavy external deps
sessions/droid.rs 34% 34/100 Droid parser — pure parsing, easy to test
sessions/synthetic.rs 35% 36/103 Synthetic message handling

Well-Tested Core (>80%)

File Coverage
aggregator.rs 98.4%
provider_identity.rs 97.9%
sessions/qwen.rs 98.1%
sessions/gemini.rs 96.6%
sessions/openclaw.rs 96.1%
scanner.rs 95.3%
sessions/claudecode.rs 94.6%
sessions/pi.rs 94.6%
sessions/roocode.rs 93.6%
sessions/crush.rs 93.3%
message_cache.rs 90.1%
pricing/lookup.rs 86.2%
sessions/codex.rs 85.2%

Recommended Priority

Quick wins (pure parsing, no deps)

  1. sessions/amp.rs — 66 lines, 0% → similar pattern to existing Pi/Gemini tests
  2. sessions/kilo.rs — 50 lines, 0% → same
  3. sessions/droid.rs — 100 lines, 34% → add more fixture cases
  4. sessions/synthetic.rs — 103 lines, 35% → add edge cases

Medium effort (HTTP mocking)

  1. pricing/litellm.rs + pricing/openrouter.rs — mock HTTP responses
  2. pricing/cache.rs — filesystem mocking
  3. cursor.rs — API sync mocking

Hard / low ROI

  1. TUI rendering code — consider snapshot testing with ratatui::backend::TestBackend
  2. main.rs — already covered by integration tests, tarpaulin limitation
  3. commands/wrapped.rs — requires image generation deps

Target

Realistic near-term target: 60% by covering the quick wins.
Stretch goal: 70% with HTTP mocking for pricing/cursor.

Metadata

Metadata

Assignees

No one assigned

    Labels

    testingTest coverage and quality

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions