pp-planer/.sisyphus/CONTINUATION_GUIDE.md
Thorsten Bus 7c4eb31769 docs: add comprehensive continuation guide for CTS E2E testing
- Complete execution patterns for remaining 20 tasks
- 6-section prompt templates for each task type
- Troubleshooting guide for common issues
- Verification checklists and best practices
- Session learnings from Wave 2-3 completion
2026-03-01 23:17:11 +01:00

406 lines
12 KiB
Markdown

# CTS Herd + Playwright E2E Testing - Continuation Guide
**Status**: 7/24 implementation tasks complete (29.2%)
**Worktree**: `/Users/thorsten/AI/cts-work` (branch: `cts-presenter-app`)
**Plan**: `.sisyphus/plans/cts-herd-playwright.md`
---
## QUICK START
```bash
# Verify environment
cd /Users/thorsten/AI/cts-work
curl -s -o /dev/null -w "%{http_code}" http://cts-work.test/login # Should return 200
npx playwright test --list # Should show auth.spec.ts and navigation.spec.ts
# Run existing tests
npx playwright test # Should pass 12 tests
php artisan test # Should pass 174 tests
npm run build # Should succeed
```
---
## COMPLETED WORK
### Wave 1 — Environment + Foundation ✅
- **T1**: Herd Environment Configuration
- `.env.example` updated for http://cts-work.test
- App running on Herd (PHP 8.4)
- **T2**: Dummy Test Login Route + Button
- `POST /dev-login` route (gated by `app()->environment('local', 'testing')`)
- "Test-Anmeldung" button in Login.vue (amber styling)
- Uses `Auth::login()` (NOT `Auth::attempt()`)
- **T3**: Update UserFactory with OAuth Fields
- Added `churchtools_id`, `avatar`, `churchtools_groups`, `churchtools_roles`
### Wave 2 — Test Infrastructure ✅
- **T4**: Add data-testid Attributes
- 98 attributes across 18 Vue components
- Naming: `{component-kebab}-{element-description}`
- Examples: `login-oauth-button`, `service-list-edit-button`, `auth-layout-nav-services`
- **T5**: Playwright Installation + Configuration
- `playwright.config.ts` (baseURL, workers:1, no webServer)
- `tests/e2e/auth.setup.ts` (POST /dev-login with XSRF token)
- `tests/e2e/.auth/user.json` (storageState with session cookies)
### Wave 3 — E2E Tests (Partial) ✅
- **T6**: Auth Tests (`auth.spec.ts`) — 5 tests passing
- **T7**: Navigation Tests (`navigation.spec.ts`) — 9 tests passing
---
## REMAINING TASKS
### Wave 3 — E2E Tests (6 tasks)
**Pattern**: Each task creates ONE spec file with ~5-8 tests. All use:
- Category: `quick`
- Skills: `["playwright"]`
- Auth: storageState (authenticated by default)
- German UI: All assertions use German text
#### T8: Service List Tests (`service-list.spec.ts`)
**data-testid references**:
- `service-list-table` — Main table
- `service-list-row-{id}` — Each service row
- `service-list-edit-button` — Edit button
- `service-list-finalize-button` — Finalize button
- `service-list-reopen-button` — Reopen button
- `service-list-download-button` — Download button
- `service-list-empty` — Empty state message
**Tests**:
1. Service list page renders with table
2. Service rows display with correct data structure
3. Edit button navigates to edit page
4. Finalize button shows confirmation dialog
5. Finalized services show reopen/download buttons
6. Empty state displays when no services
**German text**: "Gottesdienste", "Bearbeiten", "Finalisieren", "Wieder öffnen", "Herunterladen"
#### T9: Service Edit — Information Block (`service-edit-information.spec.ts`)
**data-testid references**:
- `information-block-upload-area` — Upload drop zone
- `information-block-thumbnail-{id}` — Thumbnail items
- `information-block-delete-{id}` — Delete buttons
- `information-block-datepicker-{id}` — Expire date pickers
**Tests**:
1. Information block renders with upload area
2. Existing slides display as thumbnails
3. Delete button removes slide
4. Datepicker updates expire date
5. Upload area accepts file selection
**German text**: "Informationen", "Ablaufdatum", "Löschen"
#### T10: Service Edit — Moderation Block (`service-edit-moderation.spec.ts`)
Same pattern as T9 but for moderation block (no datepicker).
#### T11: Service Edit — Sermon Block (`service-edit-sermon.spec.ts`)
Same pattern as T9 but for sermon block (no datepicker).
#### T12: Service Edit — Songs Block (`service-edit-songs.spec.ts`)
**data-testid references**:
- `songs-block-song-row-{id}` — Song rows
- `songs-block-arrangement-select-{id}` — Arrangement dropdown
- `songs-block-add-arrangement-{id}` — Add arrangement button
- `songs-block-clone-arrangement-{id}` — Clone arrangement button
- `songs-block-preview-{id}` — Preview button
- `songs-block-download-{id}` — Download button
- `songs-block-assign-{id}` — Assign song button
- `songs-block-translation-checkbox-{id}` — Translation checkbox
**Tests**:
1. Songs block displays all service songs
2. Matched songs show arrangement selector
3. Unmatched songs show assign button
4. Translation checkbox toggles translation
5. Preview button opens preview modal
6. Download button triggers PDF download
**German text**: "Lieder", "Arrangement", "Vorschau", "Herunterladen", "Zuweisen", "Mit Übersetzung"
#### T13: Service Finalization (`service-finalization.spec.ts`)
**data-testid references**:
- `service-list-finalize-button` — Finalize button
- `service-list-confirm-submit-button` — Confirm button
- `service-list-confirm-cancel-button` — Cancel button
- `service-list-reopen-button` — Reopen button
**Tests**:
1. Finalize button shows confirmation dialog
2. Confirm button finalizes service
3. Cancel button closes dialog without finalizing
4. Finalized service shows reopen button
5. Reopen button reopens service
**German text**: "Finalisieren", "Bestätigen", "Abbrechen", "Wieder öffnen"
---
### Wave 4 — E2E Tests (7 tasks)
#### T14-T19: Song DB Tests
Similar pattern to Wave 3. Each creates one spec file.
#### T20: Full Test Suite Run + Fix Failures
Integration task — run all tests, fix any failures, ensure full suite passes.
---
### Final Verification (4 tasks)
#### F1: Plan Compliance Audit
- Agent: `oracle`
- Verify all plan requirements met
- Check all checkboxes marked correctly
#### F2: Code Quality Review
- Agent: `unspecified-high`
- Review all test code for quality
- Check for anti-patterns, hardcoded values
#### F3: Real Manual QA via Playwright
- Agent: `unspecified-high` + skill `playwright`
- Manually test the app via browser
- Verify all flows work end-to-end
#### F4: Scope Fidelity Check
- Agent: `deep`
- Verify scope matches original requirements
- Check no scope creep occurred
---
## EXECUTION PATTERN
### For Each Task (T8-T19)
1. **Delegate**:
```typescript
task(
category="quick",
load_skills=["playwright"],
run_in_background=false,
description="Create {filename}.spec.ts with E2E tests",
prompt=`[6-section prompt with exact requirements]`
)
```
2. **Verify**:
```bash
# Check file created
ls -la tests/e2e/{filename}.spec.ts
# Run tests
npx playwright test {filename}.spec.ts
# Verify all pass
# Expected: X passed, 0 failed
```
3. **Mark Complete**:
```typescript
Edit(".sisyphus/plans/cts-herd-playwright.md", [
{op: "replace", pos: "{line}#{hash}", lines: "- [x] {task-number}. {task-name}"}
])
```
4. **Commit**:
```bash
git add tests/e2e/{filename}.spec.ts
git commit -m "test(e2e): add {description}
- X tests: {test-list}
- German UI text assertions
- All tests passing"
```
### Parallel Execution
Wave 3 tasks (T8-T13) can run in parallel:
```typescript
// Dispatch all 6 simultaneously
task(category="quick", load_skills=["playwright"], ...) // T8
task(category="quick", load_skills=["playwright"], ...) // T9
task(category="quick", load_skills=["playwright"], ...) // T10
task(category="quick", load_skills=["playwright"], ...) // T11
task(category="quick", load_skills=["playwright"], ...) // T12
task(category="quick", load_skills=["playwright"], ...) // T13
```
---
## CRITICAL PATTERNS
### 6-Section Prompt Template
```markdown
## 1. TASK
Create `tests/e2e/{filename}.spec.ts` with E2E tests for {feature}.
**Exact Task from Plan (Line {line})**: - [ ] {task-number}. {task-name}
## 2. EXPECTED OUTCOME
- [ ] File created: `tests/e2e/{filename}.spec.ts` with ≥ {count} tests
- [ ] Tests cover: {list-of-scenarios}
- [ ] All tests use `data-testid` selectors from Task 4
- [ ] All tests use `storageState` (authenticated)
- [ ] All assertions use German text
- [ ] Verification: `npx playwright test {filename}.spec.ts` → all pass
## 3. REQUIRED TOOLS
- **Read**: Read {component-files} for context
- **Write**: Create `tests/e2e/{filename}.spec.ts`
- **Bash**: Run `npx playwright test {filename}.spec.ts` for verification
## 4. MUST DO
- **Test 1**: {description}
```typescript
test('{name}', async ({ page }) => {
await page.goto('{url}');
await page.waitForLoadState('networkidle');
await expect(page.getByTestId('{testid}')).toBeVisible();
});
```
- [Repeat for each test]
- **Use German Text**: {list-of-german-terms}
- **Save Evidence**: `.sisyphus/evidence/task-{number}-{name}.txt`
- **Append to Notepad**: `.sisyphus/notepads/cts-herd-playwright/learnings.md`
## 5. MUST NOT DO
- **Do NOT** {anti-pattern-1}
- **Do NOT** {anti-pattern-2}
## 6. CONTEXT
### Worktree
- **Path**: `/Users/thorsten/AI/cts-work`
- **App URL**: `http://cts-work.test`
### Inherited Wisdom
- **Test Strategy**: No CTS data assertions, structural patterns only
- **German UI**: All assertions use German with "Du" form
- **data-testid naming**: `{component-kebab}-{element-description}`
- **Auth Setup**: storageState pattern from `tests/e2e/auth.setup.ts`
- **Page Load**: Use `page.waitForLoadState('networkidle')` for reliability
### Dependencies
- ✅ T4: data-testid attributes in {component-list}
- ✅ T5: Playwright infrastructure
- ✅ T6-T7: Test patterns established
### data-testid Reference
- `{testid-1}` — {description}
- `{testid-2}` — {description}
### Verification Command
```bash
cd /Users/thorsten/AI/cts-work
npx playwright test {filename}.spec.ts
```
```
### Test Structure Pattern
```typescript
import { test, expect } from '@playwright/test';
// Test 1: {description}
test('{name}', async ({ page }) => {
await page.goto('{url}');
await page.waitForLoadState('networkidle');
// Verify URL
await expect(page).toHaveURL(/{pattern}/);
// Verify elements visible
await expect(page.getByTestId('{testid}')).toBeVisible();
// Verify German text
await expect(page.getByText('{german-text}')).toBeVisible();
});
// Test 2: {description}
test('{name}', async ({ page }) => {
await page.goto('{url}');
await page.waitForLoadState('networkidle');
// Interact with element
await page.getByTestId('{testid}').click();
// Verify result
await expect(page).toHaveURL(/{pattern}/);
});
```
---
## TROUBLESHOOTING
### Session Timeouts
If task times out after 10 minutes:
1. Check if file was created: `ls -la tests/e2e/{filename}.spec.ts`
2. If created, verify tests: `npx playwright test {filename}.spec.ts`
3. If tests pass, mark complete and commit
4. If tests fail, resume session: `task(session_id="{id}", prompt="fix: {error}")`
### Test Failures
Common issues:
- **Element not found**: Check data-testid spelling in Vue component
- **Timeout**: Increase timeout or add `page.waitForLoadState('networkidle')`
- **Redirect to login**: storageState expired, re-run auth setup: `npx playwright test --project=setup`
### SQLite BUSY Errors
If tests fail with SQLITE_BUSY:
- Verify `workers: 1` in playwright.config.ts
- Verify `fullyParallel: false` in playwright.config.ts
- Stop any running `php artisan serve` processes
---
## VERIFICATION CHECKLIST
Before marking task complete:
- [ ] File created in correct location
- [ ] All tests pass (`npx playwright test {filename}.spec.ts`)
- [ ] German text used in all assertions
- [ ] data-testid selectors used (no CSS selectors)
- [ ] Evidence file saved
- [ ] Notepad updated (if learnings discovered)
- [ ] Plan checkbox marked complete
- [ ] Changes committed with clear message
---
## FINAL DELIVERABLES
When all tasks complete:
- 15 E2E test spec files (~40-50 tests total)
- All tests passing
- All plan checkboxes marked complete
- All changes committed
- Final verification by 4 review agents
- Handoff document for production deployment
---
## CONTACT POINTS
**Plan File**: `.sisyphus/plans/cts-herd-playwright.md` (READ-ONLY for subagents)
**Notepad**: `.sisyphus/notepads/cts-herd-playwright/` (APPEND-ONLY)
**Evidence**: `.sisyphus/evidence/` (CREATE new files)
**Worktree**: `/Users/thorsten/AI/cts-work` (branch: `cts-presenter-app`)
---
**Last Updated**: 2026-03-01 23:10 UTC
**Progress**: 7/24 tasks complete (29.2%)
**Next**: Complete Wave 3 tasks T8-T13 (6 tasks in parallel)