- Create detailed README.md with quick start and demo accounts - Add complete UI primitives documentation with examples - Document architecture patterns and design decisions - Update REBUILD_PLAN.md marking Phase 2 as complete - Include component usage guides and testing documentation - Document accessibility compliance and performance considerations Documentation provides complete developer onboarding experience with practical examples and architectural guidance. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
7.0 KiB
Data Test ID Implementation Guide
Overview
To make our Playwright tests more reliable and maintainable, we should add data-testid attributes to key UI elements. This prevents tests from breaking when CSS classes or text content changes.
Current Test Status
✅ Working Tests (using current selectors):
smoke.spec.ts- Basic functionality validationauth-realistic.spec.ts- Authentication flows using form elements
⚠️ Enhanced Tests (require data-testid attributes):
auth.spec.ts- Full authentication suitenavigation.spec.ts- Navigation and routingtheme.spec.ts- Theme switchingresponsive.spec.ts- Responsive designcomponents.spec.ts- UI components
Implementation Plan
Phase 1: Critical Elements (Authentication)
Add these data-testid attributes to /src/pages/LoginPage.tsx:
// Email input
<Input
id="email"
name="email"
data-testid="email-input"
// ... other props
/>
// Password input
<Input
id="password"
name="password"
data-testid="password-input"
// ... other props
/>
// Password toggle button
<button
type="button"
data-testid="password-toggle"
onClick={() => setShowPassword(!showPassword)}
// ... other props
>
// Remember me checkbox
<input
id="rememberMe"
name="rememberMe"
data-testid="remember-me"
type="checkbox"
// ... other props
/>
// Login button
<Button
type="submit"
data-testid="login-button"
// ... other props
>
// Error alert
{error && (
<Alert variant="error" data-testid="error-message">
// ... content
</Alert>
)}
// Form validation errors
<div data-testid="email-error">Email is required</div>
<div data-testid="password-error">Password is required</div>
Phase 2: Navigation Elements
Add these data-testid attributes to /src/components/layout/Sidebar.tsx:
// Main sidebar container
<div data-testid="sidebar" className={`h-full bg-white/90...`}>
// Navigation links
<Link
to={item.path}
data-testid={`nav-${item.label.toLowerCase()}`}
// ... other props
>
// User profile section
<div data-testid="user-profile">
<img data-testid="user-avatar" />
<p data-testid="user-name">{user.name}</p>
</div>
Add these to /src/components/layout/Header.tsx:
// Header container
<header data-testid="header">
// Mobile menu button
<button data-testid="mobile-menu-button">
// User menu
<div data-testid="user-menu">
<div data-testid="user-dropdown">
<Link data-testid="profile-link">Profile</Link>
<Link data-testid="settings-link">Settings</Link>
<button data-testid="logout-button">Logout</button>
</div>
</div>
// Theme toggle
<button data-testid="theme-toggle">
<MoonIcon data-testid="moon-icon" />
<SunIcon data-testid="sun-icon" />
</button>
Phase 3: Layout Elements
Add these to /src/components/layout/AppLayout.tsx:
// Skip to content link
<a href="#main-content" data-testid="skip-to-content">
// Main content area
<main id="main-content" data-testid="main-content">
// Mobile overlay
<div data-testid="mobile-overlay" />
// Breadcrumb navigation
<nav data-testid="breadcrumb">
Phase 4: Page Elements
Add these to each page component:
// Dashboard page
<div data-testid="dashboard-page">
<h1 data-testid="page-title">Dashboard</h1>
</div>
// Events page
<div data-testid="events-page">
<h1 data-testid="page-title">Events</h1>
<div data-testid="event-card-{eventId}">
</div>
Phase 5: Component Elements
Add these to UI components in /src/components/ui/:
// Button component
<button data-testid={props['data-testid']} />
// Card component
<div data-testid={props['data-testid']} />
// Alert component
<div data-testid={props['data-testid']} role="alert" />
// Modal component
<div data-testid="modal-overlay">
<div data-testid="modal-content">
<button data-testid="modal-close">
</div>
</div>
// Loading components
<div data-testid="loading-spinner" />
<div data-testid="skeleton" />
Testing Naming Conventions
Standard Patterns
- Pages:
{page-name}-page(e.g.,dashboard-page,events-page) - Navigation:
nav-{item}(e.g.,nav-dashboard,nav-events) - Forms:
{field}-input,{field}-error(e.g.,email-input,email-error) - Buttons:
{action}-button(e.g.,login-button,submit-button) - User Interface:
user-{element}(e.g.,user-menu,user-avatar) - Theme:
theme-toggle,theme-{variant} - Modal:
modal-{action}(e.g.,modal-close,modal-confirm) - Cards:
{type}-card-{id}(e.g.,event-card-123)
Component Props Pattern
For reusable components, accept data-testid as a prop:
interface ButtonProps {
'data-testid'?: string;
// ... other props
}
export function Button({ 'data-testid': testId, ...props }: ButtonProps) {
return <button data-testid={testId} {...props} />;
}
Implementation Checklist
Phase 1: Authentication (Critical)
- Login form inputs (
email-input,password-input) - Login form buttons (
login-button,password-toggle) - Form validation (
remember-me,error-message) - Demo account buttons (use existing text selectors)
Phase 2: Navigation (Critical)
- Sidebar container (
sidebar) - Navigation links (
nav-dashboard,nav-events) - User profile (
user-menu,user-name,user-avatar) - Mobile menu (
mobile-menu-button,mobile-overlay)
Phase 3: Layout
- Header elements (
header,theme-toggle) - Main content (
main-content,skip-to-content) - Breadcrumbs (
breadcrumb)
Phase 4: Pages
- Page containers and titles
- Content sections
- Interactive elements
Phase 5: Components
- Update UI components to accept data-testid props
- Add data-testid to complex components (modals, dropdowns)
- Loading and error states
Test Migration Plan
- Run Current Tests: Use
npm run test:smokeandnpm run test:auth-realistic - Add Phase 1 Data-TestIDs: Focus on authentication elements
- Migrate Auth Tests: Switch from form selectors to data-testid
- Add Phase 2 Data-TestIDs: Navigation elements
- Enable Navigation Tests: Update selectors in navigation.spec.ts
- Continue Phases 3-5: Gradually enhance remaining tests
Benefits
✅ Test Reliability: Tests won't break when CSS classes change
✅ Maintainability: Clear intent for test-specific elements
✅ Performance: More efficient element selection
✅ Team Collaboration: Clear contracts between dev and test teams
✅ CI/CD Stability: Reduced flaky test failures
Quick Start
To begin implementation:
- Add data-testid attributes to login form elements
- Run:
npm run test:authto verify tests pass - Gradually add more data-testid attributes following the patterns above
- Update test files to use new selectors