Current State
Coverage badge: 
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)
sessions/amp.rs — 66 lines, 0% → similar pattern to existing Pi/Gemini tests
sessions/kilo.rs — 50 lines, 0% → same
sessions/droid.rs — 100 lines, 34% → add more fixture cases
sessions/synthetic.rs — 103 lines, 35% → add edge cases
Medium effort (HTTP mocking)
pricing/litellm.rs + pricing/openrouter.rs — mock HTTP responses
pricing/cache.rs — filesystem mocking
cursor.rs — API sync mocking
Hard / low ROI
- TUI rendering code — consider snapshot testing with
ratatui::backend::TestBackend
main.rs — already covered by integration tests, tarpaulin limitation
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.
Current State
Coverage badge:
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.
tui/ui/stats.rstui/ui/overview.rstui/ui/models.rstui/ui/footer.rstui/mod.rstui/ui/daily.rstui/ui/bar_chart.rstui/ui/widgets.rstui/ui/dialog/source_picker.rstui/ui/dialog/group_by_picker.rstui/ui/mod.rstui/ui/header.rstui/ui/spinner.rstui/config.rstui/ui/dialog/overlay.rsNetwork/Pricing (~211 lines)
Requires HTTP mocking to test without real network calls.
pricing/openrouter.rspricing/cache.rspricing/litellm.rsSession Parsers (~116 lines)
Pure parsing logic with no external deps — easiest wins.
sessions/amp.rssessions/kilo.rsLow Coverage (<40%) — High-Value Targets
main.rscursor.rsauth.rscommands/wrapped.rssessions/droid.rssessions/synthetic.rsWell-Tested Core (>80%)
aggregator.rsprovider_identity.rssessions/qwen.rssessions/gemini.rssessions/openclaw.rsscanner.rssessions/claudecode.rssessions/pi.rssessions/roocode.rssessions/crush.rsmessage_cache.rspricing/lookup.rssessions/codex.rsRecommended Priority
Quick wins (pure parsing, no deps)
sessions/amp.rs— 66 lines, 0% → similar pattern to existing Pi/Gemini testssessions/kilo.rs— 50 lines, 0% → samesessions/droid.rs— 100 lines, 34% → add more fixture casessessions/synthetic.rs— 103 lines, 35% → add edge casesMedium effort (HTTP mocking)
pricing/litellm.rs+pricing/openrouter.rs— mock HTTP responsespricing/cache.rs— filesystem mockingcursor.rs— API sync mockingHard / low ROI
ratatui::backend::TestBackendmain.rs— already covered by integration tests, tarpaulin limitationcommands/wrapped.rs— requires image generation depsTarget
Realistic near-term target: 60% by covering the quick wins.
Stretch goal: 70% with HTTP mocking for pricing/cursor.