- SPRINT-12-SUMMARY.md: full work update with architecture diagram - Screenshots: documents-dark.png, documents-light.png, documents-upload-dialog.png, board-dark.png
This commit is contained in:
@@ -0,0 +1,205 @@
|
|||||||
|
# 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 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):**
|
||||||
|
```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)*
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 143 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 144 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 144 KiB |
Reference in New Issue
Block a user