673 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			673 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# ATDD (Acceptance Test-Driven Development) Workflow
 | 
						|
 | 
						|
Generates failing acceptance tests BEFORE implementation following TDD's red-green-refactor cycle. Creates comprehensive test coverage at appropriate levels (E2E, API, Component) with supporting infrastructure (fixtures, factories, mocks) and provides an implementation checklist to guide development toward passing tests.
 | 
						|
 | 
						|
**Core Principle**: Tests fail first (red phase), guide development to green, then enable confident refactoring.
 | 
						|
 | 
						|
## Usage
 | 
						|
 | 
						|
```bash
 | 
						|
bmad tea *atdd
 | 
						|
```
 | 
						|
 | 
						|
The TEA agent runs this workflow when:
 | 
						|
 | 
						|
- User story is approved with clear acceptance criteria
 | 
						|
- Development is about to begin (before any implementation code)
 | 
						|
- Team is practicing Test-Driven Development (TDD)
 | 
						|
- Need to establish test-first contract with DEV team
 | 
						|
 | 
						|
## Inputs
 | 
						|
 | 
						|
**Required Context Files:**
 | 
						|
 | 
						|
- **Story markdown** (`{story_file}`): User story with acceptance criteria, functional requirements, and technical constraints
 | 
						|
- **Framework configuration**: Test framework config (playwright.config.ts or cypress.config.ts) from framework workflow
 | 
						|
 | 
						|
**Workflow Variables:**
 | 
						|
 | 
						|
- `story_file`: Path to story markdown with acceptance criteria (required)
 | 
						|
- `test_dir`: Directory for test files (default: `{project-root}/tests`)
 | 
						|
- `test_framework`: Detected from framework workflow (playwright or cypress)
 | 
						|
- `test_levels`: Which test levels to generate (default: "e2e,api,component")
 | 
						|
- `primary_level`: Primary test level for acceptance criteria (default: "e2e")
 | 
						|
- `start_failing`: Tests must fail initially - red phase (default: true)
 | 
						|
- `use_given_when_then`: BDD-style test structure (default: true)
 | 
						|
- `network_first`: Route interception before navigation to prevent race conditions (default: true)
 | 
						|
- `one_assertion_per_test`: Atomic test design (default: true)
 | 
						|
- `generate_factories`: Create data factory stubs using faker (default: true)
 | 
						|
- `generate_fixtures`: Create fixture architecture with auto-cleanup (default: true)
 | 
						|
- `auto_cleanup`: Fixtures clean up their data automatically (default: true)
 | 
						|
- `include_data_testids`: List required data-testid attributes for DEV (default: true)
 | 
						|
- `include_mock_requirements`: Document mock/stub needs (default: true)
 | 
						|
- `auto_load_knowledge`: Load fixture-architecture, data-factories, component-tdd fragments (default: true)
 | 
						|
- `share_with_dev`: Provide implementation checklist to DEV agent (default: true)
 | 
						|
- `output_checklist`: Path for implementation checklist (default: `{output_folder}/atdd-checklist-{story_id}.md`)
 | 
						|
 | 
						|
**Optional Context:**
 | 
						|
 | 
						|
- **Test design document**: For risk/priority context alignment (P0-P3 scenarios)
 | 
						|
- **Existing fixtures/helpers**: For consistency with established patterns
 | 
						|
- **Architecture documents**: For understanding system boundaries and integration points
 | 
						|
 | 
						|
## Outputs
 | 
						|
 | 
						|
**Primary Deliverable:**
 | 
						|
 | 
						|
- **ATDD Checklist** (`atdd-checklist-{story_id}.md`): Implementation guide containing:
 | 
						|
  - Story summary and acceptance criteria breakdown
 | 
						|
  - Test files created with paths and line counts
 | 
						|
  - Data factories created with patterns
 | 
						|
  - Fixtures created with auto-cleanup logic
 | 
						|
  - Mock requirements for external services
 | 
						|
  - Required data-testid attributes list
 | 
						|
  - Implementation checklist mapping tests to code tasks
 | 
						|
  - Red-green-refactor workflow guidance
 | 
						|
  - Execution commands for running tests
 | 
						|
 | 
						|
**Test Files Created:**
 | 
						|
 | 
						|
