talas-group/10_QUALITE_TESTS/QA_Fonctionnels/SCENARIOS_TESTS.md
senke 1db6d066c0 nettoyage repo : réorganisation fichiers en vrac, ajout body solidworks + studio mic ref
- 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>
2026-04-09 16:31:26 +02:00

11 KiB

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

# 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