217 lines
5.8 KiB
Markdown
217 lines
5.8 KiB
Markdown
|
|
# TERR-008: Catégorisation des Tests Frontend
|
||
|
|
|
||
|
|
## 📊 Vue d'Ensemble
|
||
|
|
|
||
|
|
- **Total fichiers de tests**: 189
|
||
|
|
- **Tests passants**: Majorité (✓ visible dans les logs)
|
||
|
|
- **Erreurs récurrentes**: 5 catégories principales
|
||
|
|
|
||
|
|
## 🔍 Catégorisation des Erreurs
|
||
|
|
|
||
|
|
### CATÉGORIE 1: APIs Browser Manquantes (PRIORITÉ HAUTE)
|
||
|
|
|
||
|
|
#### 1.1 ResizeObserver is not defined
|
||
|
|
**Fréquence**: Très élevée (apparaît dans de nombreux tests)
|
||
|
|
**Impact**: Tests échouent silencieusement ou avec warnings
|
||
|
|
**Cause**: `ResizeObserver` n'est pas mocké dans `src/test/setup.ts`
|
||
|
|
**Fichiers affectés**:
|
||
|
|
- Composants utilisant des librairies UI (Radix UI, etc.)
|
||
|
|
- Composants avec resize detection
|
||
|
|
- Composants de layout dynamique
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
```typescript
|
||
|
|
// Ajouter dans src/test/setup.ts
|
||
|
|
global.ResizeObserver = class ResizeObserver {
|
||
|
|
observe() {}
|
||
|
|
unobserve() {}
|
||
|
|
disconnect() {}
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
**Temps estimé**: 5 minutes
|
||
|
|
**Complexité**: TRIVIAL
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
#### 1.2 WebSocket Mock Incomplet
|
||
|
|
**Fréquence**: Moyenne
|
||
|
|
**Impact**: Tests WebSocket échouent
|
||
|
|
**Erreur**: `TypeError: realWebSocket.addEventListener is not a function`
|
||
|
|
**Cause**: Le mock WebSocket dans `setup.ts` n'implémente pas `addEventListener`
|
||
|
|
**Fichiers affectés**:
|
||
|
|
- `src/features/streaming/hooks/usePlaybackRealtime.test.ts`
|
||
|
|
- Tous les tests utilisant WebSocket
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
```typescript
|
||
|
|
// Améliorer MockWebSocket dans src/test/setup.ts
|
||
|
|
class MockWebSocket {
|
||
|
|
// ... existing code ...
|
||
|
|
addEventListener(type: string, listener: EventListener) {
|
||
|
|
// Implementation
|
||
|
|
}
|
||
|
|
removeEventListener(type: string, listener: EventListener) {
|
||
|
|
// Implementation
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Temps estimé**: 15 minutes
|
||
|
|
**Complexité**: SIMPLE
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CATÉGORIE 2: Problèmes React Hooks (PRIORITÉ MOYENNE)
|
||
|
|
|
||
|
|
#### 2.1 Rendered more hooks than during the previous render
|
||
|
|
**Fréquence**: Moyenne
|
||
|
|
**Impact**: Tests échouent avec erreur React
|
||
|
|
**Cause**:
|
||
|
|
- Hooks conditionnels
|
||
|
|
- Hooks dans des conditions if/else
|
||
|
|
- Hooks après des early returns
|
||
|
|
- Re-renders avec nombre différent de hooks
|
||
|
|
|
||
|
|
**Fichiers affectés**:
|
||
|
|
- Composants avec logique conditionnelle complexe
|
||
|
|
- Hooks personnalisés avec conditions
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
- Auditer les composants pour hooks conditionnels
|
||
|
|
- Utiliser `useMemo`/`useCallback` au lieu de hooks conditionnels
|
||
|
|
- Réorganiser la logique pour éviter hooks conditionnels
|
||
|
|
|
||
|
|
**Temps estimé**: 2-4 heures
|
||
|
|
**Complexité**: MOYENNE
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CATÉGORIE 3: Mocks Manquants/Incomplets (PRIORITÉ MOYENNE)
|
||
|
|
|
||
|
|
#### 3.1 toast.success is not a function
|
||
|
|
**Fréquence**: Faible
|
||
|
|
**Impact**: Tests échouent lors de l'appel à toast
|
||
|
|
**Cause**: Mock de `toast` non configuré ou incomplet
|
||
|
|
**Fichiers affectés**:
|
||
|
|
- Tests utilisant `useToast` hook
|
||
|
|
- Tests avec notifications
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
```typescript
|
||
|
|
// Dans src/mocks/test-setup.ts ou setup.ts
|
||
|
|
vi.mock('@/hooks/useToast', () => ({
|
||
|
|
useToast: () => ({
|
||
|
|
toast: {
|
||
|
|
success: vi.fn(),
|
||
|
|
error: vi.fn(),
|
||
|
|
info: vi.fn(),
|
||
|
|
warning: vi.fn(),
|
||
|
|
},
|
||
|
|
}),
|
||
|
|
}));
|
||
|
|
```
|
||
|
|
|
||
|
|
**Temps estimé**: 30 minutes
|
||
|
|
**Complexité**: SIMPLE
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CATÉGORIE 4: Problèmes de Sélecteurs de Tests (PRIORITÉ BASSE)
|
||
|
|
|
||
|
|
#### 4.1 Unable to find an element with the text
|
||
|
|
**Fréquence**: Faible
|
||
|
|
**Impact**: Tests échouent mais peuvent être corrigés facilement
|
||
|
|
**Cause**:
|
||
|
|
- Texte divisé par plusieurs éléments
|
||
|
|
- Texte avec caractères spéciaux (✓, ✗)
|
||
|
|
- Sélecteurs trop spécifiques
|
||
|
|
|
||
|
|
**Exemples**:
|
||
|
|
- "✓ Ce nom d'utilisateur est disponible"
|
||
|
|
- "✗ Ce nom d'utilisateur est déjà pris"
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
- Utiliser `getByText` avec fonction de matching
|
||
|
|
- Utiliser `getByRole` ou `getByTestId` au lieu de texte
|
||
|
|
- Normaliser le texte avant comparaison
|
||
|
|
|
||
|
|
**Temps estimé**: 1-2 heures
|
||
|
|
**Complexité**: SIMPLE
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### CATÉGORIE 5: Warnings et Avertissements (PRIORITÉ BASSE)
|
||
|
|
|
||
|
|
#### 5.1 React Router Future Flag Warning
|
||
|
|
**Fréquence**: Élevée (warnings)
|
||
|
|
**Impact**: Aucun (warnings uniquement)
|
||
|
|
**Cause**: Configuration React Router
|
||
|
|
**Solution**: Mettre à jour la configuration React Router
|
||
|
|
|
||
|
|
**Temps estimé**: 15 minutes
|
||
|
|
**Complexité**: TRIVIAL
|
||
|
|
|
||
|
|
#### 5.2 An update to Component inside a test was not wrapped in act(...)
|
||
|
|
**Fréquence**: Moyenne (warnings)
|
||
|
|
**Impact**: Aucun (warnings uniquement)
|
||
|
|
**Cause**: Mises à jour asynchrones non wrappées
|
||
|
|
**Solution**: Utiliser `waitFor` et `act` correctement
|
||
|
|
|
||
|
|
**Temps estimé**: 1-2 heures
|
||
|
|
**Complexité**: SIMPLE
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📋 Plan d'Action par Priorité
|
||
|
|
|
||
|
|
### PRIORITÉ HAUTE (Impact immédiat)
|
||
|
|
1. ✅ **ResizeObserver mock** (5 min) - TRIVIAL
|
||
|
|
2. ✅ **WebSocket addEventListener** (15 min) - SIMPLE
|
||
|
|
**Total**: 20 minutes
|
||
|
|
|
||
|
|
### PRIORITÉ MOYENNE (Impact fonctionnel)
|
||
|
|
3. ✅ **toast mock** (30 min) - SIMPLE
|
||
|
|
4. ⏳ **Hooks conditionnels** (2-4h) - MOYENNE
|
||
|
|
**Total**: 2.5-4.5 heures
|
||
|
|
|
||
|
|
### PRIORITÉ BASSE (Amélioration qualité)
|
||
|
|
5. ⏳ **Sélecteurs de tests** (1-2h) - SIMPLE
|
||
|
|
6. ⏳ **Warnings React Router** (15 min) - TRIVIAL
|
||
|
|
7. ⏳ **act() warnings** (1-2h) - SIMPLE
|
||
|
|
**Total**: 2.25-4.25 heures
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📊 Statistiques
|
||
|
|
|
||
|
|
| Catégorie | Erreurs | Warnings | Temps Estimé | Priorité |
|
||
|
|
|-----------|---------|----------|--------------|----------|
|
||
|
|
| APIs Browser | 2 types | - | 20 min | HAUTE |
|
||
|
|
| React Hooks | 1 type | - | 2-4h | MOYENNE |
|
||
|
|
| Mocks | 1 type | - | 30 min | MOYENNE |
|
||
|
|
| Sélecteurs | 1 type | - | 1-2h | BASSE |
|
||
|
|
| Warnings | - | 2 types | 2.25-4.25h | BASSE |
|
||
|
|
| **TOTAL** | **5** | **2** | **6-11h** | - |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ✅ Points Positifs
|
||
|
|
|
||
|
|
1. **Majorité des tests passent** (✓ visible dans logs)
|
||
|
|
2. **Architecture de tests solide** (189 fichiers)
|
||
|
|
3. **Setup de base fonctionnel** (vitest, testing-library)
|
||
|
|
4. **Erreurs catégorisables et corrigeables**
|
||
|
|
|
||
|
|
## 🎯 Conclusion
|
||
|
|
|
||
|
|
**Statut**: ✅ **BON ÉTAT** avec améliorations nécessaires
|
||
|
|
- Tests fonctionnels dans l'ensemble
|
||
|
|
- Erreurs principalement liées à l'environnement de test
|
||
|
|
- Corrections rapides possibles pour la majorité
|
||
|
|
|
||
|
|
**Temps total estimé**: 6-11 heures
|
||
|
|
**Impact après corrections**: Tests stables et fiables
|
||
|
|
**Date**: 2025-11-09
|
||
|
|
|