Spaces:
Sleeping
Sleeping
| # Playwright Test Strategy with First-User Testing | |
| ## Overview | |
| This project uses Playwright's project dependencies to orchestrate complex test scenarios including first-user admin role testing. | |
| ## Test Execution Flow | |
| ```mermaid | |
| graph TD | |
| A[Start Tests] --> B{First User Tests?} | |
| B -->|Yes| C[first-user-setup] | |
| C --> D[Clear Database] | |
| D --> E[first-user tests] | |
| E --> F[Test Admin Role Assignment] | |
| F --> G[setup] | |
| B -->|No/Skip| G[setup] | |
| G --> H[Seed Test Users] | |
| H --> I[Create Auth States] | |
| I --> J[chromium tests] | |
| I --> K[admin tests] | |
| I --> L[mobile tests] | |
| ``` | |
| ## Available Test Commands | |
| ### Run Everything (First-User + Standard Tests) | |
| ```bash | |
| pnpm test:e2e:all | |
| # or just | |
| pnpm test:e2e | |
| ``` | |
| This runs: | |
| 1. First-user tests with clean database | |
| 2. Seeds test users | |
| 3. Runs all standard tests | |
| ### Run Only First-User Tests | |
| ```bash | |
| pnpm test:e2e:first-user | |
| ``` | |
| This runs: | |
| 1. Clears database | |
| 2. Tests first user gets admin role | |
| 3. Tests second user gets regular role | |
| ### Run Only Standard Tests (Skip First-User) | |
| ```bash | |
| pnpm test:e2e:standard | |
| ``` | |
| This runs: | |
| 1. Seeds test users (if needed) | |
| 2. Creates auth states | |
| 3. Runs chromium + admin tests | |
| ### Run with UI | |
| ```bash | |
| pnpm test:e2e:ui | |
| ``` | |
| Opens Playwright UI to run/debug any test configuration | |
| ## Project Configuration | |
| ### `first-user-setup` Project | |
| - **Purpose**: Clear database for first-user testing | |
| - **File**: `tests/lifecycle/first-user.setup.ts` | |
| - **Runs**: Before first-user tests only | |
| ### `first-user` Project | |
| - **Purpose**: Test first user admin role assignment | |
| - **File**: `tests/auth/first-user-admin.spec.ts` | |
| - **Dependencies**: `first-user-setup` | |
| - **Database State**: Empty (0 users) | |
| ### `setup` Project | |
| - **Purpose**: Seed users and create auth states | |
| - **File**: `tests/lifecycle/auth-states.setup.ts` | |
| - **Dependencies**: `first-user` (unless SKIP_FIRST_USER_TEST=1) | |
| - **Database State**: Populated with test users | |
| ### `chromium` Project | |
| - **Purpose**: Standard browser tests | |
| - **Dependencies**: `setup` | |
| - **Database State**: Seeded with test users | |
| ### `admin` Project | |
| - **Purpose**: Admin functionality tests | |
| - **Dependencies**: `setup` | |
| - **Database State**: Seeded with admin user | |
| ## Environment Variables | |
| ### `SKIP_FIRST_USER_TEST=1` | |
| Skip first-user tests and go straight to standard tests. | |
| Useful for faster testing when not changing auth logic. | |
| ```bash | |
| SKIP_FIRST_USER_TEST=1 pnpm test:e2e | |
| ``` | |
| ## How It Works | |
| ### 1. Database State Management | |
| The projects handle database state transitions: | |
| - **Clean → First-User Tests → Seeded → Standard Tests** | |
| ### 2. Dependency Chain | |
| Playwright ensures tests run in the correct order: | |
| ``` | |
| first-user-setup → first-user → setup → [chromium, admin, mobile] | |
| ``` | |
| ### 3. Smart Seeding | |
| The `setup` project checks if users exist before seeding: | |
| - If < 3 users: Runs seed script | |
| - If ≥ 3 users: Skips seeding | |
| ### 4. Auth State Creation | |
| After seeding, `setup` creates browser auth states for: | |
| - Admin user | |
| - Editor user | |
| - Regular user | |
| These are saved as JSON files and reused by other tests. | |
| ## Troubleshooting | |
| ### Tests fail with "User already exists" | |
| The database has leftover data. Run: | |
| ```bash | |
| pnpm test:e2e:clean # Clean all test data | |
| pnpm test:e2e # Run tests fresh | |
| ``` | |
| ### First-user not getting admin role | |
| 1. Check Better Auth hook is enabled in `auth-instance.ts` | |
| 2. Verify database is truly empty before test | |
| 3. Check logs for "User creation hook" message | |
| ### Tests hanging on sign-in | |
| 1. Check for translation errors in console | |
| 2. Verify no duplicate keys in `messages/en.json` | |
| 3. Check for circular dependencies in role definitions | |
| ### Want to skip first-user tests | |
| ```bash | |
| pnpm test:e2e:standard | |
| # or | |
| SKIP_FIRST_USER_TEST=1 pnpm test:e2e | |
| ``` | |
| ## Best Practices | |
| 1. **Don't mix test types**: First-user tests need empty DB, standard tests need seeded DB | |
| 2. **Use projects for dependencies**: Let Playwright handle the orchestration | |
| 3. **Check logs**: Each setup phase logs its actions for debugging | |
| 4. **Clean state for CI**: CI should always run full suite to ensure clean state | |
| ## CI Configuration | |
| ```yaml | |
| # Example GitHub Actions | |
| - name: Run E2E Tests | |
| run: | | |
| # Always run full suite in CI for consistency | |
| pnpm test:e2e:all | |
| ``` | |
| This ensures CI always tests: | |
| 1. First-user admin assignment | |
| 2. All standard functionality | |
| 3. Admin features | |
| 4. Mobile responsiveness |