Files
myeasycms-v2/QA_TEST_PLAN.md
Zaid Marzguioui ebd0fd4638
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 6m26s
Workflow / ⚫️ Test (push) Has been skipped
feat: complete CMS v2 with Docker, Fischerei, Meetings, Verband modules + UX audit fixes
Major changes:
- Docker Compose: full Supabase stack (11 services) equivalent to supabase CLI
- Fischerei module: 16 DB tables, waters/species/stocking/catch books/competitions
- Sitzungsprotokolle module: meeting protocols, agenda items, task tracking
- Verbandsverwaltung module: federation management, member clubs, contacts, fees
- Per-account module activation via Modules page toggle
- Site Builder: live CMS data in Puck blocks (courses, events, membership registration)
- Public registration APIs: course signup, event registration, membership application
- Document generation: PDF member cards, Excel reports, HTML labels
- Landing page: real Com.BISS content (no filler text)
- UX audit fixes: AccountNotFound component, shared status badges, confirm dialog,
  pagination, duplicate heading removal, emoji→badge replacement, a11y fixes
- QA: healthcheck fix, API auth fix, enum mismatch fix, password required attribute
2026-03-31 16:35:46 +02:00

14 KiB

MyEasyCMS v2 — Comprehensive QA Test Plan

Test Environment

  • App: localhost:3000 (Docker)
  • Supabase: localhost:8000 (Kong gateway)
  • Studio: localhost:54323
  • DB: supabase/postgres:15.8.1.060

Test Accounts

Email Password Role Team
super-admin@makerkit.dev testingpassword Super Admin -
test@makerkit.dev testingpassword Owner Makerkit
owner@makerkit.dev testingpassword Owner Makerkit
member@makerkit.dev testingpassword Member Makerkit
custom@makerkit.dev testingpassword Custom Makerkit

Test Categories

A. Authentication & Authorization (12 tests)

B. Public Pages (8 tests)

C. Team Dashboard & Navigation (10 tests)

D. Member Management CRUD (15 tests)

E. Course Management CRUD (10 tests)

F. Event Management CRUD (8 tests)

G. Document Generation (8 tests)

H. Newsletter System (6 tests)

I. Site Builder & Public Club Pages (12 tests)

J. Finance / SEPA (6 tests)

K. Fischerei Module (12 tests)

L. Sitzungsprotokolle Module (8 tests)

M. Verbandsverwaltung Module (8 tests)

N. Module Activation System (6 tests)

O. Admin Panel (8 tests)

P. Public Registration APIs (9 tests)

Q. Edge Cases & Error Handling (10 tests)

R. Permission Boundaries (8 tests)

Total: ~156 test cases


A. AUTHENTICATION & AUTHORIZATION

A1. Login — Valid credentials

  • Setup: Logged out
  • Steps: Navigate /auth/sign-in, enter test@makerkit.dev / testingpassword, submit
  • Expected: Redirect to /home, user avatar visible
  • Pass: URL contains /home, no error toast

A2. Login — Invalid password

  • Setup: Logged out
  • Steps: Enter test@makerkit.dev / wrongpassword, submit
  • Expected: Error message, stays on sign-in page
  • Pass: Error alert visible, URL still /auth/sign-in

A3. Login — Empty fields

  • Steps: Click submit without entering anything
  • Expected: Client-side validation prevents submit
  • Pass: Form doesn't submit, validation indicators shown

A4. Login — SQL injection attempt

  • Steps: Enter ' OR 1=1-- as email
  • Expected: Validation error (not valid email format)
  • Pass: No crash, proper error message

A5. Registration — Valid

  • Steps: Navigate /auth/sign-up, enter unique email, password >= 6 chars, matching repeat
  • Expected: Account created, redirect to /home
  • Pass: User exists in DB, logged in

A6. Registration — Duplicate email

  • Steps: Try registering with test@makerkit.dev
  • Expected: "Diese Anmeldedaten werden bereits verwendet"
  • Pass: Error shown, no crash

