- Body SolidWorks v1 → 02_PRODUITS_PHYSIQUES/Microphone/Conception/ - Studio Mic KiCAD (DIYPerks) → 02_PRODUITS_PHYSIQUES/R&D_References/DIY/ - cleanup_ports.sh → 04_INFRA_DEPLOIEMENT/ - mockup_jeu_ux → 11_RECHERCHE_&_LAB/ - Printables → 12_DOCUMENTATION/Imprimables/ - Screenshots, ideas, one.html → _BROUILLON/ - all-talas (23Go) → 13_ARCHIVES/ - Supprimé all-talas.zip (20Go doublon), lock files LibreOffice - Nettoyé .gitignore - Remote → Forgejo (10.0.20.105:3000) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
394 lines
11 KiB
Markdown
394 lines
11 KiB
Markdown
# Scénarios de tests fonctionnels — Veza
|
|
|
|
> Tests par module : critères d'acceptation, cas limites, flows à valider.
|
|
> Chaque scénario = un test qui doit passer avant mise en production.
|
|
> Dernière mise à jour : avril 2026.
|
|
|
|
---
|
|
|
|
## Organisation
|
|
|
|
### Priorité des tests
|
|
|
|
| Priorité | Signification | Quand exécuter |
|
|
|:--------:|--------------|----------------|
|
|
| **P0** | Bloquant production — si échec, pas de deploy | Chaque PR |
|
|
| **P1** | Critique — à corriger dans les 24h si regression | Chaque release |
|
|
| **P2** | Important — à corriger avant la prochaine release | Hebdomadaire |
|
|
| **P3** | Nice-to-have — à corriger quand possible | Mensuel |
|
|
|
|
### Format d'un scénario
|
|
|
|
```
|
|
[ID] Titre
|
|
Priorité: PX | Type: unit/integ/e2e
|
|
Préconditions: ...
|
|
Étapes:
|
|
1. ...
|
|
2. ...
|
|
Résultat attendu: ...
|
|
Cas limites: ...
|
|
```
|
|
|
|
---
|
|
|
|
## Module 1 — Authentification
|
|
|
|
### AUTH-001 — Inscription email + password
|
|
**P0 | e2e**
|
|
- Préconditions : aucun compte existant
|
|
- Étapes :
|
|
1. POST /auth/register { email, password, username }
|
|
2. Vérifier email reçu (lien de vérification)
|
|
3. Cliquer le lien
|
|
4. Vérifier que le compte est actif
|
|
- Résultat : compte créé, JWT retourné, email vérifié
|
|
- Cas limites :
|
|
- Email déjà pris → erreur 409
|
|
- Username déjà pris → erreur 409
|
|
- Password < 12 car → erreur 400
|
|
- Password pwned (HIBP) → warning (V1.5)
|
|
- Email invalide → erreur 400
|
|
- Lien de vérification expiré (> 24h) → erreur + lien "renvoyer"
|
|
|
|
### AUTH-002 — Login + JWT
|
|
**P0 | integ**
|
|
- Étapes :
|
|
1. POST /auth/login { email, password }
|
|
2. Vérifier cookies HTTP-only (access + refresh)
|
|
3. GET /auth/me avec cookie
|
|
- Résultat : user info retournée
|
|
- Cas limites :
|
|
- Mauvais password → 401 (pas de distinction "email inconnu")
|
|
- Compte verrouillé (5 échecs) → 429 + message "réessaie dans 15 min"
|
|
- Compte non vérifié → 403 "vérifie ton email"
|
|
|
|
### AUTH-003 — Refresh token
|
|
**P0 | integ**
|
|
- Étapes :
|
|
1. Login → obtenir access + refresh
|
|
2. Attendre expiration access (ou simuler)
|
|
3. POST /auth/refresh avec refresh cookie
|
|
- Résultat : nouveau access token, refresh token tourné
|
|
- Cas limites :
|
|
- Refresh expiré → 401
|
|
- Refresh révoqué (post-logout) → 401
|
|
- Double utilisation du même refresh → 401 + révoquer TOUTES les sessions (detection replay)
|
|
|
|
### AUTH-004 — 2FA TOTP
|
|
**P1 | integ**
|
|
- Étapes :
|
|
1. POST /auth/2fa/setup → QR code
|
|
2. POST /auth/2fa/verify { code } → activation
|
|
3. Logout + login → reçoit { requires_2fa: true }
|
|
4. POST /auth/login/2fa { temp_token, code }
|
|
- Résultat : login complet
|
|
- Cas limites :
|
|
- Code TOTP incorrect → 401
|
|
- Code TOTP expiré (> 30s window) → 401
|
|
- Backup code utilisé → OK, code invalidé
|
|
- Tous backup codes utilisés → message "configure un nouveau 2FA"
|
|
|
|
### AUTH-005 — OAuth Discord
|
|
**P1 | e2e**
|
|
- Étapes :
|
|
1. GET /auth/oauth/discord → redirect Discord
|
|
2. User autorise → callback avec code
|
|
3. Backend échange code → crée/lie le compte
|
|
- Résultat : JWT retourné, compte actif
|
|
- Cas limites :
|
|
- State mismatch → 400
|
|
- Discord down → erreur propre "service temporairement indisponible"
|
|
- Email Discord déjà lié à un compte local → propose de lier
|
|
|
|
### AUTH-006 — Rate limiting auth
|
|
**P0 | integ**
|
|
- Étapes :
|
|
1. Envoyer 6 POST /auth/login (mauvais password)
|
|
- Résultat : 429 au 6e avec Retry-After header
|
|
- Vérifier : IP différente ne bloque pas
|
|
|
|
---
|
|
|
|
## Module 2 — Tracks (morceaux)
|
|
|
|
### TRACK-001 — Upload + processing
|
|
**P0 | integ**
|
|
- Étapes :
|
|
1. POST /tracks (metadata)
|
|
2. PUT upload URL (binaire WAV)
|
|
3. POST /tracks/:id/publish
|
|
4. Attendre event "transcoding.completed"
|
|
5. GET /tracks/:id
|
|
- Résultat : track publié, HLS manifest disponible, waveform générée
|
|
- Cas limites :
|
|
- Fichier > 500 MB → 413
|
|
- Format non supporté (.exe, .pdf) → 415
|
|
- ClamAV détecte virus → status "removed" + notif admin
|
|
- Upload interrompu → status "draft" conservé, reprise possible
|
|
|
|
### TRACK-002 — Lecture streaming
|
|
**P0 | e2e**
|
|
- Étapes :
|
|
1. GET /tracks/:id → HLS manifest URL
|
|
2. Charger dans player HLS.js
|
|
3. Vérifier lecture audio
|
|
- Résultat : audio jouable, adaptatif (qualité s'adapte au réseau)
|
|
- Cas limites :
|
|
- Track privé sans auth → 401
|
|
- Track supprimé → 404
|
|
- Connexion lente → fallback bitrate bas
|
|
|
|
### TRACK-003 — Permissions
|
|
**P1 | integ**
|
|
- Vérifier :
|
|
- User A ne peut pas DELETE /tracks/:id de user B → 403
|
|
- User A ne peut pas PUT /tracks/:id de user B → 403
|
|
- Track privé de user A non visible par user B → 404
|
|
- Track avec lien secret accessible avec le bon token
|
|
|
|
---
|
|
|
|
## Module 3 — Samples & Presets
|
|
|
|
### SAMPLE-001 — Upload pack complet
|
|
**P0 | integ**
|
|
- Même flow que TRACK-001 mais avec .zip
|
|
- Vérifications supplémentaires :
|
|
- Extraction liste fichiers post-upload
|
|
- Preview MP3 généré automatiquement
|
|
- Tags indexés pour recherche
|
|
|
|
### SAMPLE-002 — Téléchargement
|
|
**P1 | integ**
|
|
- Étapes :
|
|
1. GET /samples/packs/:id/download
|
|
2. Vérifier URL signée MinIO
|
|
3. Vérifier incrément downloads_count
|
|
- Cas limites :
|
|
- Pack supprimé → 404
|
|
- Rate limit (50 downloads/h) → 429
|
|
|
|
### SAMPLE-003 — Remix (arbre)
|
|
**P1 | integ**
|
|
- Étapes :
|
|
1. Créer pack parent
|
|
2. POST /samples/packs/:id/remix (nouveau pack)
|
|
3. GET /samples/packs/:parent_id/remixes
|
|
- Résultat : arbre parent → enfant visible
|
|
- Cas limites :
|
|
- Parent avec remix_allowed=false → 403
|
|
- Licence incompatible → erreur
|
|
|
|
### SAMPLE-004 — Recherche et filtres
|
|
**P1 | integ**
|
|
- Tester chaque combinaison de filtres :
|
|
- type + genre + bpm_min/max + key + tags + licence
|
|
- sort=recent|popular|downloads
|
|
- Pagination (page + limit)
|
|
- Résultat : résultats cohérents, pas de crash
|
|
|
|
---
|
|
|
|
## Module 4 — Troc
|
|
|
|
### TROC-001 — Flow complet création → closing
|
|
**P0 | e2e**
|
|
- Étapes :
|
|
1. User A : POST /trades/listings (créer annonce)
|
|
2. User B : POST /trades/listings/:id/interest
|
|
3. Vérifier : DM créé entre A et B
|
|
4. User A : POST /trades/listings/:id/conclude { concluded_with: B }
|
|
5. User B : POST /trades/listings/:id/recognition { badges: ['reliable'] }
|
|
- Résultat : annonce "conclue", badges sur profil B
|
|
- Cas limites :
|
|
- Auto-intérêt (creator == interested) → 403
|
|
- Conclude avec user non-intéressé → 400
|
|
- Double reconnaissance → 409
|
|
|
|
### TROC-002 — Détection anti-argent
|
|
**P1 | unit**
|
|
- POST /trades/listings avec "je cherche 100€" → 400
|
|
- POST avec "échange contre euros" → 400
|
|
- POST avec "je propose un mix" → OK
|
|
|
|
### TROC-003 — Limites
|
|
**P1 | integ**
|
|
- 6e annonce active → 400 "max 5 annonces actives"
|
|
- 3e annonce dans la journée → 400 "max 2/jour"
|
|
|
|
---
|
|
|
|
## Module 5 — Shop
|
|
|
|
### SHOP-001 — Parcours achat complet
|
|
**P0 | e2e**
|
|
- Étapes :
|
|
1. GET /shop/products/talas-one → fiche produit
|
|
2. POST /shop/cart/items { variant_id, qty: 1 }
|
|
3. POST /shop/checkout/validate { addresses }
|
|
4. POST /shop/orders → commande créée
|
|
5. POST /payments/create → redirect Mollie
|
|
6. Webhook Mollie payment.paid
|
|
7. Vérifier : order status = "paid", email confirmé, facture générée
|
|
- Cas limites :
|
|
- Stock = 0 → erreur au checkout
|
|
- Réservation expirée (15 min) → stock libéré
|
|
- Webhook Mollie en double → idempotent (pas de double charge)
|
|
- Paiement échoué → order annulé, stock libéré
|
|
|
|
### SHOP-002 — Réservation stock concurrente
|
|
**P0 | integ**
|
|
- Étapes :
|
|
1. Stock = 1 unité
|
|
2. User A et user B tentent checkout simultanément
|
|
- Résultat : un seul réussit, l'autre reçoit "rupture de stock"
|
|
- Vérifier : pas de survente (stock négatif impossible)
|
|
|
|
### SHOP-003 — Calcul prix
|
|
**P0 | unit**
|
|
- Vérifier :
|
|
- Prix base + options = total correct
|
|
- TVA = 0% (franchise en base) avec mention légale
|
|
- Frais de port ajoutés au total
|
|
- Fees Mollie pas facturés au client (absorbés)
|
|
|
|
### SHOP-004 — Remboursement
|
|
**P1 | integ**
|
|
- Étapes :
|
|
1. Commande payée
|
|
2. Admin : POST /admin/payments/:id/refund
|
|
3. Webhook Mollie refund.paid
|
|
4. Vérifier : order status "refunded", facture d'avoir, stock ré-incrémenté
|
|
|
|
---
|
|
|
|
## Module 6 — Cloud Perso
|
|
|
|
### CLOUD-001 — CRUD fichiers
|
|
**P1 | integ**
|
|
- Upload, download, rename, delete, restore
|
|
- Vérifier quotas mis à jour après chaque action
|
|
|
|
### CLOUD-002 — Isolation
|
|
**P0 | integ**
|
|
- User A ne peut pas :
|
|
- Lister les fichiers de user B
|
|
- Télécharger un fichier de user B
|
|
- Supprimer un fichier de user B
|
|
- Même via manipulation d'URL / brute-force UUID
|
|
|
|
### CLOUD-003 — Partage
|
|
**P1 | integ**
|
|
- Créer lien partagé → accessible sans auth
|
|
- Lien avec password → exige le bon password
|
|
- Lien expiré → 410 Gone
|
|
- Max downloads atteint → 403
|
|
|
|
---
|
|
|
|
## Module 7 — Formation
|
|
|
|
### LEARN-001 — Inscription et progression
|
|
**P1 | integ**
|
|
- Enroll → start lesson → complete lesson → progress updated
|
|
- Vérifier progress_percent recalculé correctement
|
|
|
|
### LEARN-002 — Video streaming
|
|
**P1 | e2e**
|
|
- Leçon vidéo → HLS manifest → lecture dans player
|
|
- Position sauvegardée → reprise au bon endroit
|
|
|
|
### LEARN-003 — Permissions contenu
|
|
**P1 | integ**
|
|
- Leçon non-preview sans enrollment → 403
|
|
- Leçon preview → accessible sans enrollment
|
|
- Seul le content_creator peut modifier son cours
|
|
|
|
---
|
|
|
|
## Module 8 — Chat et notifications
|
|
|
|
### CHAT-001 — DM entre users
|
|
**P1 | integ**
|
|
- Créer conversation, envoyer message, recevoir (WebSocket)
|
|
|
|
### CHAT-002 — Groupes
|
|
**P1 | integ**
|
|
- Poster dans un groupe, voir les messages des autres
|
|
- Permissions : modérateur peut supprimer
|
|
|
|
### NOTIF-001 — Notifications
|
|
**P2 | integ**
|
|
- Vérifier que chaque action génère la bonne notif :
|
|
- Like sur track → notif au créateur
|
|
- Intérêt troc → notif à l'annonceur
|
|
- Commande payée → email client
|
|
- SAV message → notif user
|
|
|
|
---
|
|
|
|
## Module 9 — Performance
|
|
|
|
### PERF-001 — Temps de réponse API
|
|
**P1 | load test**
|
|
- GET /tracks (feed) : p95 < 200ms sous 100 req/s
|
|
- GET /tracks/:id : p95 < 100ms
|
|
- POST /auth/login : p95 < 500ms
|
|
|
|
### PERF-002 — Streaming concurrence
|
|
**P1 | load test**
|
|
- 100 connexions WebSocket simultanées → pas de drop
|
|
|
|
### PERF-003 — Upload concurrence
|
|
**P2 | load test**
|
|
- 20 uploads simultanés → pas de timeout, pas de corruption
|
|
|
|
---
|
|
|
|
## Outils de test
|
|
|
|
| Couche | Outil | Langage |
|
|
|--------|-------|---------|
|
|
| Unit backend | `go test` | Go |
|
|
| Unit Rust | `cargo test` | Rust |
|
|
| Unit frontend | Vitest | TypeScript |
|
|
| Integration API | `go test` + httptest | Go |
|
|
| E2E | Playwright | TypeScript |
|
|
| Load | k6 | JavaScript |
|
|
| Sécurité | OWASP ZAP, Nuclei | - |
|
|
| Visual | Storybook + Chromatic | TypeScript |
|
|
|
|
---
|
|
|
|
## Exécution en CI
|
|
|
|
```yaml
|
|
# Chaque PR
|
|
- go test ./...
|
|
- cargo test
|
|
- npm run test
|
|
- govulncheck ./...
|
|
- cargo audit
|
|
- npm audit --audit-level=high
|
|
- gitleaks detect
|
|
|
|
# Nightly
|
|
- playwright test (e2e)
|
|
- k6 run perf-tests.js (load)
|
|
- trivy image scan
|
|
|
|
# Pre-release
|
|
- OWASP checklist manuelle
|
|
- Pentest ciblé si code critique modifié
|
|
```
|
|
|
|
---
|
|
|
|
## Voir aussi
|
|
|
|
- [[Tableaux_Validation/CHECKLIST_VALIDATION_V0]] — checklist pré-vente (86 items)
|
|
- [[Audit_Sécurité/PLAN_AUDIT_SECURITE]] — tests sécurité spécifiques
|
|
- [[Tests_Hardware/PROTOCOLES_TESTS_HARDWARE]] — tests matériel
|
|
- [[ARCHITECTURE_VEZA]] — composants à tester
|
|
- [[05_EXPERIENCE_UTILISATEUR/Flux_Utilisateurs/PARCOURS_UTILISATEURS_VEZA]] — flows à valider en e2e
|