import { test, expect } from '@playwright/test'; /* * Test Template for Playwright E2E Tests * * Copy this file and replace: * - {{capability}} with the capability name (e.g., 'authentication') * - {{scenario_description}} with the spec scenario description * * Mark pending tests with test.fixme() during Red Phase * Remove test.fixme() and implement during Green Phase */ test.describe('{{capability}} Flow', () => { test.beforeEach(async ({ page }) => { // Setup: Navigate to base URL, login, etc. await page.goto('/'); }); /* * Scenario: {{scenario_description}} * * Spec Reference: specs/{{capability}}/spec.md * Scenario: {{scenario_number}} */ test('{{scenario_description}}', async ({ page }) => { // Arrange (GIVEN) // Set up initial state await page.goto('/{{route}}'); // Act (WHEN) // Perform user actions await page.fill('[name="email"]', 'test@example.com'); await page.fill('[name="password"]', 'password'); await page.click('button[type="submit"]'); // Assert (THEN) // Verify expected outcome await expect(page).toHaveURL('/dashboard'); await expect(page.locator('[data-testid="success-message"]')).toBeVisible(); await expect(page.locator('[data-testid="user-name"]')).toContainText('Test User'); }); /* * Example: Error scenario */ test('displays error when {{error_condition}}', async ({ page }) => { // Arrange await page.goto('/{{route}}'); // Act await page.fill('[name="email"]', 'invalid@example.com'); await page.fill('[name="password"]', 'wrongpassword'); await page.click('button[type="submit"]'); // Assert await expect(page.locator('[data-testid="error-message"]')).toBeVisible(); await expect(page.locator('[data-testid="error-message"]')).toContainText('Invalid credentials'); await expect(page).toHaveURL('/{{route}}'); }); /* * Example: Form validation */ test('validates required fields', async ({ page }) => { // Arrange await page.goto('/{{route}}'); // Act await page.click('button[type="submit"]'); // Assert await expect(page.locator('[data-testid="error-email"]')).toContainText('Email is required'); await expect(page.locator('[data-testid="error-password"]')).toContainText('Password is required'); }); /* * Example: CRUD operation */ test('completes full {{resource}} CRUD flow', async ({ page }) => { // Create await page.goto('/{{resource}}/new'); await page.fill('[name="name"]', 'Test {{resource}}'); await page.click('button[type="submit"]'); await expect(page.locator('[data-testid="success-message"]')).toBeVisible(); // Read await page.goto('/{{resource}}'); await expect(page.locator('text=Test {{resource}}')).toBeVisible(); // Update await page.click('[data-testid="edit-{{resource}}"]'); await page.fill('[name="name"]', 'Updated {{resource}}'); await page.click('button[type="submit"]'); await expect(page.locator('[data-testid="success-message"]')).toBeVisible(); // Delete await page.click('[data-testid="delete-{{resource}}"]'); await page.click('[data-testid="confirm-delete"]'); await expect(page.locator('text=Updated {{resource}}')).not.toBeVisible(); }); /* * Example: RBAC test */ test('restricts access based on role', async ({ page }) => { // Login as developer (limited permissions) await loginAs(page, 'developer'); // Try to access admin page await page.goto('/admin/{{resource}}'); // Should be redirected or show access denied await expect(page.locator('[data-testid="access-denied"]')).toBeVisible(); }); }); /* * Helper functions */ async function loginAs(page, role: string) { await page.goto('/login'); await page.fill('[name="email"]', `${role}@example.com`); await page.fill('[name="password"]', 'password'); await page.click('button[type="submit"]'); await expect(page).toHaveURL('/dashboard'); } async function create{{model}}(page, data: object) { await page.goto('/{{resource}}/new'); for (const [key, value] of Object.entries(data)) { await page.fill(`[name="${key}"]`, value); } await page.click('button[type="submit"]'); }