← Tasks
[TEST-02] Integration tests for Auth Flow (retry 1)
completedcode_genP0
Description
## TEST-02: Integration tests for Auth Flow
Section: Testing | Milestone: M2 | Owner: None
### Failing Tests
- **auth_flow_e2e_test** (grep): Pattern `loginTest|authFlow` in `e2e/**/*.spec.ts` (need 1+ matches)
### Acceptance Criteria
- File matching `e2e/**/*.spec.ts` must contain pattern `loginTest|authFlow`
### Codebase Conventions
- Trilingual comments: // EN: ... // VI: ... // ES: ...
- SPEC section refs in comments
- Zod at module level with .safeParse()
- (supabase as any) with eslint-disable
- NextResponse.json() responses
- Error format: { error: 'message' }
### Dependencies
- UI-01: FAIL
- API-01: FAIL
Assignee
-
Claimed By
Cloud Lu → Claude Sonnet
Created
1d ago
Completed
1d ago
Quality
Overall
85%
Pass
PASS
Graded By
-
Graded At
-
Cost
Input Tokens
-
Output Tokens
-
Est. USD
-
Result
{
"cost": {
"input_tokens": 228,
"estimated_usd": 0.134079,
"output_tokens": 8893
},
"model": "claude-sonnet-4-20250514",
"status": "success",
"transport": "anthropic_api",
"latency_ms": 93796,
"response_text": "I'll create comprehensive integration tests for the authentication flow. Let me start by creating the necessary E2E test files.\n\n```typescript\n// e2e/auth/auth-flow.spec.ts\n// EN: End-to-end authentication flow integration tests\n// VI: Kiểm thử tích hợp luồng xác thực đầu cuối\n// ES: Pruebas de integración de flujo de autenticación de extremo a extremo\n// SPEC: TEST-02 - Integration tests for Auth Flow\n\nimport { test, expect, type Page } from '@playwright/test';\nimport { z } from 'zod';\n\n// EN: Auth flow test data validation schema\n// VI: Lược đồ xác thực dữ liệu kiểm thử luồng xác thực\n// ES: Esquema de validación de datos de prueba de flujo de autenticación\nconst AuthTestDataSchema = z.object({\n email: z.string().email(),\n password: z.string().min(6),\n name: z.string().min(2)\n});\n\nconst LoginTestDataSchema = z.object({\n email: z.string().email(),\n password: z.string().min(6)\n});\n\n// EN: Test data for authentication flows\n// VI: Dữ liệu kiểm thử cho các luồng xác thực\n// ES: Datos de prueba para flujos de autenticación\nconst testUsers = {\n validUser: {\n email: 'test@example.com',\n password: 'password123',\n name: 'Test User'\n },\n invalidUser: {\n email: 'invalid@example.com',\n password: 'wrongpassword',\n name: 'Invalid User'\n }\n};\n\ntest.describe('Authentication Flow Integration Tests', () => {\n test.beforeEach(async ({ page }) => {\n // EN: Navigate to home page before each test\n // VI: Điều hướng đến trang chủ trước mỗi kiểm thử\n // ES: Navegar a la página de inicio antes de cada prueba\n await page.goto('/');\n });\n\n test('loginTest: Complete login flow with valid credentials', async ({ page }) => {\n // EN: Validate test data structure\n // VI: Xác thực cấu trúc dữ liệu kiểm thử\n // ES: Validar estructura de datos de prueba\n const validationResult = LoginTestDataSchema.safeParse(testUsers.validUser);\n expect(validationResult.success).toBe(true);\n\n // EN: Navigate to login page\n // VI: Điều hướng đến trang đăng nhập\n // ES: Navegar a la página de inicio de sesión\n await page.click('[data-testid=\"login-button\"]');\n await expect(page).toHaveURL('/auth/login');\n\n // EN: Fill login form with valid credentials\n // VI: Điền form đăng nhập với thông tin hợp lệ\n // ES: Llenar formulario de inicio de sesión con credenciales válidas\n await page.fill('[data-testid=\"email-input\"]', testUsers.validUser.email);\n await page.fill('[data-testid=\"password-input\"]', testUsers.validUser.password);\n\n // EN: Submit login form\n // VI: Gửi form đăng nhập\n // ES: Enviar formulario de inicio de sesión\n await page.click('[data-testid=\"submit-login\"]');\n\n // EN: Wait for successful login redirect\n // VI: Đợi chuyển hướng sau đăng nhập thành công\n // ES: Esperar redirección después del inicio de sesión exitoso\n await expect(page).toHaveURL('/dashboard');\n \n // EN: Verify user is logged in\n // VI: Xác minh người dùng đã đăng nhập\n // ES: Verificar que el usuario ha iniciado sesión\n await expect(page.locator('[data-testid=\"user-menu\"]')).toBeVisible();\n await expect(page.locator('[data-testid=\"logout-button\"]')).toBeVisible();\n });\n\n test('loginTest: Login flow with invalid credentials shows error', async ({ page }) => {\n // EN: Validate test data structure\n // VI: Xác thực cấu trúc dữ liệu kiểm thử\n // ES: Validar estructura de datos de prueba\n const validationResult = LoginTestDataSchema.safeParse(testUsers.invalidUser);\n expect(validationResult.success).toBe(true);\n\n // EN: Navigate to login page\n // VI: Điều hướng đến trang đăng nhập\n // ES: Navegar a la página de inicio de sesión\n await page.goto('/auth/login');\n\n // EN: Fill login form with invalid credentials\n // VI: Điền form đăng nhập với thông tin không hợp lệ\n // ES: Llenar formulario con credenciales inválidas\n await page.fill('[data-testid=\"email-input\"]', testUsers.invalidUser.email);\n await page.fill('[data-testid=\"password-input\"]', testUsers.invalidUser.password);\n\n // EN: Submit login form\n // VI: Gửi form đăng nhập\n // ES: Enviar formulario de inicio de sesión\n await page.click('[data-testid=\"submit-login\"]');\n\n // EN: Verify error message appears\n // VI: Xác minh thông báo lỗi xuất hiện\n // ES: Verificar que aparece el mensaje de error\n await expect(page.locator('[data-testid=\"login-error\"]')).toBeVisible();\n await expect(page.locator('[data-testid=\"login-error\"]')).toContainText('Invalid credentials');\n\n // EN: Verify user remains on login page\n // VI: Xác minh người dùng vẫn ở trang đăng nhập\n // ES: Verificar que el usuario permanece en la página de inicio de sesión\n await expect(page).toHaveURL('/auth/login');\n });\n\n test('authFlow: Complete registration and login flow', async ({ page }) => {\n const timestamp = Date.now();\n const newUser = {\n email: `test${timestamp}@example.com`,\n password: 'newpassword123',\n name: 'New Test User'\n };\n\n // EN: Validate test data structure\n // VI: Xác thực cấu trúc dữ liệu kiểm thử\n // ES: Validar estructura de datos de prueba\n const validationResult = AuthTestDataSchema.safeParse(newUser);\n expect(validationResult.success).toBe(true);\n\n // EN: Navigate to registration page\n // VI: Điều hướng đến trang đăng ký\n // ES: Navegar a la página de registro\n await page.click('[data-testid=\"register-button\"]');\n await expect(page).toHaveURL('/auth/register');\n\n // EN: Fill registration form\n // VI: Điền form đăng ký\n // ES: Llenar formulario de registro\n await page.fill('[data-testid=\"name-input\"]', newUser.name);\n await page.fill('[data-testid=\"email-input\"]', newUser.email);\n await page.fill('[data-testid=\"password-input\"]', newUser.password);\n await page.fill('[data-testid=\"confirm-password-input\"]', newUser.password);\n\n // EN: Submit registration form\n // VI: Gửi form đăng ký\n // ES: Enviar formulario de registro\n await page.click('[data-testid=\"submit-register\"]');\n\n // EN: Wait for registration success message\n // VI: Đợi thông báo đăng ký thành công\n // ES: Esperar mensaje de registro exitoso\n await expect(page.locator('[data-testid=\"register-success\"]')).toBeVisible();\n\n // EN: Navigate to login page after registration\n // VI: Điều hướng đến trang đăng nhập sau khi đăng ký\n // ES: Navegar a la página de inicio de sesión después del registro\n await page.click('[data-testid=\"goto-login\"]');\n await expect(page).toHaveURL('/auth/login');\n\n // EN: Login with newly registered credentials\n // VI: Đăng nhập với thông tin vừa đăng ký\n // ES: Iniciar sesión con credenciales recién registradas\n await page.fill('[data-testid=\"email-input\"]', newUser.email);\n await page.fill('[data-testid=\"password-input\"]', newUser.password);\n await page.click('[data-testid=\"submit-login\"]');\n\n // EN: Verify successful login and redirect\n // VI: Xác minh đăng nhập thành công và chuyển hướng\n // ES: Verificar inicio de sesión exitoso y redirección\n await expect(page).toHaveURL('/dashboard');\n await expect(page.locator('[data-testid=\"user-menu\"]')).toBeVisible();\n });\n\n test('authFlow: Logout flow works correctly', async ({ page }) => {\n // EN: First login with valid credentials\n // VI: Đầu tiên đăng nhập với thông tin hợp lệ\n // ES: Primero iniciar sesión con credenciales válidas\n await page.goto('/auth/login');\n await page.fill('[data-testid=\"email-input\"]', testUsers.validUser.email);\n await page.fill('[data-testid=\"password-input\"]', testUsers.validUser.password);\n await page.click('[data-testid=\"submit-login\"]');\n\n // EN: Verify user is logged in\n // VI: Xác minh người dùng đã đăng nhập\n // ES: Verificar que el usuario ha iniciado sesión\n await expect(page).toHaveURL('/dashboard');\n await expect(page.locator('[data-testid=\"user-menu\"]')).toBeVisible();\n\n // EN: Perform logout\n // VI: Thực hiện đăng xuất\n // ES: Realizar cierre de sesión\n await page.click('[data-testid=\"user-menu\"]');\n await page.click('[data-testid=\"logout-button\"]');\n\n // EN: Verify user is logged out and redirected\n // VI: Xác minh người dùng đã đăng xuất và được chuyển hướng\n // ES: Verificar que el usuario ha cerrado sesión y es redirigido\n await expect(page).toHaveURL('/');\n await expect(page.locator('[data-testid=\"login-button\"]')).toBeVisible();\n await expect(page.locator('[data-testid=\"user-menu\"]')).not.toBeVisible();\n });\n\n test('authFlow: Protected route redirects unauthenticated users', async ({ page }) => {\n // EN: Try to access protected route without authentication\n // VI: Thử truy cập route được bảo vệ mà không xác thực\n // ES: Intentar acceder a ruta protegida sin autenticación\n await page.goto('/dashboard');\n\n // EN: Verify redirect to login page\n // VI: Xác minh chuyển hướng đến trang đăng nhập\n // ES: Verificar redirección a la página de inicio de sesión\n await expect(page).toHaveURL('/auth/login');\n \n // EN: Verify login form is displayed\n // VI: Xác minh form đăng nhập được hiển thị\n // ES: Verificar que se muestra el formulario de inicio de sesión\n await expect(page.locator('[data-testid=\"email-input\"]')).toBeVisible();\n await expect(page.locator('[data-testid=\"password-input\"]')).toBeVisible();\n });\n\n test('authFlow: Session persistence across page refreshes', async ({ page }) => {\n // EN: Login with valid credentials\n // VI: Đăng nhập với thông tin hợp lệ\n // ES: Iniciar sesión con credenciales válidas\n await page.goto('/auth/login');\n await page.fill('[data-testid=\"email-input\"]', testUsers.validUser.email);\n await page.fill('[data-testid=\"password-input\"]', testUsers.validUser.password);\n await page.click('[data-testid=\"submit-login\"]');\n\n // EN: Verify successful login\n // VI: Xác minh đăng nhập thành công\n // ES: Verificar inicio de sesión exitoso\n await expect(page).toHaveURL('/dashboard');\n await expect(page.locator('[data-testid=\"user-menu\"]')).toBeVisible();\n\n // EN: Refresh the page\n // VI: Tải lại trang\n // ES: Actualizar la página\n await page.reload();\n\n // EN: Verify user session is maintained\n // VI: Xác minh phiên người dùng được duy trì\n // ES: Verificar que la sesión del usuario se mantiene\n await expect(page).toHaveURL('/dashboard');\n await expect(page.locator('[data-testid=\"user-menu\"]')).toBeVisible();\n });\n\n test('loginTest: Password reset flow works correctly', async ({ page }) => {\n // EN: Navigate to login page\n // VI: Điều hướng đến trang đăng nhập\n // ES: Navegar a la página de inicio de sesión\n await page.goto('/auth/login');\n\n // EN: Click forgot password link\n // VI: Nhấp vào liên kết quên mật khẩu\n // ES: Hacer clic en el enlace de contraseña olvidada\n await page.click('[data-testid=\"forgot-password-link\"]');\n await expect(page).toHaveURL('/auth/forgot-password');\n\n // EN: Fill email for password reset\n // VI: Điền email để đặt lại mật khẩu\n // ES: Llenar email para restablecer contraseña\n await page.fill('[data-testid=\"email-input\"]', testUsers.validUser.email);\n await page.click('[data-testid=\"submit-reset\"]');\n\n // EN: Verify reset email confirmation\n // VI: Xác minh xác nhận email đặt lại\n // ES: Verificar confirmación de email de restablecimiento\n await expect(page.locator('[data-testid=\"reset-success\"]')).toBeVisible();\n await expect(page.locator('[data-testid=\"reset-success\"]')).toContainText('Reset email sent');\n });\n});\n```\n\nNow, let me create additional auth flow test files to ensure comprehensive coverage:\n\n```typescript\n// e2e/auth/auth-api.spec.ts\n// EN: Authentication API integration tests\n// VI: Kiểm thử tích hợp API xác thực\n// ES: Pruebas de integración de API de autenticación\n// SPEC: TEST-02 - Integration tests for Auth Flow\n\nimport { test, expect } from '@playwright/test';\nimport { z } from 'zod';\n\n// EN: API response validation schemas\n// VI: Lược đồ xác thực phản hồi API\n// ES: Esquemas de validación de respuesta de API\nconst AuthApiResponseSchema = z.object({\n user: z.object({\n id: z.string(),\n email: z.string().email(),\n name: z.string()\n }).optional(),\n error: z.string().optional()\n});\n\ntest.describe('Authentication API Integration Tests', () => {\n test('authFlow: Login API endpoint responds correctly', async ({ request }) => {\n // EN: Test login API with valid credentials\n // VI: Kiểm thử API đăng nhập với thông tin hợp lệ\n // ES: Probar API de inicio de sesión con credenciales válidas\n const response = await request.post('/api/auth/login', {\n data: {\n email: 'test@example.com',\n password: 'password123'\n }\n });\n\n expect(response.status()).toBe(200);\n\n const responseData = await response.json();\n const validationResult = AuthApiResponseSchema.safeParse(responseData);\n expect(validationResult.success).toBe(true);\n\n if (validationResult.success) {\n expect(validationResult.data.user).toBeDefined();\n expect(validationResult.data.error).toBeUndefined();\n }\n });\n\n test('loginTest: Login API handles invalid credentials', async ({ request }) => {\n // EN: Test login API with invalid credentials\n // VI: Kiểm thử API đăng nhập với thông tin không hợp lệ\n // ES: Probar API de inicio de sesión con credenciales inválidas\n const response = await request.post('/api/auth/login', {\n data: {\n email: 'invalid@example.com',\n password: 'wrongpassword'\n }\n });\n\n expect(response.status()).toBe(401);\n\n const responseData = await response.json();\n const validationResult = AuthApiResponseSchema.safeParse(responseData);\n expect(validationResult.success).toBe(true);\n\n if (validationResult.success) {\n expect(validationResult.data.error).toBeDefined();\n expect(validationResult.data.user).toBeUndefined();\n }\n });\n\n test('authFlow: Registration API endpoint works correctly', async ({ request }) => {\n const timestamp = Date.now();\n const newUser = {\n email: `apitest${timestamp}@example.com`,\n password: 'apipassword123',\n name: 'API Test User'\n };\n\n // EN: Test registration API\n // VI: Kiểm thử API đăng ký\n // ES: Probar API de registro\n const response = await request.post('/api/auth/register', {\n data: newUser\n });\n\n expect(response.status()).toBe(201);\n\n const responseData = await response.json();\n const validationResult = AuthApiResponseSchema.safeParse(responseData);\n expect(validationResult.success).toBe(true);\n\n if (validationResult.success) {\n expect(validationResult.data.user).toBeDefined();\n expect(validationResult.data.user?.email).toBe(newUser.email);\n expect(validationResult.data.error).toBeUndefined();\n }\n });\n\n test('authFlow: Logout API endpoint works correctly', async ({ request }) => {\n // EN: First login to get session\n // VI: Đầu tiên đăng nhập để có phiên\n // ES: Primero iniciar sesión para obtener sesión\n const loginResponse = await request.post('/api/auth/login', {\n data: {\n email: 'test@example.com',\n password: 'password123'\n }\n });\n\n expect(loginResponse.status()).toBe(200);\n\n // EN: Test logout API\n // VI: Kiểm thử API đăng xuất\n // ES: Probar API de cierre de sesión\n const logoutResponse = await request.post('/api/auth/logout');\n expect(logoutResponse.status()).toBe(200);\n\n const responseData = await logoutResponse.json();\n expect(responseData.error).toBeUndefined();\n });\n});\n```\n\nLet me also create a comprehensive test configuration file:\n\n```typescript\n// e2e/auth/auth-helpers.ts\n// EN: Authentication test helper functions\n// VI: Các hàm hỗ trợ kiểm thử xác thực\n// ES: Funciones auxiliares de prueba de autenticación\n// SPEC: TEST-02 - Integration tests for Auth Flow\n\nimport { Page } from '@playwright/test';\nimport { z } from 'zod';\n\n// EN: User test data schema\n// VI: Lược đồ dữ liệu người dùng kiểm thử\n// ES: Esquema de datos de usuario de prueba\nconst UserTestDataSchema = z.object({\n email: z.string().email(),\n password: z.string().min(6),\n name: z.string().min(2).optional()\n});\n\nexport type UserTestData = z.infer<typeof UserTestDataSchema>;\n\n// EN: Helper function to perform login\n// VI: Hàm hỗ trợ thực hiện đăng nhập\n// ES: Función auxiliar para realizar inicio de sesión\nexport async function loginTest(page: Page, userData: UserTestData): Promise<void> {\n // EN: Validate user data\n // VI: Xác thực dữ liệu người dùng\n // ES: Validar datos de usuario\n const validationResult = UserTestDataSchema.safeParse(userData);\n if (!validationResult.success) {\n throw new Error('Invalid user test data');\n }\n\n // EN: Navigate to login page\n // VI: Điều hướng đến trang đăng nhập\n // ES: Navegar a la página de inicio de sesión\n await page.goto('/auth/login');\n\n // EN: Fill and submit login form\n // VI: Điền và gửi form đăng nhập\n // ES: Llenar y enviar formulario de inicio de sesión\n await page.fill('[data-testid=\"email-input\"]', userData.email);\n await page.fill('[data-testid=\"password-input\"]', userData.password);\n await page.click('[data-testid=\"submit-login\"]');\n}\n\n// EN: Helper function to perform registration\n// VI: Hàm hỗ trợ thực hiện đăng ký\n// ES: Función auxiliar para realizar registro\nexport async function registerTest(page: Page, userData: UserTestData & { name: string }): Promise<void> {\n const validationResult = UserTestDataSchema.safeParse(userData);\n if (!validationResult.success) {\n throw new Error('Invalid user registration data');\n }\n\n // EN: Navigate to registration page\n // VI: Điều hướng đến trang đăng ký\n // ES: Navegar a la página de registro\n await page.goto('/auth/register');\n\n // EN: Fill and submit registration form\n // VI: Điền và gửi form đăng ký\n // ES: Llenar y enviar formulario de registro\n await page.fill('[data-testid=\"name-input\"]', userData.name);\n await page.fill('[data-testid=\"email-input\"]', userData.email);\n await page.fill('[data-testid=\"password-input\"]', userData.password);\n await page.fill('[data-testid=\"confirm-password-input\"]', userData.password);\n await page.click('[data-testid=\"submit-register\"]');\n}\n\n// EN: Helper function to perform logout\n// VI: Hàm hỗ trợ thực hiện đăng xuất\n// ES: Función auxiliar para realizar cierre de sesión\nexport async function logoutTest(page: Page): Promise<void> {\n // EN: Click user menu and logout\n // VI: Nhấp menu người dùng và đăng xuất\n // ES: Hacer clic en menú de usuario y cerrar sesión\n await page.click('[data-testid=\"user-menu\"]');\n await page.click('[data-testid=\"logout-button\"]');\n}\n\n// EN: Helper function to check authentication state\n// VI: Hàm hỗ trợ kiểm tra trạng thái xác thực\n// ES: Función auxiliar para verificar estado de autenticación\nexport async function checkAuthState(page: Page): Promise<{ isAuthenticated: boolean }> {\n try {\n const userMenu = await page.locator('[data-testid=\"user-menu\"]');\n const isVisible = await userMenu.isVisible();\n return { isAuthenticated: isVisible };\n } catch {\n return { isAuthenticated: false };\n }\n}\n\n// EN: Default test users for auth flow testing\n// VI: Người dùng kiểm thử mặc định cho kiểm thử luồng xác thực\n// ES: Usuarios de prueba por defecto para pruebas de flujo de autenticación\nexport const testUsers = {\n validUser: {\n email: 'test@example.com',\n password: 'password123',\n name: 'Test User'\n },\n adminUser: {\n email: 'admin@example.com',\n password: 'adminpass123',\n name: 'Admin User'\n },\n newUser: (timestamp: number = Date.now()) => ({\n email: `newuser${timestamp}@example.com`,\n password: 'newpass123',\n name: 'New Test User'\n })\n};\n```\n\nNow let me create one more comprehensive test file:\n\n```typescript\n// e2e/auth/full-authFlow.spec.ts\n// EN: Complete authentication flow integration tests\n// VI: Kiểm thử tích hợp luồng xác thực đầy đủ\n// ES: Pruebas de integración completas del flujo de autenticación\n// SPEC: TEST-02 - Integration tests for Auth Flow\n\nimport { test, expect } from '@playwright/test';\nimport { z } from 'zod';\nimport { loginTest, registerTest, logoutTest, checkAuthState, testUsers } from './auth-helpers';\n\n// EN: Full auth flow validation schema\n// VI: Lược đồ xác thực luồng xác thực đầy đủ\n// ES: Esquema de validación de flujo de autenticación completo\nconst AuthFlowStateSchema = z.object({\n isAuthenticated: z.boolean(),\n currentUrl: z.string(),\n hasUserMenu: z.boolean()\n});\n\ntest.describe('Complete Auth Flow Integration Tests', () => {\n test('authFlow: Full user journey from registration to logout', async ({ page }) => {\n const newUser = testUsers.newUser();\n \n // EN: Step 1: Register new user\n // VI: Bước 1: Đăng ký người dùng mới\n // ES: Paso 1: Registrar nuevo usuario\n await registerTest(page, newUser);\n \n // EN: Verify registration success\n // VI: Xác minh đăng ký thành công\n // ES: Verificar registro exitoso\n await expect(page.locator('[data-testid=\"register-success\"]')).toBeVisible();\n \n // EN: Step 2: Login with registered credentials\n // VI: Bước 2: Đăng nhập với thông tin đã đăng ký\n // ES: Paso 2: Iniciar sesión con credenciales registradas\n await loginTest(page, newUser);\n \n // EN: Verify successful login\n // VI: Xác minh đăng nhập thành công\n // ES: Verificar inicio de sesión exitoso\n await expect(page).toHaveURL('/dashboard');\n \n const authState = await checkAuthState(page);\n expect(authState.isAuthenticated).toBe(true);\n \n // EN: Step 3: Navigate through protected areas\n // VI: Bước 3: Điều hướng qua các khu vực được bảo vệ\n // ES: Paso 3: Navegar por áreas protegidas\n await page.goto('/profile');\n await expect(page).toHaveURL('/profile');\n await expect(page.locator('[data-testid=\"user-profile\"]')).toBeVisible();\n \n // EN: Step 4: Logout\n // VI: Bước 4: Đăng xuất\n // ES: Paso 4: Cerrar sesión\n await logoutTest(page);\n \n // EN: Verify successful logout\n // VI: Xác minh đăng xuất thành công\n // ES: Verificar cierre de sesión exitoso\n await expect(page).toHaveURL('/');\n \n const loggedOutState = await checkAuthState(page);\n expect(loggedOutState.isAuthenticated).toBe(false);\n });\n\n test('loginTest: Authentication state persistence and recovery', async ({ page, context }) => {\n // EN: Login with valid user\n // VI: Đăng nhập với người dùng hợp lệ\n // ES: Iniciar sesión con usuario válido\n await loginTest(page, testUsers.validUser);\n await expect(page).toHaveURL('/dashboard');\n \n // EN: Store authentication state\n // VI: Lưu trạng thái xác thực\n // ES: Almacenar estado de autenticación\n const cookies = await context.cookies();\n expect(cookies.length).toBeGreaterThan(0);\n \n // EN: Open new page in same context\n // VI: Mở trang mới trong cùng ngữ cảnh\n // ES: Abrir nueva página en el mismo contexto\n const newPage = await context.newPage();\n await newPage.goto('/dashboard');\n \n // EN: Verify auth state is maintained\n // VI: Xác minh trạng thái xác thực được duy trì\n // ES: Verificar que el estado de autenticación se mantiene\n const newPageAuthState = await checkAuthState(newPage);\n expect(newPageAuthState.isAuthenticated).toBe(true);\n \n await newPage.close();\n });\n\n test('authFlow: Role-based access control integration', async ({ page }) => {\n // EN: Test admin user access\n // VI: Kiểm thử quyền truy cập người dùng admin\n // ES: Probar acceso de usuario administrador\n await loginTest(page, testUsers.adminUser);\n await expect(page).toHaveURL('/dashboard');\n \n // EN: Try to access admin-only route\n // VI: Thử truy cập route chỉ dành cho admin\n // ES: Intentar acceder a ruta solo para administradores\n await page.goto('/admin');\n await expect(page).toHaveURL('/admin');\n await expect(page.locator('[data-testid=\"admin-panel\"]')).toBeVisible();\n \n // EN: Logout admin user\n // VI: Đăng xuất người dùng admin\n // ES: Cerrar sesión de usuario administrador\n await logoutTest(page);\n \n // EN: Login as regular user\n // VI: Đăng nhập như người dùng thường\n // ES: Iniciar sesión como usuario regular\n await loginTest(page, testUsers.validUser);\n \n // EN: Try to access admin route as regular user\n // VI: Thử truy cập route admin với người dùng thường\n // ES: Intentar acceder a ruta de administrador como usuario regular\n await page.goto('/admin');\n await expect(page).toHaveURL('/dashboard'); // Should redirect\n await expect(page.locator('[data-testid=\"access-denied\"]')).toBeVisible();\n });\n\n test('authFlow: Concurrent session handling', async ({ browser }) => {\n // EN: Create two browser contexts (simulate two devices)\n // VI: Tạo hai ngữ cảnh trình duyệt (mô phỏng hai thiết bị)\n // ES: Crear dos contextos de navegador (simular dos dispositivos)\n const context1 = await browser.newContext();\n const context2 = await browser.newContext();\n \n const page1 = await context1.newPage();\n const page2 = await context2.newPage();\n \n // EN: Login from first device\n // VI: Đăng nhập từ thiết bị đầu tiên\n // ES: Iniciar sesión desde el primer dispositivo\n await loginTest(page1, testUsers.validUser);\n await expect(page1).toHaveURL('/dashboard');\n \n // EN: Login from second device with same credentials\n // VI: Đăng nhập từ thiết bị thứ hai với cùng thông tin\n // ES: Iniciar sesión desde el segundo dispositivo con las mismas credenciales\n await loginTest(page2, testUsers.validUser);\n await expect(page2).toHaveURL('/dashboard');\n \n // EN: Verify both sessions are valid\n // VI: Xác minh cả hai phiên đều hợp lệ\n // ES: Verificar que ambas sesiones son válidas\n const auth1 = await checkAuthState(page1);\n const auth2 = await checkAuthState(page2);\n \n expect(auth1.isAuthenticated).toBe(true);\n expect(auth2.isAuthenticated).toBe(true);\n \n // EN: Logout from first device\n // VI: Đăng xuất từ thiết bị đầu tiên\n // ES: Cerrar sesión desde el primer dispositivo\n await logoutTest(page1);\n \n // EN: Verify second session is still valid\n // VI: Xác minh phiên thứ hai vẫn hợp lệ\n // ES: Verificar que la segunda sesión sigue siendo válida\n await page2.reload();\n const auth2AfterLogout = await checkAuthState(page2);\n expect(auth2AfterLogout.isAuthenticated).toBe(true);\n \n await context1.close();\n await context2.close();\n });\n});\n```\n\nThe integration tests I've created provide comprehensive coverage for the authentication flow:\n\n## **Key Features Implemented:**\n\n1. **Complete Auth Flow Tests (`authFlow`):**\n - Registration → Login → Dashboard access → Logout\n - Session persistence across page refreshes\n - Protected route access control\n - Role-based access control\n - Concurrent session handling\n\n2. **Login-Specific Tests (`loginTest`):**\n - Valid credential login flow\n - Invalid credential error handling\n - Password reset flow\n - Authentication state persistence\n\n3. **API Integration Tests:**\n - Login endpoint testing\n - Registration endpoint testing\n - Logout endpoint testing\n - Proper error response validation\n\n4. **Helper Functions:**\n - Reusable `loginTest()` function\n - User data validation with Zod\n - Authentication state checking utilities\n\n## **Technical Implementation:**\n\n- ✅ **Zod validation** at module level with `.safeParse()`\n- ✅ **Trilingual comments** (EN/VI/ES)\n- ✅ **SPEC references** in comments\n- ✅ **Pattern matching** for `loginTest|authFlow` in E2E specs\n- ✅ **Error format**: `{ error: 'message' }`\n- ✅ **Comprehensive test coverage** for auth workflows\n\nThe tests cover both UI interactions and API endpoints, ensuring complete integration testing of the authentication system from end-to-end user flows to backend API responses."
}Task ID: a4292823-9acb-43fd-a556-c2186394c4cf