- **E2E tests** (`tests/e2e/{feature-name}.spec.ts`): Full user journey tests for critical paths
 | 
						|
- **API tests** (`tests/api/{feature-name}.api.spec.ts`): Business logic and service contract tests
 | 
						|
- **Component tests** (`tests/component/{ComponentName}.test.tsx`): UI component behavior tests
 | 
						|
 | 
						|
**Supporting Infrastructure:**
 | 
						|
 | 
						|
- **Data factories** (`tests/support/factories/{entity}.factory.ts`): Factory functions using @faker-js/faker for generating test data with overrides support
 | 
						|
- **Test fixtures** (`tests/support/fixtures/{feature}.fixture.ts`): Playwright fixtures with setup/teardown and auto-cleanup
 | 
						|
- **Mock/stub documentation**: Requirements for external service mocking (payment gateways, email services, etc.)
 | 
						|
- **data-testid requirements**: List of required test IDs for stable selectors in UI implementation
 | 
						|
 | 
						|
**Validation Safeguards:**
 | 
						|
 | 
						|
- All tests must fail initially (red phase verified by local test run)
 | 
						|
- Failure messages are clear and actionable
 | 
						|
- Tests use Given-When-Then format for readability
 | 
						|
- Network-first pattern applied (route interception before navigation)
 | 
						|
- One assertion per test (atomic test design)
 | 
						|
- No hard waits or sleeps (explicit waits only)
 | 
						|
 | 
						|
## Key Features
 | 
						|
 | 
						|
### Red-Green-Refactor Cycle
 | 
						|
 | 
						|
**RED Phase** (TEA Agent responsibility):
 | 
						|
 | 
						|
- Write failing tests first defining expected behavior
 | 
						|
- Tests fail for right reason (missing implementation, not test bugs)
 | 
						|
- All supporting infrastructure (factories, fixtures, mocks) created
 | 
						|
 | 
						|
**GREEN Phase** (DEV Agent responsibility):
 | 
						|
 | 
						|
- Implement minimal code to pass one test at a time
 | 
						|
- Use implementation checklist as guide
 | 
						|
- Run tests frequently to verify progress
 | 
						|
 | 
						|
**REFACTOR Phase** (DEV Agent responsibility):
 | 
						|
 | 
						|
- Improve code quality with confidence (tests provide safety net)
 | 
						|
- Extract duplications, optimize performance
 | 
						|
- Ensure tests still pass after changes
 | 
						|
 | 
						|
### Test Level Selection Framework
 | 
						|
 | 
						|
**E2E (End-to-End)**:
 | 
						|
 | 
						|
- Critical user journeys (login, checkout, core workflows)
 | 
						|
- Multi-system integration
 | 
						|
- User-facing acceptance criteria
 | 
						|
- Characteristics: High confidence, slow execution, brittle
 | 
						|
 | 
						|
**API (Integration)**:
 | 
						|
 | 
						|
- Business logic validation
 | 
						|
- Service contracts and data transformations
 | 
						|
- Backend integration without UI
 | 
						|
- Characteristics: Fast feedback, good balance, stable
 | 
						|
 | 
						|
**Component**:
 | 
						|
 | 
						|
- UI component behavior (buttons, forms, modals)
 | 
						|
- Interaction testing (click, hover, keyboard navigation)
 | 
						|
- Visual regression and state management
 | 
						|
- Characteristics: Fast, isolated, granular
 | 
						|
 | 
						|
**Unit**:
 | 
						|
 | 
						|
- Pure business logic and algorithms
 | 
						|
- Edge cases and error handling
 | 
						|
- Minimal dependencies
 | 
						|
- Characteristics: Fastest, most granular
 | 
						|
 | 
						|
**Selection Strategy**: Avoid duplicate coverage. Use E2E for critical happy path, API for business logic variations, component for UI edge cases, unit for pure logic.
 | 
						|
 | 
						|
### Recording Mode (NEW - Phase 2.5)
 | 
						|
 | 
						|
**atdd** can record complex UI interactions instead of AI generation.
 | 
						|
 | 
						|
**Activation**: Automatic for complex UI when config.tea_use_mcp_enhancements is true and MCP available
 | 
						|
 | 
						|
- Fallback: AI generation (silent, automatic)
 | 
						|
 | 
						|