A7. Registration — Weak password

  • Steps: Enter password "123"
  • Expected: Validation error (too short)
  • Pass: Form doesn't submit

A8. Registration — Mismatched passwords

  • Steps: Enter different passwords in password and repeat fields
  • Expected: Validation error
  • Pass: Form shows mismatch error

A9. Session persistence

  • Steps: Login, close tab, open new tab to /home
  • Expected: Still logged in
  • Pass: Dashboard loads, not redirected to sign-in

A10. Logout

  • Steps: Click account dropdown > "Abmelden"
  • Expected: Session cleared, redirect to sign-in
  • Pass: Accessing /home redirects to /auth/sign-in

A11. Protected route — unauthenticated access

  • Steps: Clear cookies, navigate to /home/makerkit
  • Expected: Redirect to /auth/sign-in
  • Pass: URL changes to sign-in

A12. Admin route — non-admin access

  • Steps: Login as member@makerkit.dev, navigate to /admin
  • Expected: 404 (AdminGuard returns notFound)
  • Pass: 404 page shown

B. PUBLIC PAGES

B1. Landing page loads with real content

  • Expected: "Vereinsverwaltung, die mitwächst", "69.000", "SEPA"
  • Pass: No placeholder/filler text

B2. Pricing page

  • Navigate /pricing
  • Expected: Pricing table renders

B3. FAQ page

  • Navigate /faq
  • Expected: FAQ items render

B4. Contact page

  • Navigate /contact
  • Expected: Contact form with name/email/message fields

B5. Blog page

  • Navigate /blog
  • Expected: Blog listing (may be empty)
  • Navigate /privacy-policy, /terms-of-service, /cookie-policy
  • Expected: Each loads without error

B7. Public club page

  • Navigate /club/makerkit
  • Expected: Club homepage with Puck content
  • Pass: Real data (courses, events) shown, not placeholders

B8. Non-existent club page

  • Navigate /club/nonexistent
  • Expected: 404 page
  • Pass: Proper 404, no crash

C. TEAM DASHBOARD & NAVIGATION

C1. Team dashboard loads with stats

  • Login as test@makerkit.dev, navigate /home/makerkit
  • Expected: 4 stat cards, quick actions, activity feed
  • Pass: Numbers render (even if 0)
  • Click each sidebar item: Dashboard, Module, Mitglieder, Kurse, Veranstaltungen, Finanzen, Dokumente, Newsletter, Website
  • Expected: Each page loads without error

C3. Account switcher

  • Click account dropdown > "Arbeitsbereich wechseln"
  • Expected: Shows list of accounts

C4. Team settings — rename

  • Navigate /home/makerkit/settings
  • Expected: Team name editable, save works

C5. Team members list

  • Navigate /home/makerkit/members
  • Expected: Shows 4 members with roles

C6. Non-existent team slug

  • Navigate /home/nonexistent
  • Expected: Redirect or error page

C7. Profile settings

  • Navigate /home/settings (personal)
  • Expected: Name, language, email change form

C8. Theme toggle

  • Click theme toggle in nav
  • Expected: Dark/light theme switches

C9. Breadcrumb navigation

  • Navigate to nested page, click breadcrumb links
  • Expected: Navigate back correctly

C10. Mobile responsive (viewport 375px)

  • Resize to mobile
  • Expected: Sidebar collapses, hamburger menu works

D. MEMBER MANAGEMENT CRUD

D1. List members — empty state

  • Navigate /home/makerkit/members-cms
  • Expected: Shows "1 Mitglieder insgesamt" (Max Mustermann from earlier test)

D2. Create member — all fields

  • Navigate /home/makerkit/members-cms/new
  • Fill: Vorname=Anna, Nachname=Schmidt, Email=anna@test.de, PLZ=93047, Ort=Regensburg
  • Expected: Member created, redirect to list

D3. Create member — required fields only

  • Fill: Vorname=Test, Nachname=Minimal
  • Expected: Created successfully

D4. Create member — empty required fields

  • Submit with empty Vorname
  • Expected: Validation error

