Files
cannamanage/docs/sprint-12/SPRINT-12-SUMMARY.md
T
Patrick Plate 279487067e
Deploy to TrueNAS / deploy (push) Successful in 1m53s
docs: Sprint 12 wiki summary with screenshots
- SPRINT-12-SUMMARY.md: full work update with architecture diagram
- Screenshots: documents-dark.png, documents-light.png, documents-upload-dialog.png, board-dark.png
2026-06-18 15:02:51 +02:00

206 lines
8.0 KiB
Markdown

# 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:
1. **Phase 1** — Fixed all 6 non-functional buttons across Documents and Board pages, wired them to real service calls with React Query mutations
2. **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 dark mode](screenshots/documents-dark.png)
*Documents page with distinct category colors, icons, and properly sized table columns*
![Documents upload dialog](screenshots/documents-upload-dialog.png)
*Upload dialog with controlled form state, validation, and real service call on submit*
![Board page](screenshots/board-dark.png)
*Board management with functional Create Position, Elect Member, and Remove actions*
![Documents page light mode](screenshots/documents-light.png)
*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):**
```bash
docker compose -f docker-compose.test.yml up --build --abort-on-container-exit
```
**Local (macOS development):**
```bash
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):
```bash
cd cannamanage-frontend && pnpm dev
```
Open http://localhost:3000 — login with `admin@gruener-daumen.de` / `TestAdmin123!`
### Integration tests:
```bash
# 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:
```bash
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)*