**When to Use Recording Mode:**
 | 
						|
 | 
						|
- ✅ Complex UI interactions (drag-drop, multi-step forms, wizards)
 | 
						|
- ✅ Visual workflows (modals, dialogs, animations)
 | 
						|
- ✅ Unclear requirements (exploratory, discovering expected behavior)
 | 
						|
- ✅ Multi-page flows (checkout, registration, onboarding)
 | 
						|
- ❌ NOT for simple CRUD (AI generation faster)
 | 
						|
- ❌ NOT for API-only tests (no UI to record)
 | 
						|
 | 
						|
**When to Use AI Generation (Default):**
 | 
						|
 | 
						|
- ✅ Clear acceptance criteria available
 | 
						|
- ✅ Standard patterns (login, CRUD, navigation)
 | 
						|
- ✅ Need many tests quickly
 | 
						|
- ✅ API/backend tests (no UI interaction)
 | 
						|
 | 
						|
**How Test Generation Works (Default - AI-Based):**
 | 
						|
 | 
						|
TEA generates tests using AI by:
 | 
						|
 | 
						|
1. **Analyzing acceptance criteria** from story markdown
 | 
						|
2. **Inferring selectors** from requirement descriptions (e.g., "login button" → `[data-testid="login-button"]`)
 | 
						|
3. **Synthesizing test code** based on knowledge base patterns
 | 
						|
4. **Estimating interactions** using common UI patterns (click, type, verify)
 | 
						|
5. **Applying best practices** from knowledge fragments (Given-When-Then, network-first, fixtures)
 | 
						|
 | 
						|
**This works well for:**
 | 
						|
 | 
						|
- ✅ Clear requirements with known UI patterns
 | 
						|
- ✅ Standard workflows (login, CRUD, navigation)
 | 
						|
- ✅ When selectors follow conventions (data-testid attributes)
 | 
						|
 | 
						|
**What MCP Adds (Interactive Verification & Enhancement):**
 | 
						|
 | 
						|
When Playwright MCP is available, TEA **additionally**:
 | 
						|
 | 
						|
1. **Verifies generated tests** by:
 | 
						|
   - **Launching real browser** with `generator_setup_page`
 | 
						|
   - **Executing generated test steps** with `browser_*` tools (`navigate`, `click`, `type`)
 | 
						|
   - **Seeing actual UI** with `browser_snapshot` (visual verification)
 | 
						|
   - **Discovering real selectors** with `browser_generate_locator` (auto-generate from live DOM)
 | 
						|
 | 
						|
2. **Enhances AI-generated tests** by:
 | 
						|
   - **Validating selectors exist** in actual DOM (not just guesses)
 | 
						|
   - **Verifying behavior** with `browser_verify_text`, `browser_verify_visible`, `browser_verify_url`
 | 
						|
   - **Capturing actual interaction log** with `generator_read_log`
 | 
						|
   - **Refining test code** with real observed behavior
 | 
						|
 | 
						|
3. **Catches issues early** by:
 | 
						|
   - **Finding missing selectors** before DEV implements (requirements clarification)
 | 
						|
   - **Discovering edge cases** not in requirements (loading states, error messages)
 | 
						|
   - **Validating assumptions** about UI structure and behavior
 | 
						|
 | 
						|
**Key Benefits of MCP Enhancement:**
 | 
						|
 | 
						|
- ✅ **AI generates tests** (fast, based on requirements) **+** **MCP verifies tests** (accurate, based on reality)
 | 
						|
- ✅ **Accurate selectors**: Validated against actual DOM, not just inferred
 | 
						|
- ✅ **Visual validation**: TEA sees what user sees (modals, animations, state changes)
 | 
						|
- ✅ **Complex flows**: Records multi-step interactions precisely
 | 
						|
- ✅ **Edge case discovery**: Observes actual app behavior beyond requirements
 | 
						|
- ✅ **Selector resilience**: MCP generates robust locators from live page (role-based, text-based, fallback chains)
 | 
						|
 | 
						|
**Example Enhancement Flow:**
 | 
						|
 | 
						|
