Les enseignants ont besoin de moyennes à jour immédiatement après la publication ou modification des notes, sans attendre un batch nocturne. Le système recalcule via Domain Events synchrones : statistiques d'évaluation (min/max/moyenne/médiane), moyennes matières pondérées (normalisation /20), et moyenne générale par élève. Les résultats sont stockés dans des tables dénormalisées avec cache Redis (TTL 5 min). Trois endpoints API exposent les données avec contrôle d'accès par rôle. Une commande console permet le backfill des données historiques au déploiement.
214 lines
6.3 KiB
Markdown
214 lines
6.3 KiB
Markdown
---
|
|
name: 'step-03b-subagent-e2e'
|
|
description: 'Subagent: Generate E2E tests only'
|
|
subagent: true
|
|
outputFile: '/tmp/tea-automate-e2e-tests-{{timestamp}}.json'
|
|
---
|
|
|
|
# Subagent 3B: Generate E2E Tests
|
|
|
|
## SUBAGENT CONTEXT
|
|
|
|
This is an **isolated subagent** running in parallel with API test generation.
|
|
|
|
**What you have from parent workflow:**
|
|
|
|
- Target features/user journeys identified in Step 2
|
|
- Knowledge fragments loaded: fixture-architecture, network-first, selector-resilience, playwright-cli
|
|
- Config: test framework, Playwright Utils enabled/disabled
|
|
- Coverage plan: which user journeys need E2E testing
|
|
|
|
**Your task:** Generate E2E tests ONLY (not API, not fixtures, not other test types).
|
|
|
|
---
|
|
|
|
## MANDATORY EXECUTION RULES
|
|
|
|
- 📖 Read this entire subagent file before acting
|
|
- ✅ Generate E2E tests ONLY
|
|
- ✅ Output structured JSON to temp file
|
|
- ✅ Follow knowledge fragment patterns
|
|
- ❌ Do NOT generate API tests (that's subagent 3A)
|
|
- ❌ Do NOT run tests (that's step 4)
|
|
- ❌ Do NOT generate fixtures yet (that's step 3C aggregation)
|
|
|
|
---
|
|
|
|
## SUBAGENT TASK
|
|
|
|
### 1. Identify User Journeys
|
|
|
|
From the coverage plan (Step 2 output), identify:
|
|
|
|
- Which user journeys need E2E coverage
|
|
- Critical user paths (authentication, checkout, profile, etc.)
|
|
- UI interactions required
|
|
- Expected visual states
|
|
|
|
### 2. Browser Interaction (Selector Verification)
|
|
|
|
**Automation mode:** `config.tea_browser_automation`
|
|
|
|
If `auto` (fall back to MCP if CLI unavailable; if neither available, generate from best practices):
|
|
|
|
- Open the target page first, then verify selectors with a snapshot:
|
|
`playwright-cli -s=tea-automate-{{timestamp}} open <target_url>`
|
|
`playwright-cli -s=tea-automate-{{timestamp}} snapshot` → map refs to Playwright locators
|
|
- ref `{role: "button", name: "Submit"}` → `page.getByRole('button', { name: 'Submit' })`
|
|
- ref `{role: "textbox", name: "Email"}` → `page.getByRole('textbox', { name: 'Email' })`
|
|
- `playwright-cli -s=tea-automate-{{timestamp}} close` when done
|
|
|
|
If `cli` (CLI only — do NOT fall back to MCP; generate from best practices if CLI unavailable):
|
|
|
|
- Open the target page first, then verify selectors with a snapshot:
|
|
`playwright-cli -s=tea-automate-{{timestamp}} open <target_url>`
|
|
`playwright-cli -s=tea-automate-{{timestamp}} snapshot` → map refs to Playwright locators
|
|
- ref `{role: "button", name: "Submit"}` → `page.getByRole('button', { name: 'Submit' })`
|
|
- ref `{role: "textbox", name: "Email"}` → `page.getByRole('textbox', { name: 'Email' })`
|
|
- `playwright-cli -s=tea-automate-{{timestamp}} close` when done
|
|
|
|
> **Session Hygiene:** Always close sessions using `playwright-cli -s=tea-automate-{{timestamp}} close`. Do NOT use `close-all` — it kills every session on the machine and breaks parallel execution.
|
|
|
|
If `mcp`:
|
|
|
|
- Use MCP tools for selector verification (current behavior)
|
|
|
|
If `none`:
|
|
|
|
- Generate selectors from best practices without browser verification
|
|
|
|
### 3. Generate E2E Test Files
|
|
|
|
For each user journey, create test file in `tests/e2e/[feature].spec.ts`:
|
|
|
|
**Test Structure:**
|
|
|
|
```typescript
|
|
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('[Feature] E2E User Journey', () => {
|
|
test('[P0] should complete [user journey]', async ({ page }) => {
|
|
// Navigate to starting point
|
|
await page.goto('/feature');
|
|
|
|
// Interact with UI
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
|
|
// Assert expected state
|
|
await expect(page.getByText('Success')).toBeVisible();
|
|
});
|
|
|
|
test('[P1] should handle [edge case]', async ({ page }) => {
|
|
// Test edge case scenario
|
|
});
|
|
});
|
|
```
|
|
|
|
**Requirements:**
|
|
|
|
- ✅ Follow fixture architecture patterns (from fixture-architecture fragment)
|
|
- ✅ Use network-first patterns: intercept before navigate (from network-first fragment)
|
|
- ✅ Use resilient selectors: getByRole, getByText, getByLabel (from selector-resilience fragment)
|
|
- ✅ Include priority tags [P0], [P1], [P2], [P3]
|
|
- ✅ Test complete user journeys (not isolated clicks)
|
|
- ✅ Use proper TypeScript types
|
|
- ✅ Deterministic waits (no hard sleeps, use expect().toBeVisible())
|
|
|
|
### 4. Track Fixture Needs
|
|
|
|
Identify fixtures needed for E2E tests:
|
|
|
|
- Page object models (if complex)
|
|
- Authentication fixtures (logged-in user state)
|
|
- Network mocks/intercepts
|
|
- Test data fixtures
|
|
|
|
**Do NOT create fixtures yet** - just track what's needed for aggregation step.
|
|
|
|
---
|
|
|
|
## OUTPUT FORMAT
|
|
|
|
Write JSON to temp file: `/tmp/tea-automate-e2e-tests-{{timestamp}}.json`
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"subagent": "e2e-tests",
|
|
"tests": [
|
|
{
|
|
"file": "tests/e2e/authentication.spec.ts",
|
|
"content": "[full TypeScript test file content]",
|
|
"description": "E2E tests for user authentication journey",
|
|
"priority_coverage": {
|
|
"P0": 2,
|
|
"P1": 3,
|
|
"P2": 2,
|
|
"P3": 0
|
|
}
|
|
},
|
|
{
|
|
"file": "tests/e2e/checkout.spec.ts",
|
|
"content": "[full TypeScript test file content]",
|
|
"description": "E2E tests for checkout journey",
|
|
"priority_coverage": {
|
|
"P0": 3,
|
|
"P1": 2,
|
|
"P2": 1,
|
|
"P3": 0
|
|
}
|
|
}
|
|
],
|
|
"fixture_needs": ["authenticatedUserFixture", "paymentMockFixture", "checkoutDataFixture"],
|
|
"knowledge_fragments_used": ["fixture-architecture", "network-first", "selector-resilience", "playwright-cli"],
|
|
"test_count": 15,
|
|
"summary": "Generated 15 E2E test cases covering 5 user journeys"
|
|
}
|
|
```
|
|
|
|
**On Error:**
|
|
|
|
```json
|
|
{
|
|
"success": false,
|
|
"subagent": "e2e-tests",
|
|
"error": "Error message describing what went wrong",
|
|
"partial_output": {
|
|
/* any tests generated before error */
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## EXIT CONDITION
|
|
|
|
Subagent completes when:
|
|
|
|
- ✅ All user journeys have E2E test files generated
|
|
- ✅ All tests follow knowledge fragment patterns
|
|
- ✅ JSON output written to temp file
|
|
- ✅ Fixture needs tracked
|
|
|
|
**Subagent terminates here.** Parent workflow will read output and proceed to aggregation.
|
|
|
|
---
|
|
|
|
## 🚨 SUBAGENT SUCCESS METRICS
|
|
|
|
### ✅ SUCCESS:
|
|
|
|
- All E2E tests generated following patterns
|
|
- JSON output valid and complete
|
|
- No API/component/unit tests included (out of scope)
|
|
- Resilient selectors used (getByRole, getByText)
|
|
- Network-first patterns applied (intercept before navigate)
|
|
|
|
### ❌ FAILURE:
|
|
|
|
- Generated tests other than E2E tests
|
|
- Did not follow knowledge fragment patterns
|
|
- Invalid or missing JSON output
|
|
- Ran tests (not subagent responsibility)
|
|
- Used brittle selectors (CSS classes, XPath)
|