# Project memory — EQDEV-620 test coverage

## Mission
Raise SonarQube line coverage above 91% by **adding tests only**.

## Hard constraints (non-negotiable)
- **Never** edit, create, or delete files under `src/main/**`.
- **Never** edit `pom.xml` (root or any module).
- You may **only** create or modify files under `src/test/**`.
- Never run `git push`. Stage and commit locally; a human pushes and opens the MR.

These are enforced by `.claude/settings.json` deny rules and a PreToolUse hook.
If a tool call is blocked, that is expected — do not try to work around it.

## Test stack & conventions
- Java 21, Spring Boot 3, Maven (multi-module), JUnit 5.
- Mocking: Mockito. Assertions: AssertJ (`assertThat(...)`).
- Mirror the production package under `src/test/java/...`; name tests `<Class>Test`.
- Follow the patterns in existing neighbouring tests before inventing new ones.

## What "good" means (avoid coverage theater)
- Every test must assert **observable behavior or outcomes**, not merely execute lines.
- Cover branches, exception paths, and boundary conditions — not just the happy path.
- A test that raises the coverage number without a meaningful assertion is a FAIL,
  not a win. Mutation testing (PIT) runs in CI and will catch empty tests.

## Workflow when asked to cover a class
1. Read the target class and its existing test (if any).
2. Read `target/site/jacoco/jacoco.xml` to see which lines/branches are uncovered.
3. Write/extend the test under `src/test/java` for the uncovered paths.
4. Run `mvn -B test` (or `-pl <module>`) to confirm compile + green.
5. Re-check coverage. Report the before/after number for that class.
6. Stop. Do not commit unless explicitly asked.