```
 | 
						|
1. AI generates test based on acceptance criteria
 | 
						|
   → await page.click('[data-testid="submit-button"]')
 | 
						|
 | 
						|
2. MCP verifies selector exists (browser_generate_locator)
 | 
						|
   → Found: button[type="submit"].btn-primary
 | 
						|
   → No data-testid attribute exists!
 | 
						|
 | 
						|
3. TEA refines test with actual selector
 | 
						|
   → await page.locator('button[type="submit"]').click()
 | 
						|
   → Documents requirement: "Add data-testid='submit-button' to button"
 | 
						|
```
 | 
						|
 | 
						|
**Recording Workflow (MCP-Based):**
 | 
						|
 | 
						|
```
 | 
						|
1. Set generation_mode: "recording"
 | 
						|
2. Use generator_setup_page to init recording session
 | 
						|
3. For each acceptance criterion:
 | 
						|
   a. Execute scenario with browser_* tools:
 | 
						|
      - browser_navigate, browser_click, browser_type
 | 
						|
      - browser_select, browser_check
 | 
						|
   b. Add verifications with browser_verify_* tools:
 | 
						|
      - browser_verify_text, browser_verify_visible
 | 
						|
      - browser_verify_url
 | 
						|
   c. Capture log with generator_read_log
 | 
						|
   d. Generate test with generator_write_test
 | 
						|
4. Enhance generated tests with knowledge base patterns:
 | 
						|
   - Add Given-When-Then comments
 | 
						|
   - Replace selectors with data-testid
 | 
						|
   - Add network-first interception
 | 
						|
   - Add fixtures/factories
 | 
						|
5. Verify tests fail (RED phase)
 | 
						|
```
 | 
						|
 | 
						|
**Example: Recording a Checkout Flow**
 | 
						|
 | 
						|
```markdown
 | 
						|
Recording session for: "User completes checkout with credit card"
 | 
						|
 | 
						|
Actions recorded:
 | 
						|
 | 
						|
1. browser_navigate('/cart')
 | 
						|
2. browser_click('[data-testid="checkout-button"]')
 | 
						|
3. browser_type('[data-testid="card-number"]', '4242424242424242')
 | 
						|
4. browser_type('[data-testid="expiry"]', '12/25')
 | 
						|
5. browser_type('[data-testid="cvv"]', '123')
 | 
						|
6. browser_click('[data-testid="place-order"]')
 | 
						|
7. browser_verify_text('Order confirmed')
 | 
						|
8. browser_verify_url('/confirmation')
 | 
						|
 | 
						|
Generated test (enhanced):
 | 
						|
 | 
						|
- Given-When-Then structure added
 | 
						|
- data-testid selectors used
 | 
						|
- Network-first payment API mock added
 | 
						|
- Card factory created for test data
 | 
						|
- Test verified to FAIL (checkout not implemented)
 | 
						|
```
 | 
						|
 | 
						|
**Graceful Degradation:**
 | 
						|
 | 
						|
- Recording mode is OPTIONAL (default: AI generation)
 | 
						|
- Requires Playwright MCP (falls back to AI if unavailable)
 | 
						|
- Generated tests enhanced with knowledge base patterns
 | 
						|
- Same quality output regardless of generation method
 | 
						|
 | 
						|
### Given-When-Then Structure
 | 
						|
 | 
						|
All tests follow BDD format for clarity:
 | 
						|
 | 
						|
```typescript
 | 
						|
test('should display error for invalid credentials', async ({ page }) => {
 | 
						|
  // GIVEN: User is on login page
 | 
						|
  await page.goto('/login');
 | 
						|
 | 
						|
  // WHEN: User submits invalid credentials
 | 
						|
  await page.fill('[data-testid="email-input"]', 'invalid@example.com');
 | 
						|
  await page.fill('[data-testid="password-input"]', 'wrongpassword');
 | 
						|
  await page.click('[data-testid="login-button"]');
 | 
						|
 | 
						|
  // THEN: Error message is displayed
 | 
						|
  await expect(page.locator('[data-testid="error-message"]')).toHaveText('Invalid email or password');
 | 
						|
});
 | 
						|
```
 | 
						|
 | 
						|
### Network-First Testing Pattern
 | 
						|
 | 
						|
**Critical pattern to prevent race conditions**:
 | 
						|
 | 
						|
