diff --git a/frontend/e2e/auth-login.spec.ts b/frontend/e2e/auth-login.spec.ts index 4de6f66..95848a6 100644 --- a/frontend/e2e/auth-login.spec.ts +++ b/frontend/e2e/auth-login.spec.ts @@ -76,21 +76,29 @@ test.describe('Login Flow', () => { }); test('should navigate to forgot password page', async ({ page }) => { - // Click forgot password link - await page.getByRole('link', { name: 'Forgot password?' }).click(); - await page.waitForTimeout(1000); + // Click forgot password link - use Promise.all to wait for navigation + const forgotLink = page.getByRole('link', { name: 'Forgot password?' }); - // Should navigate to password reset page + await Promise.all([ + page.waitForURL('/password-reset', { timeout: 10000 }), + forgotLink.click() + ]); + + // Should be on password reset page await expect(page).toHaveURL('/password-reset'); await expect(page.locator('h2')).toContainText('Reset your password'); }); test('should navigate to register page', async ({ page }) => { - // Click sign up link - await page.getByRole('link', { name: 'Sign up' }).click(); - await page.waitForTimeout(1000); + // Click sign up link - use Promise.all to wait for navigation + const signupLink = page.getByRole('link', { name: 'Sign up' }); - // Should navigate to register page + await Promise.all([ + page.waitForURL('/register', { timeout: 10000 }), + signupLink.click() + ]); + + // Should be on register page await expect(page).toHaveURL('/register'); await expect(page.locator('h2')).toContainText('Create your account'); }); diff --git a/frontend/e2e/auth-password-reset.spec.ts b/frontend/e2e/auth-password-reset.spec.ts index 711c338..549b3d1 100644 --- a/frontend/e2e/auth-password-reset.spec.ts +++ b/frontend/e2e/auth-password-reset.spec.ts @@ -24,7 +24,8 @@ test.describe('Password Reset Request Flow', () => { await page.waitForTimeout(1000); // Should stay on password reset page (validation failed) - await expect(page).toHaveURL('/password-reset'); + // URL might have query params, so use regex + await expect(page).toHaveURL(/\/password-reset/); }); test('should show validation error for invalid email', async ({ page }) => { @@ -51,14 +52,15 @@ test.describe('Password Reset Request Flow', () => { }); test('should navigate back to login page', async ({ page }) => { - // Click back to login link + // Click back to login link - use Promise.all to wait for navigation const loginLink = page.getByRole('link', { name: 'Back to login' }); - await loginLink.click(); - // Wait for navigation - await page.waitForTimeout(1000); + await Promise.all([ + page.waitForURL('/login', { timeout: 10000 }), + loginLink.click() + ]); - // Should navigate to login page + // Should be on login page await expect(page).toHaveURL('/login'); await expect(page.locator('h2')).toContainText('Sign in to your account'); }); @@ -191,10 +193,15 @@ test.describe('Password Reset Confirm Flow', () => { // Navigate without token to trigger error state await page.goto('/password-reset/confirm'); - // Click request new reset link - use specific link selector - await page.getByRole('link', { name: 'Request new reset link' }).click(); + // Click request new reset link - use Promise.all to wait for navigation + const resetLink = page.getByRole('link', { name: 'Request new reset link' }); - // Should navigate to password reset request page + await Promise.all([ + page.waitForURL('/password-reset', { timeout: 10000 }), + resetLink.click() + ]); + + // Should be on password reset request page await expect(page).toHaveURL('/password-reset'); await expect(page.locator('h2')).toContainText('Reset your password'); }); diff --git a/frontend/e2e/auth-register.spec.ts b/frontend/e2e/auth-register.spec.ts index be54ba0..d4ca1ab 100644 --- a/frontend/e2e/auth-register.spec.ts +++ b/frontend/e2e/auth-register.spec.ts @@ -47,7 +47,8 @@ test.describe('Registration Flow', () => { await page.waitForTimeout(1000); // Should stay on register page (validation failed) - await expect(page).toHaveURL('/register'); + // URL might have query params, so use regex + await expect(page).toHaveURL(/\/register/); }); test('should show validation error for short first name', async ({ page }) => { @@ -92,7 +93,8 @@ test.describe('Registration Flow', () => { await page.waitForTimeout(1000); // Should stay on register page (validation failed) - await expect(page).toHaveURL('/register'); + // URL might have query params, so use regex + await expect(page).toHaveURL(/\/register/); }); test('should show error for duplicate email', async ({ page }) => { diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts index 8dcbd3e..03f6aa9 100644 --- a/frontend/playwright.config.ts +++ b/frontend/playwright.config.ts @@ -18,7 +18,7 @@ export default defineConfig({ /* Retry on CI and locally to handle flaky tests */ retries: process.env.CI ? 2 : 1, /* Limit workers to prevent test interference */ - workers: process.env.CI ? 1 : 4, + workers: process.env.CI ? 1 : 12, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: 'html', /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */