Batch 4/9 of the Robolectric Compose umbrella (#373). Converts the three VM-driven mail list screens to Robolectric JVM Compose tests in the test source set (no emulator) and drops them from jacocoNonJvmTestableSurface.
What
DraftsScreenJvmTest — empty state, subject/recipient/body rendering (+ blank-field fallbacks), open a draft, delete a draft (row disappears + delegates to the repo).
OutboxScreenJvmTest — empty state (no retry action), queued-vs-failed row rendering, retry, cancel (row disappears + delegates to the repo).
ProblemReportsScreenJvmTest — always-present create button + auto-delete notice, empty state, crash/manual kind labels, open a report, create-and-open-for-review flow.
Each drives the real ViewModel (DraftsViewModel / OutboxViewModel / ProblemReportsViewModel) over mocked collaborators (MailRepository, or ReportStore + DiagnosticsCollector) via the v2 createComposeRule(), following the #375/#376 pattern (AddAnotherAccountScreenJvmTest, the format-control JVM tests).
Coverage
Removed **/DraftsScreen*, **/OutboxScreen*, **/ProblemReportsScreen* from jacocoNonJvmTestableSurface. Measured JVM line coverage of the now-in-scope files:
File
Line coverage
DraftsScreen.kt
100% (61/61)
OutboxScreen.kt
100% (63/63)
ProblemReportsScreen.kt
97% (64/66)
Bundle line coverage rises to ~82.7%; the floor (jacocoLineCoverageFloor = 0.79) is unchanged (the re-ratchet is the final #373 step). The isIncludeNoLocationClasses JaCoCo fix already in main is untouched.
The existing instrumented androidTest E2Es (DraftsScreenTest / OutboxScreenTest / ProblemReportsScreenTest) stay as the on-device tests.
Gate
assembleDebug + testDebugUnitTest + jacocoTestCoverageVerification + compileDebugAndroidTestKotlin + lintDebug + ktlintCheck + detekt — all green locally (jacocoTestCoverageVerification passes).
Batch 4/9 of the Robolectric Compose umbrella (#373). Converts the three VM-driven mail list screens to **Robolectric JVM Compose tests** in the `test` source set (no emulator) and drops them from `jacocoNonJvmTestableSurface`.
## What
- **`DraftsScreenJvmTest`** — empty state, subject/recipient/body rendering (+ blank-field fallbacks), open a draft, delete a draft (row disappears + delegates to the repo).
- **`OutboxScreenJvmTest`** — empty state (no retry action), queued-vs-failed row rendering, retry, cancel (row disappears + delegates to the repo).
- **`ProblemReportsScreenJvmTest`** — always-present create button + auto-delete notice, empty state, crash/manual kind labels, open a report, create-and-open-for-review flow.
Each drives the **real** ViewModel (`DraftsViewModel` / `OutboxViewModel` / `ProblemReportsViewModel`) over mocked collaborators (`MailRepository`, or `ReportStore` + `DiagnosticsCollector`) via the v2 `createComposeRule()`, following the `#375`/`#376` pattern (`AddAnotherAccountScreenJvmTest`, the format-control JVM tests).
## Coverage
Removed `**/DraftsScreen*`, `**/OutboxScreen*`, `**/ProblemReportsScreen*` from `jacocoNonJvmTestableSurface`. Measured JVM line coverage of the now-in-scope files:
| File | Line coverage |
| --- | --- |
| `DraftsScreen.kt` | 100% (61/61) |
| `OutboxScreen.kt` | 100% (63/63) |
| `ProblemReportsScreen.kt` | 97% (64/66) |
Bundle line coverage rises to ~82.7%; the floor (`jacocoLineCoverageFloor = 0.79`) is **unchanged** (the re-ratchet is the final #373 step). The `isIncludeNoLocationClasses` JaCoCo fix already in `main` is untouched.
The existing instrumented `androidTest` E2Es (`DraftsScreenTest` / `OutboxScreenTest` / `ProblemReportsScreenTest`) stay as the on-device tests.
## Gate
`assembleDebug` + `testDebugUnitTest` + `jacocoTestCoverageVerification` + `compileDebugAndroidTestKotlin` + `lintDebug` + `ktlintCheck` + `detekt` — all green locally (`jacocoTestCoverageVerification` passes).
Closes #379.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Tick the box to add this pull request to the merge queue (same as @mergifyio queue).
Queue this pull request
Tick the box to add this pull request to the merge queue (same as `@mergifyio queue`).
- [ ] Queue this pull request <!-- mergify:queue-control:queue -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Batch 4/9 of the Robolectric Compose umbrella (#373). Converts the three VM-driven mail list screens to Robolectric JVM Compose tests in the
testsource set (no emulator) and drops them fromjacocoNonJvmTestableSurface.What
DraftsScreenJvmTest— empty state, subject/recipient/body rendering (+ blank-field fallbacks), open a draft, delete a draft (row disappears + delegates to the repo).OutboxScreenJvmTest— empty state (no retry action), queued-vs-failed row rendering, retry, cancel (row disappears + delegates to the repo).ProblemReportsScreenJvmTest— always-present create button + auto-delete notice, empty state, crash/manual kind labels, open a report, create-and-open-for-review flow.Each drives the real ViewModel (
DraftsViewModel/OutboxViewModel/ProblemReportsViewModel) over mocked collaborators (MailRepository, orReportStore+DiagnosticsCollector) via the v2createComposeRule(), following the#375/#376pattern (AddAnotherAccountScreenJvmTest, the format-control JVM tests).Coverage
Removed
**/DraftsScreen*,**/OutboxScreen*,**/ProblemReportsScreen*fromjacocoNonJvmTestableSurface. Measured JVM line coverage of the now-in-scope files:DraftsScreen.ktOutboxScreen.ktProblemReportsScreen.ktBundle line coverage rises to ~82.7%; the floor (
jacocoLineCoverageFloor = 0.79) is unchanged (the re-ratchet is the final #373 step). TheisIncludeNoLocationClassesJaCoCo fix already inmainis untouched.The existing instrumented
androidTestE2Es (DraftsScreenTest/OutboxScreenTest/ProblemReportsScreenTest) stay as the on-device tests.Gate
assembleDebug+testDebugUnitTest+jacocoTestCoverageVerification+compileDebugAndroidTestKotlin+lintDebug+ktlintCheck+detekt— all green locally (jacocoTestCoverageVerificationpasses).Closes #379.
🤖 Generated with Claude Code
Tick the box to add this pull request to the merge queue (same as
@mergifyio queue).