```typescript
 | 
						|
// ✅ CORRECT: Intercept BEFORE navigation
 | 
						|
await page.route('**/api/data', handler);
 | 
						|
await page.goto('/page');
 | 
						|
 | 
						|
// ❌ WRONG: Navigate then intercept (race condition)
 | 
						|
await page.goto('/page');
 | 
						|
await page.route('**/api/data', handler); // Too late!
 | 
						|
```
 | 
						|
 | 
						|
Always set up route interception before navigating to pages that make network requests.
 | 
						|
 | 
						|
### Data Factory Architecture
 | 
						|
 | 
						|
Use faker for all test data generation:
 | 
						|
 | 
						|
```typescript
 | 
						|
// tests/support/factories/user.factory.ts
 | 
						|
import { faker } from '@faker-js/faker';
 | 
						|
 | 
						|
export const createUser = (overrides = {}) => ({
 | 
						|
  id: faker.number.int(),
 | 
						|
  email: faker.internet.email(),
 | 
						|
  name: faker.person.fullName(),
 | 
						|
  createdAt: faker.date.recent().toISOString(),
 | 
						|
  ...overrides,
 | 
						|
});
 | 
						|
 | 
						|
export const createUsers = (count: number) => Array.from({ length: count }, () => createUser());
 | 
						|
```
 | 
						|
 | 
						|
**Factory principles:**
 | 
						|
 | 
						|
- Use faker for random data (no hardcoded values to prevent collisions)
 | 
						|
- Support overrides for specific test scenarios
 | 
						|
- Generate complete valid objects matching API contracts
 | 
						|
- Include helper functions for bulk creation
 | 
						|
 | 
						|
### Fixture Architecture with Auto-Cleanup
 | 
						|
 | 
						|
Playwright fixtures with automatic data cleanup:
 | 
						|
 | 
						|
```typescript
 | 
						|
// tests/support/fixtures/auth.fixture.ts
 | 
						|
import { test as base } from '@playwright/test';
 | 
						|
 | 
						|
export const test = base.extend({
 | 
						|
  authenticatedUser: async ({ page }, use) => {
 | 
						|
    // Setup: Create and authenticate user
 | 
						|
    const user = await createUser();
 | 
						|
    await page.goto('/login');
 | 
						|
    await page.fill('[data-testid="email"]', user.email);
 | 
						|
    await page.fill('[data-testid="password"]', 'password123');
 | 
						|
    await page.click('[data-testid="login-button"]');
 | 
						|
    await page.waitForURL('/dashboard');
 | 
						|
 | 
						|
    // Provide to test
 | 
						|
    await use(user);
 | 
						|
 | 
						|
    // Cleanup: Delete user (automatic)
 | 
						|
    await deleteUser(user.id);
 | 
						|
  },
 | 
						|
});
 | 
						|
```
 | 
						|
 | 
						|
**Fixture principles:**
 | 
						|
 | 
						|
- Auto-cleanup (always delete created data in teardown)
 | 
						|
- Composable (fixtures can use other fixtures via mergeTests)
 | 
						|
- Isolated (each test gets fresh data)
 | 
						|
- Type-safe with TypeScript
 | 
						|
 | 
						|
### One Assertion Per Test (Atomic Design)
 | 
						|
 | 
						|
Each test should verify exactly one behavior:
 | 
						|
 | 
						|
```typescript
 | 
						|
// ✅ CORRECT: One assertion
 | 
						|
test('should display user name', async ({ page }) => {
 | 
						|
  await expect(page.locator('[data-testid="user-name"]')).toHaveText('John');
 | 
						|
});
 | 
						|
 | 
						|
// ❌ WRONG: Multiple assertions (not atomic)
 | 
						|
test('should display user info', async ({ page }) => {
 | 
						|
  await expect(page.locator('[data-testid="user-name"]')).toHaveText('John');
 | 
						|
  await expect(page.locator('[data-testid="user-email"]')).toHaveText('john@example.com');
 | 
						|
});
 | 
						|
```
 | 
						|
 | 
						|
**Why?** If second assertion fails, you don't know if first is still valid. Split into separate tests for clear failure diagnosis.
 | 
						|
 | 
						|
### Implementation Checklist for DEV
 | 
						|
 | 
						|
Maps each failing test to concrete implementation tasks:
 | 
						|
 | 
						|
