# 🔧 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 ! 🚀
