mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-04-07 05:51:41 +02:00
125 lines
5.1 KiB
Markdown
125 lines
5.1 KiB
Markdown
---
|
|
title: Frontend — Risques & vigilance : Tests
|
|
domain: frontend
|
|
bucket: risques
|
|
tags: [tests, jest, react-native, ts-jest, coverage, facade]
|
|
applies_to: [analysis, implementation, review, debug]
|
|
severity: high
|
|
validated_on: 2026-03-31
|
|
source_projects: [app-alexandrie, app-template-resto]
|
|
---
|
|
|
|
# Frontend — Risques & vigilance : Tests
|
|
|
|
> Extrait de la base de connaissance Lead_tech. Voir `knowledge/frontend/risques/README.md` pour l'index complet.
|
|
|
|
---
|
|
|
|
<a id="risque-jest-rn-config-node"></a>
|
|
## Jest React Native — config node bloque les composants `.tsx`
|
|
|
|
### Risques
|
|
|
|
- `SyntaxError: Cannot use import statement outside a module` lors de l'import d'un barrel `.ts` qui réexporte des `.tsx`
|
|
- Impossible d'importer des composants React Native dans les tests — JSX non transformé
|
|
|
|
### Symptômes
|
|
|
|
- Erreur de syntaxe inattendue au run des tests sur un fichier `.ts` qui importe un `.tsx`
|
|
- Les tests de tokens passent mais tout test touchant un composant échoue
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
- `transform: { '^.+\\.ts$': 'ts-jest' }` ne transforme que `.ts` — pas `.tsx`
|
|
- **Pattern recommandé** : tester la logique pure (tokens, valeurs de style) dans `.spec.ts`, le rendu visuel dans `.spec.tsx` avec une config séparée (`@testing-library/react-native` + `babel-jest`)
|
|
- Exporter le `StyleSheet` de chaque composant pour le tester sans JSX (voir pattern dédié dans `10_frontend_patterns_valides.md`)
|
|
- Contexte technique : React Native / Jest / ts-jest — app-alexandrie 19-03-2026
|
|
|
|
---
|
|
|
|
<a id="risque-faux-test-negatif"></a>
|
|
## Faux test négatif — tester le helper au lieu de tester l'exclusion
|
|
|
|
### Risques
|
|
|
|
- Un test nommé "X n'utilise pas Y" qui appelle Y en interne est un test normal mal documenté, pas un test d'exclusion
|
|
- Donne une fausse confiance sur le comportement par défaut du helper
|
|
|
|
### Symptômes
|
|
|
|
- Test intitulé "sans fallback, la valeur EN vide n'est pas remplacée" mais qui appelle le helper avec fallback activé
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
- Un vrai test négatif vérifie que X n'importe pas Y, ou que le comportement par défaut empêche l'effet indésirable
|
|
- Pour un helper à fallback optionnel : tester explicitement le cas `fallbackToFr=false` (défaut) avec une valeur vide
|
|
|
|
- Contexte technique : TypeScript / Jest — app-template-resto 17-03-2026
|
|
|
|
---
|
|
|
|
<a id="risque-helpers-copies-tests"></a>
|
|
## Helpers copiés localement dans les tests (faux positif permanent)
|
|
|
|
### Risques
|
|
|
|
- La logique réellement exécutée en production peut diverger du helper copié dans le test sans casser aucun test.
|
|
- Un refactor du module source ne casse pas le test — la couverture est illusoire.
|
|
|
|
### Symptômes
|
|
|
|
- Fonctions utilitaires redéfinies dans `*.spec.ts` plutôt qu'importées depuis le module de production
|
|
- Tests verts malgré une régression dans le code source
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
- Les tests doivent importer le module réellement utilisé par l'écran/composant, jamais dupliquer la logique.
|
|
- Si la logique est partagée entre écran et test, l'extraire dans un utilitaire partagé (single source of truth).
|
|
- **Checklist review** : aucune fonction de production recopiée dans `*.spec.ts`.
|
|
|
|
- Contexte technique : TypeScript / Jest — 30-03-2026
|
|
|
|
---
|
|
|
|
<a id="risque-test-ecran-indirect"></a>
|
|
## Test d'écran indirect — logique UI validée via helper adjacent non relié au flux
|
|
|
|
### Risques
|
|
|
|
- Le test reste vert même si la logique de décision UI dans le screen diverge du helper testé.
|
|
- Un changement d'implémentation de l'écran ne casse aucun test.
|
|
|
|
### Symptômes
|
|
|
|
- `*.spec.ts` d'un écran qui n'importe pas le composant/écran mais seulement un helper utilitaire adjacent
|
|
- Couverture affichée OK mais comportement réel de l'écran non testé
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
- La logique de décision UI doit être soit testée via rendu composant (`@testing-library/react-native`), soit extraite dans un module dédié importé par le screen ET par le test (single source of truth).
|
|
- **Règle** : un test qui n'importe pas le composant écran ni son module de logique ne peut pas valider le comportement de l'écran.
|
|
|
|
- Contexte technique : React Native / Jest — 30-03-2026
|
|
|
|
---
|
|
|
|
<a id="risque-test-facade-flux-reel"></a>
|
|
## Test de façade — helpers adjacents validés à la place du flux réel
|
|
|
|
### Risques
|
|
|
|
- Une tâche d'intégration (conversion, persistance, atomicité, contrat UI) est clôturée alors que les tests ne valident que des helpers purs (chemins, labels, sanitization).
|
|
- Le pipeline réel, la persistance DB et les transitions UI ne sont jamais exercés.
|
|
|
|
### Symptômes
|
|
|
|
- Tests `*.spec.ts` créés uniquement sur des fonctions utilitaires pures pour une story qui promet un pipeline
|
|
- La tâche est cochée ✅ mais aucun test n'appelle le module de traitement de production
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
- Si une tâche promet conversion, statut DB, atomicité ou contrat UI/public : le test doit appeler le module de production correspondant ou un seam injecté unique.
|
|
- **Règle** : un test qui ne vérifie que des helpers adjacents ne peut pas clôturer une tâche d'intégration.
|
|
|
|
- Contexte technique : TypeScript / Jest — app-template-resto 31-03-2026
|