```markdown
 | 
						|
## Implementation Checklist
 | 
						|
 | 
						|
### Test: User Login with Valid Credentials
 | 
						|
 | 
						|
- [ ] Create `/login` route
 | 
						|
- [ ] Implement login form component
 | 
						|
- [ ] Add email/password validation
 | 
						|
- [ ] Integrate authentication API
 | 
						|
- [ ] Add `data-testid` attributes: `email-input`, `password-input`, `login-button`
 | 
						|
- [ ] Implement error handling
 | 
						|
- [ ] Run test: `npm run test:e2e -- login.spec.ts`
 | 
						|
- [ ] ✅ Test passes (green phase)
 | 
						|
```
 | 
						|
 | 
						|
Provides clear path from red to green for each test.
 | 
						|
 | 
						|
## Integration with Other Workflows
 | 
						|
 | 
						|
**Before this workflow:**
 | 
						|
 | 
						|
- **framework** workflow: Must run first to establish test framework architecture (Playwright or Cypress config, directory structure, base fixtures)
 | 
						|
- **test-design** workflow: Optional but recommended for P0-P3 priority alignment and risk assessment context
 | 
						|
 | 
						|
**After this workflow:**
 | 
						|
 | 
						|
- **DEV agent** implements features guided by failing tests and implementation checklist
 | 
						|
- **test-review** workflow: Review generated test quality before sharing with DEV team
 | 
						|
- **automate** workflow: After story completion, expand regression suite with additional edge case coverage
 | 
						|
 | 
						|
**Coordinates with:**
 | 
						|
 | 
						|
- **Story approval process**: ATDD runs after story is approved but before DEV begins implementation
 | 
						|
- **Quality gates**: Failing tests serve as acceptance criteria for story completion (all tests must pass)
 | 
						|
 | 
						|
## Important Notes
 | 
						|
 | 
						|
### ATDD is Test-First, Not Test-After
 | 
						|
 | 
						|
**Critical timing**: Tests must be written BEFORE any implementation code. This ensures:
 | 
						|
 | 
						|
- Tests define the contract (what needs to be built)
 | 
						|
- Implementation is guided by tests (no over-engineering)
 | 
						|
- Tests verify behavior, not implementation details
 | 
						|
- Confidence in refactoring (tests catch regressions)
 | 
						|
 | 
						|
### All Tests Must Fail Initially
 | 
						|
 | 
						|
**Red phase verification is mandatory**:
 | 
						|
 | 
						|
- Run tests locally after creation to confirm RED phase
 | 
						|
- Failure should be due to missing implementation, not test bugs
 | 
						|
- Failure messages should be clear and actionable
 | 
						|
- Document expected failure messages in ATDD checklist
 | 
						|
 | 
						|
If a test passes before implementation, it's not testing the right thing.
 | 
						|
 | 
						|
### Use data-testid for Stable Selectors
 | 
						|
 | 
						|
**Why data-testid?**
 | 
						|
 | 
						|
- CSS classes change frequently (styling refactors)
 | 
						|
- IDs may not be unique or stable
 | 
						|
- Text content changes with localization
 | 
						|
- data-testid is explicit contract between tests and UI
 | 
						|
 | 
						|
```typescript
 | 
						|
// ✅ CORRECT: Stable selector
 | 
						|
await page.click('[data-testid="login-button"]');
 | 
						|
 | 
						|
// ❌ FRAGILE: Class-based selector
 | 
						|
await page.click('.btn.btn-primary.login-btn');
 | 
						|
```
 | 
						|
 | 
						|
ATDD checklist includes complete list of required data-testid attributes for DEV team.
 | 
						|
 | 
						|
### No Hard Waits or Sleeps
 | 
						|
 | 
						|
**Use explicit waits only**:
 | 
						|
 | 
						|
```typescript
 | 
						|
// ✅ CORRECT: Explicit wait for condition
 | 
						|
await page.waitForSelector('[data-testid="user-name"]');
 | 
						|
await expect(page.locator('[data-testid="user-name"]')).toBeVisible();
 | 
						|
 | 
						|
// ❌ WRONG: Hard wait (flaky, slow)
 | 
						|
await page.waitForTimeout(2000);
 | 
						|
```
 | 
						|
 | 
						|
Playwright's auto-waiting is preferred (expect() automatically waits up to timeout).
 | 
						|
 | 
						|