D5. Create member — invalid email format

  • Enter email "notanemail"
  • Expected: Validation error

D6. Create member — duplicate email

  • Create member with same email as existing
  • Expected: DB constraint error or validation

D7. View member detail

  • Click on member name in list
  • Expected: Detail page with all fields

D8. Edit member

  • Navigate to member edit page
  • Change Vorname, save
  • Expected: Updated in DB and UI

D9. Search members

  • Type in search box
  • Expected: List filters in real-time or on submit

D10. Filter by status

  • Use status dropdown
  • Expected: Only matching members shown

D11. Member with SEPA mandate

  • Create member with IBAN field filled
  • Expected: IBAN saved correctly

D12. Member import

  • Navigate /home/makerkit/members-cms/import
  • Expected: Import wizard loads

D13. Member statistics

  • Navigate /home/makerkit/members-cms/statistics
  • Expected: Statistics page loads

D14. Member departments

  • Navigate /home/makerkit/members-cms/departments
  • Expected: Department management page

D15. Pagination

  • With many members, verify pagination controls work

E. COURSE MANAGEMENT

E1. Course list — shows existing course

  • Navigate /home/makerkit/courses
  • Expected: "Schwimmkurs Anfänger" visible

E2. Create course — valid

  • Navigate /home/makerkit/courses/new
  • Fill required fields, submit
  • Expected: Created, redirect to courses list

E3. Course detail

  • Click on course name
  • Expected: Detail page with participants, schedule

E4. Course calendar

  • Navigate /home/makerkit/courses/calendar
  • Expected: Calendar view loads

E5. Course categories

  • Navigate /home/makerkit/courses/categories
  • Expected: Category management page

E6. Course instructors

  • Navigate /home/makerkit/courses/instructors
  • Expected: Instructor list

E7. Course locations

  • Navigate /home/makerkit/courses/locations
  • Expected: Location management

E8. Course statistics

  • Navigate /home/makerkit/courses/statistics
  • Expected: Statistics page loads

E9. Course participants

  • Navigate to course > participants tab
  • Expected: Participant list (may be empty)

E10. Course attendance

  • Navigate to course > attendance tab
  • Expected: Attendance tracking page

G. DOCUMENT GENERATION

G1. Document type selection page

  • Navigate /home/makerkit/documents
  • Expected: 6 document types shown

G2. Generate member cards (PDF)

  • Select Mitgliedsausweis, fill title, click Generieren
  • Expected: PDF downloads with .pdf extension
  • Pass: File downloads, success banner shown

G3. Generate labels (HTML)

  • Select Etiketten, fill title, click Generieren
  • Expected: HTML file downloads with .html extension

G4. Generate report (Excel)

  • Select Bericht, fill title, click Generieren
  • Expected: XLSX downloads with .xlsx extension

G5. Coming soon types (invoice, letter, certificate)

  • Select Rechnung
  • Expected: "Demnächst verfügbar" banner, button disabled

G6. Generate with empty title

  • Leave title blank, try to submit
  • Expected: Validation prevents submit (required field)

G7. Generate with no members

  • Create new account with no members, try generating
  • Expected: Error "Keine aktiven Mitglieder"

G8. Document templates page

  • Navigate /home/makerkit/documents/templates
  • Expected: Page loads, shows empty state

I. SITE BUILDER & PUBLIC CLUB PAGES

I1. Site builder list

  • Navigate /home/makerkit/site-builder
  • Expected: Shows pages list (hello, Über uns)

I2. Create new page

  • Navigate /home/makerkit/site-builder/new
  • Fill title + slug, submit
  • Expected: Page created, Puck editor opens

I3. Site builder settings

  • Navigate /home/makerkit/site-builder/settings
  • Expected: Design settings (name, colors, font, publish toggle)

I4. Public page — published

  • Navigate /club/makerkit/hello
  • Expected: Puck content renders

I5. Public page — unpublished

  • Navigate /club/makerkit/ueber-uns
  • Expected: 404 (not published)

