Files
music_library/backlog/completed/ml-6 - Align-mix.exs-test-coverage-threshold-with-sandbox-achievable-level.md
2026-05-04 21:22:27 +01:00

59 lines
2.1 KiB
Markdown

---
id: ML-6
title: Align mix.exs test coverage threshold with sandbox-achievable level
status: Done
assignee: []
created_date: "2026-04-20 08:48"
labels: []
dependencies: []
references:
- "https://github.com/cloud8421/music_library/issues/177"
priority: low
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
_GitHub: created 2026-04-16 · updated 2026-04-17 · closed 2026-04-17_
## Summary
`mix.exs` sets a coverage threshold of 90 % but actual coverage is 75.77 %. Most of the 14.2-point gap is modules that legitimately cannot execute in the Ecto sandbox: cron-only workers (`RepoVacuum`, `RepoOptimize`, `SendRecordsOnThisDayEmail`, `RefreshScrobbles`) and Mix tasks. Per project conventions, tests for untestable sandbox operations are not written.
## Evidence
Current coverage output: 75.77 % (720 tests, `mix test --cover`).
0 % modules that cannot be covered under the sandbox convention:
- `MusicLibrary.Worker.RepoVacuum`
- `MusicLibrary.Worker.RepoOptimize`
- `MusicLibrary.Worker.SendRecordsOnThisDayEmail`
- `MusicLibrary.Worker.RefreshScrobbles`
- `MusicLibrary.Worker.BackfillScrobbledTracks`
- Several `Mix.Tasks.*`
## Why It Matters
A red coverage check on `mix test --cover` that is structurally unachievable trains contributors to ignore the signal. Either the threshold should reflect reality, or the untestable modules should be decorated for exclusion.
## Fix (options)
1. Lower the threshold to a realistic value (e.g. 85 %) that fails when new gaps appear but passes today.
2. Decorate the unreachable modules with `@moduledoc tags: [:skip_coverage]` (or similar) and exclude them via `test_coverage: [ignore_modules: [...]]` in `mix.exs`.
Option 2 is preferable because it keeps the threshold aspirational and surfaces the exclusion list.
## Acceptance Criteria
<!-- AC:BEGIN -->
- `mix test --cover` passes under its configured threshold
- Untestable modules are explicitly enumerated somewhere (config, moduledoc, or both)
<!-- SECTION:DESCRIPTION:END -->
- [ ] #1 `mix test --cover` passes under its configured threshold
- [ ] #2 Untestable modules are explicitly enumerated somewhere (config, moduledoc, or both)
<!-- AC:END -->