### Component Tests for Complex UI Only
 | 
						|
 | 
						|
**When to use component tests:**
 | 
						|
 | 
						|
- Complex UI interactions (drag-drop, keyboard navigation)
 | 
						|
- Form validation logic
 | 
						|
- State management within component
 | 
						|
- Visual edge cases
 | 
						|
 | 
						|
**When NOT to use:**
 | 
						|
 | 
						|
- Simple rendering (snapshot tests are sufficient)
 | 
						|
- Integration with backend (use E2E or API tests)
 | 
						|
- Full user journeys (use E2E tests)
 | 
						|
 | 
						|
Component tests are valuable but should complement, not replace, E2E and API tests.
 | 
						|
 | 
						|
### Auto-Cleanup is Non-Negotiable
 | 
						|
 | 
						|
**Every test must clean up its data**:
 | 
						|
 | 
						|
- Use fixtures with automatic teardown
 | 
						|
- Never leave test data in database/storage
 | 
						|
- Each test should be isolated (no shared state)
 | 
						|
 | 
						|
**Cleanup patterns:**
 | 
						|
 | 
						|
- Fixtures: Cleanup in teardown function
 | 
						|
- Factories: Provide deletion helpers
 | 
						|
- Tests: Use `test.afterEach()` for manual cleanup if needed
 | 
						|
 | 
						|
Without auto-cleanup, tests become flaky and depend on execution order.
 | 
						|
 | 
						|
## Knowledge Base References
 | 
						|
 | 
						|
This workflow automatically consults:
 | 
						|
 | 
						|
- **fixture-architecture.md** - Test fixture patterns with setup/teardown and auto-cleanup using Playwright's test.extend()
 | 
						|
- **data-factories.md** - Factory patterns using @faker-js/faker for random test data generation with overrides support
 | 
						|
- **component-tdd.md** - Component test strategies using Playwright Component Testing (@playwright/experimental-ct-react)
 | 
						|
- **network-first.md** - Route interception patterns (intercept before navigation to prevent race conditions)
 | 
						|
- **test-quality.md** - Test design principles (Given-When-Then, one assertion per test, determinism, isolation)
 | 
						|
- **test-levels-framework.md** - Test level selection framework (E2E vs API vs Component vs Unit)
 | 
						|
 | 
						|
See `tea-index.csv` for complete knowledge fragment mapping and additional references.
 | 
						|
 | 
						|
## Example Output
 | 
						|
 | 
						|
After running this workflow, the ATDD checklist will contain:
 | 
						|
 | 
						|
````markdown
 | 
						|
# ATDD Checklist - Epic 3, Story 5: User Authentication
 | 
						|
 | 
						|
## Story Summary
 | 
						|
 | 
						|
As a user, I want to log in with email and password so that I can access my personalized dashboard.
 | 
						|
 | 
						|
## Acceptance Criteria
 | 
						|
 | 
						|
1. User can log in with valid credentials
 | 
						|
2. User sees error message with invalid credentials
 | 
						|
3. User is redirected to dashboard after successful login
 | 
						|
 | 
						|
## Failing Tests Created (RED Phase)
 | 
						|
 | 
						|
### E2E Tests (3 tests)
 | 
						|
 | 
						|
- `tests/e2e/user-authentication.spec.ts` (87 lines)
 | 
						|
  - ✅ should log in with valid credentials (RED - missing /login route)
 | 
						|
  - ✅ should display error for invalid credentials (RED - error message not implemented)
 | 
						|
  - ✅ should redirect to dashboard after login (RED - redirect logic missing)
 | 
						|
 | 
						|
### API Tests (2 tests)
 | 
						|
 | 
						|
- `tests/api/auth.api.spec.ts` (54 lines)
 | 
						|
  - ✅ POST /api/auth/login - should return token for valid credentials (RED - endpoint not implemented)
 | 
						|
  - ✅ POST /api/auth/login - should return 401 for invalid credentials (RED - validation missing)
 | 
						|
 | 
						|
## Data Factories Created
 | 
						|
 | 
						|
- `tests/support/factories/user.factory.ts` - createUser(), createUsers(count)
 | 
						|
 | 
						|
## Fixtures Created
 | 
						|
 | 
						|