I6. Public page — non-existent

  • Navigate /club/makerkit/nonexistent
  • Expected: 404

I7. Course data on public page

  • /club/makerkit should show "Schwimmkurs Anfänger"
  • Expected: Real course data, not placeholders

I8. Course registration form

  • Click "Anmelden" on a course on the public page
  • Fill form, submit
  • Expected: "Anmeldung erfolgreich!" message

I9. Event registration (no events)

  • EventList block should show "Keine anstehenden Veranstaltungen"

I10. Membership application form

  • Fill "Mitglied werden" form on public page
  • Submit with valid data
  • Expected: Application saved in DB

I11. Membership application — invalid email

  • Submit with invalid email
  • Expected: Client-side validation error

I12. Newsletter signup

  • Use newsletter signup block
  • Expected: Subscription created or error

N. MODULE ACTIVATION SYSTEM

N1. Module toggles page shows all modules

  • Navigate /home/makerkit/modules
  • Expected: Fischerei, Sitzungsprotokolle, Verbandsverwaltung toggles visible

N2. Activate Fischerei

  • Toggle Fischerei ON
  • Expected: "Fischerei" appears in sidebar

N3. Deactivate Fischerei

  • Toggle Fischerei OFF
  • Expected: "Fischerei" disappears from sidebar

N4. Activate Sitzungsprotokolle

  • Toggle ON
  • Expected: "Sitzungsprotokolle" appears in sidebar

N5. Activate Verbandsverwaltung

  • Toggle ON
  • Expected: "Verbandsverwaltung" appears in sidebar

N6. Direct URL access to deactivated module

  • Deactivate Fischerei, navigate /home/makerkit/fischerei
  • Expected: Page still loads (data exists) but not in sidebar

P. PUBLIC REGISTRATION APIS

P1. Course registration — valid

  • POST /api/club/course-register with valid courseId, name, email
  • Expected: 200 { success: true }

P2. Course registration — missing fields

  • POST without email
  • Expected: 400 error

P3. Course registration — invalid courseId

  • POST with random UUID
  • Expected: DB error or 500

P4. Event registration — valid

  • POST /api/club/event-register with valid data
  • Expected: 200 success (need an event first)

P5. Membership application — valid

  • POST /api/club/membership-apply with all fields
  • Expected: Row inserted in membership_applications

P6. Membership application — invalid email

  • POST with email "notanemail"
  • Expected: 400 validation error

P7. Membership application — missing accountId

  • POST without accountId
  • Expected: Error

P8. Rate limiting (if any)

  • Send 100 rapid POSTs
  • Expected: No crash (may or may not rate limit)

P9. XSS in form fields

  • Submit <script>alert(1)</script> as firstName
  • Expected: Stored as text, not executed on render

Q. EDGE CASES & ERROR HANDLING

Q1. API healthcheck

  • GET /api/healthcheck
  • Expected: { services: { database: true } }

Q2. 404 for unknown route

  • Navigate /nonexistent
  • Expected: 404 page with "Seite nicht gefunden"

Q3. Direct DB access via PostgREST (anon)

  • GET localhost:8000/rest/v1/members (anon key, no auth)
  • Expected: Empty array (RLS blocks anon)

Q4. JWT expiration handling

  • Login, wait for token expiry (3600s), try action
  • Expected: Auto-refresh or redirect to login

Q5. Concurrent writes

  • Two users edit same member simultaneously
  • Expected: Last write wins, no crash

Q6. Very long text input

  • Enter 10000 char string in a text field
  • Expected: Validation limits or graceful handling

Q7. Unicode/emoji in names

  • Create member with name "Müller-Lüdenscheidt 🎣"
  • Expected: Saved and displayed correctly

Q8. Browser back button

  • Navigate deep, press back
  • Expected: Previous page loads correctly

Q9. Double form submission

  • Click submit twice rapidly
  • Expected: Only one record created (isPending disables button)

Q10. Network disconnect during submit

  • Submit form, disconnect network mid-request
  • Expected: Error message, no partial data corruption