Files
cannamanage/docs/sprint-11/cannamanage-sprint11-analysis.md
T
Patrick Plate 59b785b8ed
Deploy to Production / test (push) Failing after 1s
Deploy to Production / deploy (push) Has been skipped
test(sprint-11): centralize JaCoCo coverage rules and add bank import + finance test coverage
- pom.xml: introduce risk-tiered JaCoCo rules in parent POM
  - bundle: 80% line coverage
  - bankimport/finance packages: 90% (highest precision)
  - api.security: 85%
  - scheduler/notification: 70%
  - exclude entity/enums/dto/config from coverage measurement
  - add Surefire 3.5.2 plugin management
- cannamanage-service/pom.xml: remove obsolete module-local ComplianceService=100% rule
  (subsumed by parent package rules), add explicit jackson-databind dep so
  ByteBuddy can mock AuditService.METADATA_MAPPER
- Add AbstractServiceTest base class for service-layer tests
- Add FinanceServiceTest
- Add bankimport test suite:
  - Mt940ParserTest with malformed input fixtures
    (encoding, overflow, truncated, generic)
  - PaymentMatchingServiceTest with ParsedTransactionBuilder helper
  - CAMT.053 / Sparkasse MT940 sample fixtures
  - XXE attack fixtures (billion-laughs, SSRF, generic)
- docs/sprint-11/: analysis, plan, plan-review, testplan
2026-06-15 21:37:49 +02:00

215 lines
9.2 KiB
Markdown

