-
Notifications
You must be signed in to change notification settings - Fork 128
test: improve test coverage from 43% — analysis and roadmap #403
Copy link
Copy link
Open
Labels
testingTest coverage and qualityTest coverage and quality
Description
Current State
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 testssessions/kilo.rs— 50 lines, 0% → samesessions/droid.rs— 100 lines, 34% → add more fixture casessessions/synthetic.rs— 103 lines, 35% → add edge cases
Medium effort (HTTP mocking)
pricing/litellm.rs+pricing/openrouter.rs— mock HTTP responsespricing/cache.rs— filesystem mockingcursor.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 limitationcommands/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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
testingTest coverage and qualityTest coverage and quality