- SPRINT-12-SUMMARY.md: full work update with architecture diagram - Screenshots: documents-dark.png, documents-light.png, documents-upload-dialog.png, board-dark.png
8.0 KiB
Sprint 12 — Golden Test Standard
Everything Present Must Work
Date: 2026-06-18
Duration: Single-day sprint
Key Metric: 6 P0 bugs fixed, full integration test infrastructure built
Overview
Sprint 12 was a quality-focused sprint with a simple mandate: every button, every action, every interaction that exists in the UI must actually work. No dead buttons. No placeholder handlers. No "TODO: implement later."
The sprint delivered two major outcomes:
- Phase 1 — Fixed all 6 non-functional buttons across Documents and Board pages, wired them to real service calls with React Query mutations
- Phase 2 — Built a complete Playwright integration test infrastructure (Docker Compose stack, 13 test specs, 70+ tests) to prevent regressions
Phase 1: Button Fixes + UX Polish
The Problem
Six buttons across the Documents and Board pages were completely non-functional:
| Page | Button | Issue |
|---|---|---|
| Documents | Upload | Closed dialog immediately, no file upload |
| Documents | Download | No onClick handler at all |
| Documents | Delete | No onClick handler at all |
| Board | Create Position | No service call wired |
| Board | Elect Member | No service call wired |
| Board | Remove Member | No service call wired |
The Fix
Each button was wired to proper React Query mutations with:
- Optimistic UI updates where appropriate
- Error handling with toast notifications
- Loading states during async operations
- Mock-mode dual operation (works with mock data in dev, real API in production)
Results
Documents page with distinct category colors, icons, and properly sized table columns
Upload dialog with controlled form state, validation, and real service call on submit
Board management with functional Create Position, Elect Member, and Remove actions
Documents page in light mode showing proper color contrast across both themes
Phase 2: Integration Test Infrastructure
Architecture
┌─────────────────────────────────────────────────────────┐
│ Docker Compose Test Stack │
├──────────────┬──────────────┬───────────┬───────────────┤
│ Postgres │ Backend │ Frontend │ Playwright │
│ (tmpfs) │ (test prof.) │ (Next.js) │ (13 specs) │
├──────────────┼──────────────┼───────────┼───────────────┤
│ Seed via │ Flyway + │ Port 3000 │ Runs against │
│ Flyway │ Reset EP │ │ real frontend │
│ R__seed.sql │ /test/ │ │ + real backend│
│ │ reset-db │ │ │
└──────────────┴──────────────┴───────────┴───────────────┘
Components
| Component | Role | Details |
|---|---|---|
| PostgreSQL | Test database | tmpfs mount for speed, wiped between runs |
| Backend | Spring Boot (test profile) | Flyway migrations + R__seed.sql for test data, /test/reset-db endpoint |
| Frontend | Next.js | Standard build, connects to test backend |
| Playwright | Test runner | 13 spec files, 70+ tests, runs against real stack |
Seed Data
The R__seed.sql repeatable migration provides a deterministic dataset:
- 1 association ("Grüner Daumen e.V.")
- 3 users (admin, board member, regular member)
- Sample documents across all categories
- Board positions with elected members
- Stock entries, distributions, and member records
Test Specs (13 files, 70+ tests)
| Spec | Tests | Coverage |
|---|---|---|
auth.spec.ts |
6 | Login, logout, session persistence, invalid credentials |
dashboard.spec.ts |
5 | Widgets render, navigation, data loading |
documents.spec.ts |
8 | Upload, download, delete, category filter, search |
board.spec.ts |
7 | Create position, elect member, remove, term display |
members.spec.ts |
6 | List, search, filter by status, detail view |
distributions.spec.ts |
6 | Create, list, quota check, member assignment |
stock.spec.ts |
5 | Inventory list, add entry, strain details |
grow.spec.ts |
5 | Calendar view, phase tracking, notes |
reports.spec.ts |
4 | Generate, download, filter by type |
events.spec.ts |
5 | Create event, RSVP, calendar view |
finance.spec.ts |
4 | Transactions, balance, member fees |
notifications.spec.ts |
4 | List, mark read, preferences |
accessibility.spec.ts |
5 | ARIA labels, keyboard nav, color contrast |
How to Run
CI (Linux — GitHub Actions / Gitea):
docker compose -f docker-compose.test.yml up --build --abort-on-container-exit
Local (macOS development):
docker compose -f docker-compose.test.yml -f docker-compose.test.local.yml up --build
The docker-compose.test.local.yml override adjusts platform settings and port mappings for macOS development.
Quality Gates Passed
| Gate | Result | Details |
|---|---|---|
| Expert Panel Review | ✅ APPROVED (v3, 95% confidence) | 3 cycles: v1→REVISE, v2→APPROVED@92%, v3→APPROVED@95% |
| Code Review | ✅ Approved with comments | 2 blockers found and fixed, 4 non-blocking warnings remaining |
| Build (frontend) | ✅ pnpm build passes |
No TypeScript errors, no lint warnings |
| Build (backend) | ✅ mvn compile passes |
Clean compilation |
Review Cycle History
v1 Plan → Expert Panel → REVISE (missing error handling, no seed isolation)
v2 Plan → Expert Panel → APPROVED @ 92% (added reset endpoint, tmpfs)
v3 Plan → Expert Panel → APPROVED @ 95% (final polish, accessibility spec added)
Files Changed Summary
Total: 35 files, +5,278 lines
| Category | Files | Description |
|---|---|---|
| Frontend (pages) | 4 | Documents page, Board page, upload dialog, service hooks |
| Frontend (services) | 5 | documents.ts, board.ts, API client patches, React Query mutations |
| Frontend (test specs) | 13 | Full Playwright integration test suite |
| Frontend (config) | 3 | playwright.config.ts, Dockerfile.playwright, test utilities |
| Backend (seed) | 1 | R__seed.sql — repeatable Flyway migration with test data |
| Backend (config) | 1 | application-test.properties — test profile |
| Backend (controller) | 1 | TestResetController — DB reset endpoint for test isolation |
| Infrastructure | 3 | docker-compose.test.yml, docker-compose.test.local.yml, Dockerfile.playwright |
| Documentation | 6 | Analysis, plan, testplan, panel review, code review, this summary |
Running the App
Development mode (mock data, no backend needed):
cd cannamanage-frontend && pnpm dev
Open http://localhost:3000 — login with admin@gruener-daumen.de / TestAdmin123!
Integration tests:
# CI (Linux):
docker compose -f docker-compose.test.yml up --build --abort-on-container-exit
# Local (macOS):
docker compose -f docker-compose.test.yml -f docker-compose.test.local.yml up --build
Production build:
cd cannamanage-frontend && pnpm build && pnpm start
What's Next
| Priority | Item | Sprint |
|---|---|---|
| P0 | Spin up and validate integration tests against real backend | 13 |
| P1 | Fix 4 non-blocking code review warnings | 13 |
| P2 | Sprint 13 feature work (TBD from backlog) | 13 |
Generated 2026-06-18 by Lumen (DocGen mode)