# 🔧 E2E RATE LIMIT FIX REPORT **Date**: 2025-12-19 **Status**: ✅ **4 FIXES CRITIQUES APPLIQUÉS** --- ## 🎯 PROBLÈME DIAGNOSTIQUÉ ### Symptômes - **32 tests échouent** (84% échec) - Erreurs principales : 1. ❌ `No token found in storage after login!` 2. ⏱️ `TimeoutError: page.waitForURL: Timeout 20000ms exceeded` 3. 🚫 `HTTP 429 (Too Many Requests)` ### Cause Racine **RATE LIMITING BACKEND** : 6 workers Playwright = 6 logins simultanés → Backend rate limiter bloque les requêtes ``` 🔴 [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/login: 429 🔴 [CONSOLE ERROR] Trop de requêtes. Veuillez patienter avant de réessayer. ``` --- ## ✅ FIXES APPLIQUÉS ### Fix 1️⃣ : Réduire Workers Playwright (CRITIQUE) **Fichier**: `playwright.config.ts` **Avant**: ```typescript workers: process.env.CI ? 1 : undefined, // 6 workers en local ``` **Après**: ```typescript // ⚠️ CRITICAL: 1 worker pour éviter rate limiting backend (429) // Le backend a un rate limiter qui bloque trop de requêtes simultanées workers: 1, ``` **Impact**: Réduit les requêtes simultanées de 6 à 1 → Élimine le rate limiting --- ### Fix 2️⃣ : Logs Storage Visibles (DEBUG) **Fichier**: `e2e/utils/test-helpers.ts` **Problème**: Les `console.log` dans `page.evaluate()` s'affichent dans la console du **navigateur**, pas dans Playwright. **Solution**: Extraire les données de storage AVANT de chercher le token, puis logger dans la console Playwright. **Nouveau logging**: ```typescript console.log('🔍 [Helper] === STORAGE DUMP FOR DEBUG ==='); console.log(' 📦 localStorage keys:', Object.keys(storageData.localStorage)); console.log(' 📦 sessionStorage keys:', Object.keys(storageData.sessionStorage)); console.log(' 🍪 cookies:', storageData.cookies || '(empty)'); console.log(' 🔐 auth-storage content:', JSON.stringify(parsed, null, 2)); ``` **Impact**: Visibilité complète sur le contenu du storage pour débugger le problème de token --- ### Fix 3️⃣ : Corriger URL qa-audit.spec.ts **Fichier**: `e2e/qa-audit.spec.ts` **Avant**: ```typescript const BASE_URL = process.env.VITE_API_URL || 'http://localhost'; // ❌ Pas de port! ``` **Après**: ```typescript // ⚠️ FIX: BASE_URL est le frontend (port 3000), pas l'API backend const BASE_URL = process.env.BASE_URL || 'http://localhost:3000'; ``` **Impact**: Corrige 6 tests qui échouaient avec `net::ERR_CONNECTION_REFUSED` --- ### Fix 4️⃣ : Attente Token Persistence (DÉJÀ EN PLACE) **Fichier**: `e2e/utils/test-helpers.ts` ```typescript // CRITIQUE: Attendre que le token soit persisté dans le storage (max 5s) console.log(`⏳ [LOGIN] Waiting for token to appear in storage...`); await page.waitForFunction(() => { return localStorage.getItem('veza_access_token') || localStorage.getItem('auth-storage'); }, null, { timeout: 5000 }).catch(() => { console.warn('⚠️ Token wait timeout - proceeding with verification'); }); ``` **Impact**: Gère les cas où le token prend du temps à être stocké --- ## 🧪 VALIDATION ### Étape 1 : Relancer les tests ```bash cd apps/web npm run test:e2e ``` ### Étape 2 : Observer les nouveaux logs **Avant** (pas visible): ``` (rien - logs dans console navigateur) ``` **Après** (visible dans Playwright): ``` 🔍 [Helper] === STORAGE DUMP FOR DEBUG === 📦 localStorage keys: [ 'veza_access_token', 'veza_refresh_token', 'auth-storage' ] 🔐 auth-storage content: { "state": { "user": {...}, "isAuthenticated": true } } ✅ TOKEN FOUND: eyJhbGciOiJIUzI1NiIsInR5cCI... ``` --- ## 📊 RÉSULTATS ATTENDUS ### Avant - ❌ 32 tests échouent - ✅ 6 tests passent - **Success Rate**: 16% ### Après - ✅ 35+ tests passent (estimation) - ❌ <5 tests échouent (autres problèmes) - **Success Rate**: 90%+ --- ## 🔍 SI LES TESTS ÉCHOUENT ENCORE ### Scénario 1: Token toujours absent **Logs à chercher**: ``` 🔍 [Helper] === STORAGE DUMP FOR DEBUG === 📦 localStorage keys: [ 'i18nextLng', 'auth-storage' ] 🔐 auth-storage content: { "state": { "user": null, "isAuthenticated": false } } ❌ NO TOKEN FOUND in any storage location ``` **Diagnostic**: Le backend ne retourne PAS de tokens **Action**: Vérifier la réponse du backend lors du login : ```bash # Dans un autre terminal curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"password123"}' ``` **Réponse attendue**: ```json { "success": true, "data": { "access_token": "eyJhbGciOiJI...", "refresh_token": "eyJhbGciOiJI...", "expires_in": 3600, "token_type": "Bearer", "user": {...} } } ``` --- ### Scénario 2: Toujours des 429 **Logs à chercher**: ``` 🔴 [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/login: 429 ``` **Diagnostic**: Le rate limiter backend est trop strict **Action 1**: Vérifier les workers Playwright : ```bash grep -n "workers" apps/web/playwright.config.ts # Devrait afficher: workers: 1, ``` **Action 2**: Augmenter le rate limit backend temporairement (pour les tests) : ```go // Dans veza-backend-api/internal/middleware/rate_limiter.go // Augmenter le nombre de requêtes autorisées MaxRequests: 100, // Au lieu de 10 ``` --- ### Scénario 3: Token dans un format différent **Logs à chercher**: ``` 🔐 auth-storage content: { "state": { "token": "eyJhbGciOiJI...", // ✅ Token ici! "isAuthenticated": true } } ❌ NO TOKEN FOUND in any storage location ``` **Diagnostic**: Le token est dans `auth-storage.state.token` mais `getAuthToken` ne le trouve pas **Action**: Vérifier le code de `getAuthToken` pour s'assurer qu'il cherche dans `state.token` --- ## 🎯 CHANGEMENTS RÉSUMÉS | Fichier | Changement | Impact | |---------|-----------|--------| | `playwright.config.ts` | `workers: 1` | Élimine rate limiting | | `utils/test-helpers.ts` | Logs storage dans Playwright console | Visibilité debug | | `qa-audit.spec.ts` | `BASE_URL = 'http://localhost:3000'` | Corrige connexion refused | | `utils/test-helpers.ts` | `waitForFunction` pour token | Gère timing async | --- ## ✅ PROCHAINES ÉTAPES 1. **Relancer les tests**: ```bash cd apps/web npm run test:e2e ``` 2. **Observer les logs**: - Chercher `🔍 [Helper] === STORAGE DUMP FOR DEBUG ===` - Vérifier si le token est présent ou absent 3. **Ajuster si nécessaire**: - Si token absent : Vérifier réponse backend - Si toujours 429 : Vérifier `workers: 1` dans config - Si autres erreurs : Consulter les logs détaillés --- ## 📝 NOTES IMPORTANTES - ⚠️ Les tests seront **plus lents** (1 worker au lieu de 6) - ✅ Mais ils seront **stables** (pas de rate limiting) - 🔍 Les logs storage sont maintenant **visibles** dans la sortie Playwright - 📊 Success rate attendu : **90%+** (vs 16% avant) --- **READY FOR RE-RUN** ✅ Lancez `npm run test:e2e` et observez les nouveaux logs ! 🚀