FOUNDRY
C8 Platform
← 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