- `tests/support/fixtures/auth.fixture.ts` - authenticatedUser fixture with auto-cleanup
 | 
						|
 | 
						|
## Required data-testid Attributes
 | 
						|
 | 
						|
### Login Page
 | 
						|
 | 
						|
- `email-input` - Email input field
 | 
						|
- `password-input` - Password input field
 | 
						|
- `login-button` - Submit button
 | 
						|
- `error-message` - Error message container
 | 
						|
 | 
						|
### Dashboard Page
 | 
						|
 | 
						|
- `user-name` - User name display
 | 
						|
- `logout-button` - Logout button
 | 
						|
 | 
						|
## Implementation Checklist
 | 
						|
 | 
						|
### Test: User Login with Valid Credentials
 | 
						|
 | 
						|
- [ ] Create `/login` route
 | 
						|
- [ ] Implement login form component
 | 
						|
- [ ] Add email/password validation
 | 
						|
- [ ] Integrate authentication API
 | 
						|
- [ ] Add data-testid attributes: `email-input`, `password-input`, `login-button`
 | 
						|
- [ ] Run test: `npm run test:e2e -- user-authentication.spec.ts`
 | 
						|
- [ ] ✅ Test passes (green phase)
 | 
						|
 | 
						|
### Test: Display Error for Invalid Credentials
 | 
						|
 | 
						|
- [ ] Add error state management
 | 
						|
- [ ] Display error message UI
 | 
						|
- [ ] Add `data-testid="error-message"`
 | 
						|
- [ ] Run test: `npm run test:e2e -- user-authentication.spec.ts`
 | 
						|
- [ ] ✅ Test passes (green phase)
 | 
						|
 | 
						|
### Test: Redirect to Dashboard After Login
 | 
						|
 | 
						|
- [ ] Implement redirect logic after successful auth
 | 
						|
- [ ] Verify authentication token stored
 | 
						|
- [ ] Add dashboard route protection
 | 
						|
- [ ] Run test: `npm run test:e2e -- user-authentication.spec.ts`
 | 
						|
- [ ] ✅ Test passes (green phase)
 | 
						|
 | 
						|
## Running Tests
 | 
						|
 | 
						|
```bash
 | 
						|
# Run all failing tests
 | 
						|
npm run test:e2e
 | 
						|
 | 
						|
# Run specific test file
 | 
						|
npm run test:e2e -- user-authentication.spec.ts
 | 
						|
 | 
						|
# Run tests in headed mode (see browser)
 | 
						|
npm run test:e2e -- --headed
 | 
						|
 | 
						|
# Debug specific test
 | 
						|
npm run test:e2e -- user-authentication.spec.ts --debug
 | 
						|
```
 | 
						|
````
 | 
						|
 | 
						|
## Red-Green-Refactor Workflow
 | 
						|
 | 
						|
**RED Phase** (Complete):
 | 
						|
 | 
						|
- ✅ All tests written and failing
 | 
						|
- ✅ Fixtures and factories created
 | 
						|
- ✅ data-testid requirements documented
 | 
						|
 | 
						|
**GREEN Phase** (DEV Team - Next Steps):
 | 
						|
 | 
						|
1. Pick one failing test from checklist
 | 
						|
2. Implement minimal code to make it pass
 | 
						|
3. Run test to verify green
 | 
						|
4. Check off task in checklist
 | 
						|
5. Move to next test
 | 
						|
6. Repeat until all tests pass
 | 
						|
 | 
						|
**REFACTOR Phase** (DEV Team - After All Tests Pass):
 | 
						|
 | 
						|
1. All tests passing (green)
 | 
						|
2. Improve code quality (extract functions, optimize)
 | 
						|
3. Remove duplications
 | 
						|
4. Ensure tests still pass after each refactor
 | 
						|
 | 
						|
## Next Steps
 | 
						|
 | 
						|
1. Review this checklist with team
 | 
						|
2. Run failing tests to confirm RED phase: `npm run test:e2e`
 | 
						|
3. Begin implementation using checklist as guide
 | 
						|
4. Share progress in daily standup
 | 
						|
5. When all tests pass, run `bmad sm story-done` to move story to DONE
 | 
						|
 | 
						|
```
 | 
						|
 | 
						|
This comprehensive checklist guides DEV team from red to green with clear tasks and validation steps.
 | 
						|
```
 |