# Sprint 11 Analysis — Quality Foundation: Backend Test Coverage
**Date:** 2026-06-15
**Sprint Theme:** Quality Foundation — Backend Test Coverage
**Author:** Patrick Plate / Roo (Architect)
**Status:** Draft v1
---
## 1. Current State Assessment
### 1.1 Codebase Metrics
| Metric | Value |
|--------|-------|
| Backend LOC (Java) | ~29,000 |
| Service classes | 42 (main) + 12 (bankimport) + 19 (report generators) |
| Existing unit tests | 9 test classes in `cannamanage-service` |
| Existing integration tests | 6 test classes in `cannamanage-api` |
| Existing Playwright E2E tests | 202 |
| Estimated current line coverage | ~12% |
| Target line coverage | ≥80% overall, ≥90% for financial/compliance |
### 1.2 Existing Test Inventory
**Unit Tests (`cannamanage-service/src/test/`):**
| Test Class | Service Under Test | Approx. Coverage |
|------------|-------------------|-----------------|
| `ClubServiceTest` | ClubService | Partial |
| `ComplianceServiceTest` | ComplianceService | Good (quota enforcement) |
| `EmailServiceTest` | EmailService | Basic |
| `PdfReportGeneratorTest` | PdfReportGenerator | Basic |
| `PortalServiceTest` | PortalService | Partial |
| `PreventionOfficerServiceTest` | PreventionOfficerService | Good |
| `ReportServiceTest` | ReportService | Partial |
| `StaffServiceTest` | StaffService | Partial |
| `TokenRevocationServiceTest` | TokenRevocationService | Good |
**Integration Tests (`cannamanage-api/src/test/`):**
| Test Class | Scope |
|------------|-------|
| `AbstractIntegrationTest` | Base class (Testcontainers PostgreSQL) |
| `AuthIntegrationTest` | Full auth flow |
| `PortalIntegrationTest` | Member portal endpoints |
| `ReportIntegrationTest` | Report generation endpoints |
| `StaffPermissionIntegrationTest` | RBAC enforcement |
| `TenantIsolationTest` | Multi-tenant data isolation |
| `TokenRevocationIntegrationTest` | Token lifecycle |
| `AuthControllerIntegrationTest` | Auth controller |
| `ClubControllerTest` | Club CRUD |
| `ComplianceControllerIntegrationTest` | Compliance endpoints |
| `StaffPermissionCheckerTest` | Permission checker logic |
### 1.3 Untested Services (Coverage Gaps)
**Critical — Zero Test Coverage:**
| Service | LOC | Complexity | Risk |
|---------|-----|-----------|------|
| `FinanceService` | 371 | High (ledger, payments, fees) | 🔴 Financial |
| `PaymentMatchingService` | 507 | Very High (scoring algorithm) | 🔴 Financial |
| `BankImportService` | ~400 | High (stateful session) | 🔴 Financial/GoBD |
| `Mt940Parser` | ~300 | High (state machine) | 🔴 Financial |
| `Camt053Parser` | ~250 | High (StAX XML) | 🔴 Security (XXE) |
| `CsvBankParser` | ~200 | Medium | 🟡 Financial |
| `RetentionService` | ~200 | Medium (GDPR logic) | 🔴 Compliance |
| `ReportGeneratorService` | ~150 | Medium (dispatch) | 🟡 Compliance |
| `EurReportGenerator` | ~300 | High (§4(3) EStG) | 🔴 Financial |
| `AnnualAuthorityReportGenerator` | ~250 | High (CanG §26) | 🔴 Compliance |
| `AssemblyService` | ~350 | High (quorum, voting) | 🟡 Legal |
| `EventService` | ~250 | Medium (RSVP, iCal) | 🟢 Standard |
| `ForumService` | ~200 | Medium | 🟢 Standard |
| `InfoBoardService` | ~150 | Low | 🟢 Standard |
| `NotificationDispatchService` | ~200 | Medium (fan-out) | 🟡 Reliability |
| `JwtService` | ~120 | Medium (crypto) | 🔴 Security |
| `LoginRateLimiter` | ~80 | Low | 🔴 Security |
| `TenantFilterAspect` | ~60 | Low (AOP) | 🔴 Security |
| `DocumentService` | ~200 | Medium (file I/O) | 🔴 Security |
### 1.4 Test Infrastructure Status
| Infrastructure | Status |
|---------------|--------|
| JUnit 5 | ✅ Available (via spring-boot-starter-test) |
| Mockito | ✅ Available (via spring-boot-starter-test) |
| AssertJ | ✅ Available (explicit dependency) |
| Testcontainers PostgreSQL | ✅ Available + configured |
| AbstractIntegrationTest base class | ✅ Exists with helper methods |
| JaCoCo coverage plugin | ❌ Not configured |
| Test profiles (application-test.properties) | ✅ Exists |
| Integration profile (application-integration.properties) | ✅ Exists |
---
## 2. Risk Analysis
### 2.1 Why 12% Coverage is a Production Blocker
| Risk | Impact | Probability | Mitigation |
|------|--------|-------------|-----------|
| Financial calculation bug (rounding, fee logic) | Loss of member trust, incorrect Kassenbuch | High | Unit tests for FinanceService with cent-precision assertions |
| Bank import data corruption (GoBD violation) | Legal liability under §147 AO | Medium | Integration tests for immutable session lifecycle |
| Payment matching false positive (wrong member) | Incorrect bookkeeping, member disputes | Medium | Unit tests with realistic German bank statement data |
| MT940 parser crash on edge cases | Import failure blocks payment reconciliation | High | Fuzz-style tests with malformed input |
| GDPR retention logic error | Supervisory authority fine (up to 4% revenue) | Low | Unit tests for anonymization completeness |
| Quota enforcement bypass | CanG violation, club loses license | Medium | Already tested (ComplianceServiceTest) — verify edge cases |
| JWT token validation bypass | Unauthorized access | Low-Medium | Unit tests for expiry, tampering, revocation |
| Tenant isolation breach | Data leak between clubs | Critical | Already tested (TenantIsolationTest) — extend |
### 2.2 Coverage Targets by Risk Category
| Category | Target | Rationale |
|----------|--------|-----------|
| Financial (FinanceService, BankImport, Parsers, Matching) | ≥90% | Money handling requires near-complete coverage |
| Compliance (Retention, ComplianceService, Reports) | ≥90% | Regulatory requirements |
| Security (JWT, RateLimiter, Tenant, Document) | ≥80% | Attack surface minimization |
| Core Business (Assembly, Events, Forum, InfoBoard) | ≥75% | Functional correctness |
| Infrastructure (Notifications, Schedulers) | ≥60% | Reliability baseline |
---
## 3. Testing Strategy
### 3.1 Test Pyramid
```
/‾‾‾‾‾‾‾‾‾‾‾‾\
/ Playwright \ 202 existing (unchanged)
/ E2E (202) \
/____________________\
/ \
/ Integration (~12) \ ~12 new (Testcontainers)
/ API + DB flows \
/__________________________\
/ \
/ Unit Tests (~95+) \ ~95 new (Mockito)
/ Service logic isolation \
/________________________________\
```
### 3.2 Unit Test Approach
- **Pattern:** JUnit 5 + Mockito + AssertJ (matching existing ComplianceServiceTest style)
- **Naming:** `test<Method>_<Scenario>_<Expected>()` with `@DisplayName`
- **Structure:** Given-When-Then with clear section comments
- **Mocking:** All repository dependencies mocked; test pure business logic
- **Edge cases:** null inputs, boundary values, German locale specifics (umlauts, date formats)
### 3.3 Integration Test Approach
- **Base class:** Extend existing `AbstractIntegrationTest` (Testcontainers PostgreSQL)
- **Scope:** Full request → DB → response cycles
- **Auth:** Use helper methods to create users and obtain JWT tokens
- **Data isolation:** Each test creates its own club/user context
- **Cleanup:** `@Transactional` rollback or manual cleanup in `@AfterEach`
### 3.4 Coverage Measurement
- **Tool:** JaCoCo Maven plugin
- **Report:** HTML + XML (for CI parsing)
- **Enforcement:** `<rule>` element with minimum 60% line coverage
- **Exclusions:** Generated code, DTOs, enums, configuration classes
---
## 4. Sprint Scope
### 4.1 In Scope
- 296+ new unit tests across 30+ service classes (includes report generators, schedulers, CRUD services)
- 29+ new integration tests for critical flows (incl. SecurityConfig and Flyway migration verification)
- JaCoCo plugin configuration with 80% enforcement
- Maven Surefire parallelization (forkCount=2) for build speed
- Test fixtures and builders for realistic German data (incl. real Sparkasse MT940)
- Coverage from 12% → 80%+ overall (realistically achievable with +70 easy-win tests in v3)
### 4.2 Out of Scope
- New features
- Frontend changes
- Playwright test additions
- CI/CD pipeline changes (deferred to Sprint 12)
- Performance testing
---
## 5. Dependencies
| Dependency | Status | Action |
|-----------|--------|--------|
| Testcontainers | ✅ Already in POM | None |
| JaCoCo | ❌ Missing | Add to parent POM |
| Test fixtures (MT940 samples, CAMT053 XML) | ❌ Missing | Create in src/test/resources |
| Mockito (for unit tests) | ✅ via starter-test | None |
| AssertJ | ✅ Explicit dependency | None |
---
## 6. Success Criteria
| Criterion | Threshold | Measurement |
|-----------|-----------|-------------|
| Overall line coverage | ≥80% | JaCoCo report |
| Financial module coverage | ≥90% | JaCoCo per-package |
| Compliance module coverage | ≥90% | JaCoCo per-package |
| Security module coverage | ≥85% | JaCoCo per-package (boosted by GlobalExceptionHandler tests) |
| Core business coverage | ≥75% | JaCoCo per-package |
| Infrastructure coverage (Schedulers + Notifications) | ≥70% | JaCoCo per-package |
| All tests pass | 100% green | `mvn test` exit code 0 |
| Total backend tests | ≥345 | Surefire report count |
| No new features introduced | 0 feature commits | Git log review |
| Build time increase | ≤3 minutes | Maven timing (with forkCount=2) |