feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024

Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture.

## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU)

- Créer structure features/{api,ui,e2e}
- Déplacer 83 features en 3 catégories via git mv (historique préservé)
  - features/api/ : 53 features (tests API backend)
  - features/ui/ : 22 features (tests UI mobile)
  - features/e2e/ : 8 features (tests end-to-end)

Domaines déplacés :
- API : authentication, recommendation, rgpd-compliance, content-creation,
  moderation, monetisation, premium, radio-live, publicites
- UI : audio-guides, navigation, interest-gauges, mode-offline,
  partage, profil, recherche
- E2E : abonnements, error-handling

## Phase 2 : Mise à jour Documentation

### ADR-007 - Tests BDD
- Ajouter section "Convention de Catégorisation des Features"
- Documenter règles api/ui/e2e avec exemples concrets
- Spécifier step definitions (backend Go, mobile Dart)

### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU)
- Créer ADR dédié pour stratégie CI/CD avec path filters
- Architecture workflows séparés (backend.yml, mobile.yml, shared.yml)
- Configuration path filters détaillée avec exemples YAML
- Matrice de déclenchement et optimisations (~70% gain temps CI)
- Plan d'implémentation (~2h, reporté jusqu'au développement)

### ADR-016 - Organisation Monorepo
- Simplifier en retirant section CI/CD détaillée
- Ajouter référence vers ADR-024 pour stratégie CI/CD

### INCONSISTENCIES-ANALYSIS.md
- Point #10 (Tests BDD synchronisés) :  RÉSOLU
  - Catégorisation features implémentée
  - ADR-007 mis à jour avec convention complète
- Point #11 (70/30 Split paiements) :  ANNULÉ (faux problème)
  - ADR-009 et Règle 18 parfaitement cohérents
  - Documentation exhaustive existante (formule, SQL, comparaisons)
- Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ
  - Architecture CI/CD complète dans ADR-024
  - Implémentation reportée (projet en phase documentation)
- Métriques mises à jour :
  - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté)
  - ADR à jour : 100% (19/19 avec ADR-024)

## Phase 3 : Validation

- Structure features validée (api/ui/e2e, aucun répertoire restant)
- Historique Git préservé (git mv, renommages détectés)
- 83 features total (API: 53, UI: 22, E2E: 8)

Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
jpgiannetti
2026-02-01 11:31:41 +01:00
parent 841028d1b2
commit 37c62206ad
88 changed files with 625 additions and 67 deletions

View File

@@ -0,0 +1,119 @@
# language: fr
Fonctionnalité: Classification des contenus par âge
En tant que plateforme responsable
Je veux classifier les contenus par tranche d'âge
Afin de protéger les mineurs et respecter les obligations légales
Contexte:
Étant donné que l'API RoadWave est disponible
Scénario: Créateur doit classifier son contenu à la publication
Étant donné que je suis un créateur connecté
Quand je crée un nouveau contenu audio
Alors je dois obligatoirement choisir une classification d'âge parmi:
| classification | description |
| Tout public | Contenu adapté à tous les âges |
| 13+ | Contenu mature léger |
| 16+ | Contenu mature |
| 18+ | Contenu adulte |
Scénario: Publication impossible sans classification
Étant donné que je crée un contenu audio
Quand j'essaie de publier sans sélectionner de classification
Alors la publication échoue
Et je vois le message "Vous devez sélectionner une classification d'âge"
Scénario: Utilisateur 13-15 ans voit uniquement du contenu "Tout public"
Étant donné que je suis un utilisateur de 14 ans
Et qu'il existe des contenus avec les classifications suivantes:
| classification | nombre |
| Tout public | 20 |
| 13+ | 15 |
| 16+ | 10 |
| 18+ | 5 |
Quand je demande des recommandations
Alors je vois uniquement les 20 contenus "Tout public"
Et les autres contenus ne sont jamais proposés
Scénario: Utilisateur 16-17 ans voit "Tout public" et "13+"
Étant donné que je suis un utilisateur de 17 ans
Et qu'il existe des contenus avec les classifications suivantes:
| classification | nombre |
| Tout public | 20 |
| 13+ | 15 |
| 16+ | 10 |
| 18+ | 5 |
Quand je demande des recommandations
Alors je vois 35 contenus (Tout public + 13+)
Et les contenus 16+ et 18+ ne sont pas proposés
Scénario: Utilisateur 18+ voit tous les contenus
Étant donné que je suis un utilisateur de 25 ans
Et qu'il existe des contenus avec toutes les classifications
Quand je demande des recommandations
Alors je vois tous les contenus sans restriction
Et aucun filtre d'âge n'est appliqué
Scénario: Mode Kids activé automatiquement pour les moins de 13 ans
Étant donné que je m'inscris avec une date de naissance "2013-01-21"
Alors le mode Kids est activé automatiquement
Et je vois uniquement du contenu "Tout public"
Et des protections supplémentaires sont appliquées
Scénario: Modérateur reclassifie un contenu mal catégorisé
Étant donné qu'un contenu est publié avec la classification "Tout public"
Et que ce contenu contient du langage inapproprié détecté en modération
Quand le modérateur reclassifie ce contenu en "16+"
Alors la nouvelle classification est appliquée immédiatement
Et le contenu n'est plus visible pour les utilisateurs de moins de 16 ans
Et le créateur reçoit une notification de reclassification
Scénario: Strike si classification volontairement incorrecte
Étant donné qu'un créateur a publié un contenu "18+" classifié comme "Tout public"
Et que ce contenu a été signalé
Quand le modérateur confirme la mauvaise classification volontaire
Alors le créateur reçoit 1 strike
Et le contenu est reclassifié en "18+"
Et le créateur reçoit une notification explicative
Scénario: Créateur peut voir la distribution d'âge de son audience
Étant donné que je suis un créateur
Et que j'ai publié des contenus avec différentes classifications
Quand je consulte mes statistiques
Alors je vois la répartition des âges de mes auditeurs:
| tranche_age | pourcentage |
| 13-15 ans | 15% |
| 16-17 ans | 20% |
| 18+ ans | 65% |
Scénario: Recherche filtrée par classification d'âge
Étant donné que je suis un utilisateur de 16 ans
Quand je recherche des contenus
Alors les résultats incluent uniquement:
| classification |
| Tout public |
| 13+ |
Et je ne vois pas les contenus 16+ et 18+ dans les résultats
Scénario: Notification si tentative d'accès à contenu non autorisé
Étant donné que je suis un utilisateur de 14 ans
Et qu'un contenu "16+" est partagé avec moi via un lien direct
Quand j'essaie d'accéder au contenu
Alors l'accès est refusé
Et je vois le message "Ce contenu est réservé aux utilisateurs de 16 ans et plus"
Scénario: Validation obligatoire des 3 premiers contenus inclut la classification
Étant donné que je suis un nouveau créateur
Et que je publie mon premier contenu classifié "18+"
Quand le modérateur valide mon contenu
Alors il vérifie que la classification "18+" est appropriée
Et peut la modifier si nécessaire avant validation
Scénario: Statistiques de classification dans l'interface créateur
Étant donné que je suis un créateur
Quand je consulte mes contenus publiés
Alors je vois pour chaque contenu:
| information | exemple |
| Classification actuelle | 13+ |
| Nombre de signalements | 2 |
| Reclassifications | Aucune / 1× par modérateur |

View File

@@ -0,0 +1,84 @@
# language: fr
Fonctionnalité: Connexion utilisateur
En tant qu'utilisateur existant
Je veux me connecter à mon compte
Afin d'accéder à mes contenus et paramètres
Contexte:
Étant donné que l'API RoadWave est disponible
Et qu'un utilisateur existe avec:
| email | mot_de_passe |
| user@test.fr | Password123 |
Scénario: Connexion réussie avec identifiants valides
Quand je me connecte avec:
| email | mot_de_passe |
| user@test.fr | Password123 |
Alors je suis connecté avec succès
Et je reçois un access token valide pour 15 minutes
Et je reçois un refresh token valide pour 30 jours
Scénario: Connexion échouée avec email inexistant
Quand je me connecte avec l'email "inexistant@test.fr"
Alors la connexion échoue
Et je vois le message "Email ou mot de passe incorrect"
Scénario: Connexion échouée avec mot de passe incorrect
Quand je me connecte avec:
| email | mot_de_passe |
| user@test.fr | MauvaisPass1 |
Alors la connexion échoue
Et je vois le message "Email ou mot de passe incorrect"
Scénario: Blocage après 5 tentatives échouées
Étant donné que j'ai échoué 4 tentatives de connexion
Quand j'échoue une 5ème tentative de connexion
Alors mon compte est temporairement bloqué
Et je vois le message "Compte bloqué pour 15 minutes après 5 tentatives échouées"
Et je reçois un email de notification de blocage
Scénario: Tentative de connexion pendant le blocage
Étant donné que mon compte est bloqué suite à 5 tentatives échouées
Et que seulement 5 minutes se sont écoulées
Quand j'essaie de me connecter avec les bons identifiants
Alors la connexion échoue
Et je vois le message "Compte bloqué. Réessayez dans 10 minutes"
Scénario: Déblocage automatique après 15 minutes
Étant donné que mon compte est bloqué suite à 5 tentatives échouées
Et que 15 minutes se sont écoulées
Quand je me connecte avec les bons identifiants
Alors je suis connecté avec succès
Et le compteur de tentatives est réinitialisé
Scénario: Reset du compteur après connexion réussie
Étant donné que j'ai échoué 3 tentatives de connexion
Quand je me connecte avec les bons identifiants
Alors je suis connecté avec succès
Et le compteur de tentatives est remis à 0
Scénario: Reset automatique du compteur après 15 minutes sans blocage
Étant donné que j'ai échoué 3 tentatives de connexion
Et que 15 minutes se sont écoulées sans nouvelle tentative
Quand je consulte mon compteur de tentatives
Alors le compteur est réinitialisé à 0
Scénario: Déblocage via lien "Mot de passe oublié"
Étant donné que mon compte est bloqué suite à 5 tentatives échouées
Quand j'utilise la fonction "Mot de passe oublié"
Et que je réinitialise mon mot de passe
Alors le blocage est levé immédiatement
Et je peux me connecter avec le nouveau mot de passe
Scénario: Email de notification lors d'un blocage
Étant donné que j'ai échoué 5 tentatives de connexion
Alors je reçois un email avec:
| sujet | Tentatives de connexion suspectes détectées |
| contenu_contient | Votre compte a été temporairement bloqué |
| lien_mot_de_passe | présent |
Scénario: Connexion multi-device simultanée autorisée
Étant donné que je suis connecté sur un appareil iOS
Quand je me connecte également sur un appareil Android
Alors les deux sessions sont actives simultanément
Et je peux utiliser l'application sur les deux appareils

View File

@@ -0,0 +1,112 @@
# language: fr
Fonctionnalité: Inscription utilisateur
En tant que nouvel utilisateur
Je veux créer un compte avec email et mot de passe
Afin d'accéder à l'application RoadWave
Contexte:
Étant donné que l'API RoadWave est disponible
Et que Zitadel est configuré
Scénario: Inscription réussie avec données valides
Étant donné que l'email "nouveau@example.com" n'existe pas
Quand je m'inscris avec les données suivantes:
| champ | valeur |
| email | nouveau@example.com |
| mot_de_passe | Password123 |
| pseudo | nouveau_user |
| date_naissance | 1995-06-15 |
Alors mon compte est créé avec succès
Et je reçois un email de vérification
Et le lien de vérification expire dans 7 jours
Et je suis redirigé vers l'application
Scénario: Inscription avec email déjà existant
Étant donné qu'un utilisateur existe avec l'email "existant@example.com"
Quand je m'inscris avec l'email "existant@example.com"
Alors l'inscription échoue
Et je vois le message "Cet email est déjà utilisé"
Scénario: Inscription avec mot de passe invalide - trop court
Quand je m'inscris avec un mot de passe de moins de 8 caractères "Pass1"
Alors l'inscription échoue
Et je vois le message "Le mot de passe doit contenir au moins 8 caractères"
Scénario: Inscription avec mot de passe invalide - sans majuscule
Quand je m'inscris avec un mot de passe sans majuscule "password123"
Alors l'inscription échoue
Et je vois le message "Le mot de passe doit contenir au moins une majuscule"
Scénario: Inscription avec mot de passe invalide - sans chiffre
Quand je m'inscris avec un mot de passe sans chiffre "Password"
Alors l'inscription échoue
Et je vois le message "Le mot de passe doit contenir au moins un chiffre"
Scénario: Inscription avec pseudo invalide - trop court
Quand je m'inscris avec un pseudo de 2 caractères "ab"
Alors l'inscription échoue
Et je vois le message "Le pseudo doit contenir entre 3 et 30 caractères"
Scénario: Inscription avec pseudo invalide - caractères spéciaux
Quand je m'inscris avec un pseudo contenant des caractères spéciaux "user@123"
Alors l'inscription échoue
Et je vois le message "Le pseudo ne peut contenir que des lettres, chiffres et underscores"
Scénario: Inscription avec email invalide
Quand je m'inscris avec un email invalide "email.invalide"
Alors l'inscription échoue
Et je vois le message "Format d'email invalide"
Plan du Scénario: Inscription avec âge minimum non respecté
Étant donné la date du jour est "2026-01-21"
Quand je m'inscris avec une date de naissance "<date_naissance>"
Alors l'inscription échoue
Et je vois le message "Vous devez avoir au moins 13 ans pour créer un compte"
Exemples:
| date_naissance | age |
| 2013-01-22 | 12 |
| 2015-06-15 | 10 |
| 2020-01-01 | 6 |
Scénario: Inscription avec âge limite acceptable (13 ans)
Étant donné la date du jour est "2026-01-21"
Quand je m'inscris avec une date de naissance "2013-01-21"
Alors mon compte est créé avec succès
Et le mode Kids est activé automatiquement
Scénario: Inscription avec âge supérieur à 18 ans
Étant donné la date du jour est "2026-01-21"
Quand je m'inscris avec une date de naissance "1990-06-15"
Alors mon compte est créé avec succès
Et j'ai accès à tous les contenus sans restriction d'âge
Scénario: Données minimales requises à l'inscription
Quand je m'inscris sans fournir de nom complet
Et sans fournir de photo de profil
Et sans fournir de bio
Alors mon compte est créé avec succès
Et un avatar par défaut est généré
Et les champs optionnels sont vides
Scénario: Renvoyer l'email de vérification
Étant donné que je me suis inscrit avec l'email "nouveau@example.com"
Et que je n'ai pas vérifié mon email
Quand je demande à renvoyer l'email de vérification
Alors un nouvel email de vérification est envoyé
Et le précédent lien est invalidé
Scénario: Limite de renvoi d'email de vérification
Étant donné que je me suis inscrit avec l'email "nouveau@example.com"
Et que j'ai déjà renvoyé l'email de vérification 3 fois aujourd'hui
Quand je demande à renvoyer l'email de vérification une 4ème fois
Alors la demande échoue
Et je vois le message "Vous avez atteint la limite de 3 renvois par jour"
Scénario: Expiration du lien de vérification
Étant donné que je me suis inscrit il y a 8 jours
Et que je n'ai pas vérifié mon email
Quand j'essaie d'utiliser le lien de vérification
Alors la vérification échoue
Et je vois le message "Ce lien a expiré"
Et je peux demander un nouveau lien

View File

@@ -0,0 +1,107 @@
# language: fr
Fonctionnalité: Récupération de compte
En tant qu'utilisateur ayant oublié son mot de passe
Je veux pouvoir réinitialiser mon mot de passe via email
Afin de récupérer l'accès à mon compte
Contexte:
Étant donné que l'API RoadWave est disponible
Et qu'un utilisateur existe avec l'email "user@test.fr"
Scénario: Demander la réinitialisation du mot de passe
Quand je clique sur "Mot de passe oublié"
Et que je saisis mon email "user@test.fr"
Alors je reçois un email avec un lien de réinitialisation
Et le lien expire dans 1 heure
Et je vois le message "Email de réinitialisation envoyé"
Scénario: Email inexistant lors de la demande de réinitialisation
Quand je demande une réinitialisation pour l'email "inexistant@test.fr"
Alors je vois le même message "Email de réinitialisation envoyé"
Mais aucun email n'est envoyé (sécurité - pas d'énumération d'emails)
Scénario: Réinitialiser le mot de passe avec un lien valide
Étant donné que j'ai demandé une réinitialisation de mot de passe
Et que j'ai reçu le lien de réinitialisation
Quand je clique sur le lien
Et que je saisis un nouveau mot de passe "NouveauPass123"
Et que je confirme le nouveau mot de passe "NouveauPass123"
Alors mon mot de passe est modifié avec succès
Et je suis déconnecté de tous mes appareils sauf celui en cours
Et je reçois un email de confirmation de changement
Scénario: Lien de réinitialisation expiré
Étant donné que j'ai demandé une réinitialisation il y a 2 heures
Quand j'essaie d'utiliser le lien
Alors je vois le message "Ce lien a expiré"
Et je peux demander un nouveau lien
Scénario: Nouveau mot de passe ne respecte pas les règles
Étant donné que j'ai un lien de réinitialisation valide
Quand je saisis un nouveau mot de passe "faible"
Alors la réinitialisation échoue
Et je vois le message "Le mot de passe doit contenir au moins 8 caractères, 1 majuscule et 1 chiffre"
Scénario: Confirmation du mot de passe ne correspond pas
Étant donné que j'ai un lien de réinitialisation valide
Quand je saisis un nouveau mot de passe "NouveauPass123"
Et que je confirme avec un mot de passe différent "AutrePass123"
Alors la réinitialisation échoue
Et je vois le message "Les mots de passe ne correspondent pas"
Scénario: Limite de demandes de réinitialisation
Étant donné que j'ai déjà demandé 3 réinitialisations dans la dernière heure
Quand je demande une 4ème réinitialisation
Alors la demande échoue
Et je vois le message "Maximum 3 demandes par heure. Réessayez plus tard."
Scénario: Compteur de demandes se réinitialise après 1 heure
Étant donné que j'ai demandé 3 réinitialisations
Et que 1 heure s'est écoulée
Quand je demande une nouvelle réinitialisation
Alors la demande réussit
Et je reçois un email avec un nouveau lien
Scénario: Email de notification de changement de mot de passe
Étant donné que je viens de réinitialiser mon mot de passe
Alors je reçois un email de confirmation avec:
| sujet | Votre mot de passe a été modifié |
| contenu_contient | Votre mot de passe a été modifié |
| date_heure | présente |
| appareil | présent |
| localisation | présente |
| action_urgence | Lien si ce n'était pas vous |
Scénario: Notification push si changement depuis appareil non reconnu
Étant donné que je me suis toujours connecté depuis mon iPhone
Et que je réinitialise mon mot de passe depuis un PC Windows
Alors je reçois une notification push sur mon iPhone avec:
| titre | Mot de passe modifié |
| message | Depuis Windows - Paris, France |
| action | Sécuriser le compte si ce n'est pas vous |
Scénario: Déconnexion de tous les appareils après réinitialisation
Étant donné que je suis connecté sur 4 appareils différents
Et que je réinitialise mon mot de passe depuis un navigateur web
Alors les 3 autres appareils sont déconnectés immédiatement
Et seule la session du navigateur web reste active
Et je vois le message "Vous avez été déconnecté des autres appareils par sécurité"
Scénario: Lien de réinitialisation invalide si déjà utilisé
Étant donné que j'ai réinitialisé mon mot de passe avec un lien
Quand j'essaie de réutiliser le même lien
Alors je vois le message "Ce lien a déjà été utilisé"
Et je peux demander un nouveau lien si nécessaire
Scénario: Nouveau lien invalide l'ancien
Étant donné que j'ai demandé une réinitialisation et reçu un lien
Quand je demande une nouvelle réinitialisation
Alors l'ancien lien est invalidé
Et seul le nouveau lien fonctionne
Scénario: Réinitialisation débloque un compte bloqué
Étant donné que mon compte est bloqué après 5 tentatives de connexion
Quand je réinitialise mon mot de passe via email
Alors le blocage est levé immédiatement
Et je peux me connecter avec le nouveau mot de passe
Et le compteur de tentatives est remis à 0

View File

@@ -0,0 +1,114 @@
# language: fr
Fonctionnalité: Gestion des sessions et tokens
En tant qu'utilisateur connecté
Je veux que mes sessions soient sécurisées et gérées automatiquement
Afin de maintenir l'accès à l'application sans friction
Contexte:
Étant donné que l'API RoadWave est disponible
Et que je suis connecté avec succès
Scénario: Access token expire après 15 minutes
Étant donné que j'ai reçu un access token
Et que 15 minutes se sont écoulées
Quand je fais une requête API avec cet access token
Alors la requête échoue avec le code 401
Et je vois le message "Token expiré"
Scénario: Refresh automatique du token avec refresh token
Étant donné que mon access token a expiré
Et que mon refresh token est valide
Quand l'application demande un nouveau access token
Alors je reçois un nouvel access token valide pour 15 minutes
Et je reçois un nouveau refresh token (rotation)
Et l'ancien refresh token est invalidé
Scénario: Refresh token expire après 30 jours d'inactivité
Étant donné que je me suis connecté il y a 30 jours
Et que je n'ai pas utilisé l'application depuis
Quand j'essaie d'utiliser mon refresh token
Alors la requête échoue
Et je dois me reconnecter avec email/password
Scénario: Prolongation automatique de la session si l'app est utilisée
Étant donné que je me suis connecté il y a 25 jours
Et que j'utilise l'application régulièrement
Quand je fais une requête API
Alors ma session est automatiquement prolongée
Et mon refresh token reste valide
Scénario: Détection de token replay attack
Étant donné que j'ai rafraîchi mon token
Et que j'ai reçu un nouveau refresh token
Quand j'essaie de réutiliser l'ancien refresh token
Alors la requête échoue
Et je vois le message "Token invalide ou révoqué"
Et toutes mes sessions sont révoquées par sécurité
Scénario: Voir la liste des appareils connectés
Étant donné que je suis connecté sur 3 appareils différents
Quand je consulte la liste de mes appareils connectés
Alors je vois 3 appareils avec les informations suivantes:
| information | exemple |
| OS | iOS 17.1 |
| Navigateur | Safari |
| Dernière connexion | Il y a 2 heures |
| Localisation | Paris, France (IP visible) |
Scénario: Révoquer un appareil spécifique
Étant donné que je suis connecté sur mon iPhone et mon iPad
Quand je révoque la session de mon iPad depuis les paramètres
Alors la session iPad est immédiatement déconnectée
Et ma session iPhone reste active
Scénario: Déconnecter tous les appareils sauf celui en cours
Étant donné que je suis connecté sur 4 appareils
Quand je clique sur "Déconnecter tous les appareils"
Alors les 3 autres appareils sont déconnectés
Et seul l'appareil actuel reste connecté
Scénario: Alerte de connexion depuis nouveau device
Étant donné que je me suis toujours connecté depuis Paris
Quand je me connecte depuis un nouvel appareil à Lyon
Alors je reçois une notification push sur mes autres appareils
Et je reçois un email avec:
| sujet | Nouvelle connexion détectée |
| localisation | Lyon, France |
| appareil | Android 14 - Chrome |
| action | Lien pour révoquer la session |
Scénario: Alerte de connexion suspecte depuis pays différent
Étant donné que je me suis toujours connecté depuis la France
Quand je me connecte depuis un appareil aux États-Unis
Alors je reçois une notification push immédiate
Et je reçois un email d'alerte de sécurité
Et la nouvelle session nécessite une validation 2FA même si désactivée
Scénario: Déconnexion après 30 jours d'inactivité totale
Étant donné que je ne me suis pas connecté depuis 30 jours
Quand j'ouvre l'application
Alors je suis automatiquement déconnecté
Et je dois me reconnecter avec email/password
Et je vois le message "Session expirée après 30 jours d'inactivité"
Scénario: Sessions multiples simultanées autorisées
Étant donné que je suis connecté sur:
| appareil |
| iPhone |
| iPad |
| PC Windows (Web) |
Quand je fais des actions sur les 3 appareils simultanément
Alors toutes les sessions fonctionnent sans conflit
Et chaque appareil maintient sa propre session
Scénario: Validation de JWT via Zitadel
Étant donné que j'ai reçu un access token JWT
Quand l'API RoadWave valide le token
Alors la validation est faite localement avec la clé publique Zitadel
Et aucune requête externe n'est effectuée (performance)
Et le token contient les claims suivants:
| claim | valeur_exemple |
| sub | user-id-123 |
| email | user@test.fr |
| exp | timestamp + 15 minutes |
| iss | zitadel.roadwave.com |

View File

@@ -0,0 +1,132 @@
# language: fr
Fonctionnalité: Authentification à deux facteurs (2FA)
En tant qu'utilisateur soucieux de sécurité
Je veux activer la 2FA sur mon compte
Afin de protéger mon accès même si mon mot de passe est compromis
Contexte:
Étant donné que l'API RoadWave est disponible
Et que je suis connecté à mon compte
Scénario: Activer la 2FA TOTP (Time-based One-Time Password)
Étant donné que la 2FA n'est pas activée sur mon compte
Quand je choisis d'activer la 2FA TOTP
Alors je vois un QR code à scanner
Et je vois le secret partagé en texte clair (backup)
Et je dois entrer un code de vérification depuis mon app authenticator
Quand je saisis un code TOTP valide
Alors la 2FA TOTP est activée avec succès
Et je reçois des codes de backup (10 codes)
Scénario: Connexion avec 2FA TOTP activée
Étant donné que la 2FA TOTP est activée sur mon compte
Quand je me connecte avec email/password
Alors je suis redirigé vers la page de saisie du code 2FA
Quand je saisis un code TOTP valide de mon authenticator
Alors je suis connecté avec succès
Scénario: Connexion échouée avec code TOTP invalide
Étant donné que la 2FA TOTP est activée
Quand je me connecte avec email/password
Et que je saisis un code TOTP invalide "000000"
Alors la connexion échoue
Et je vois le message "Code d'authentification invalide"
Et je peux réessayer
Scénario: Utiliser un code de backup pour 2FA
Étant donné que la 2FA TOTP est activée
Et que j'ai perdu l'accès à mon authenticator
Quand je me connecte avec email/password
Et que je clique sur "Utiliser un code de backup"
Et que je saisis un code de backup valide
Alors je suis connecté avec succès
Et le code de backup utilisé est invalidé
Et il me reste 9 codes de backup
Scénario: Activer la 2FA par email
Étant donné que la 2FA n'est pas activée
Quand je choisis d'activer la 2FA par email
Alors la 2FA email est activée immédiatement
Et je vois le message "2FA email activée. Vous recevrez un code à chaque connexion"
Scénario: Connexion avec 2FA email
Étant donné que la 2FA email est activée
Quand je me connecte avec email/password
Alors je reçois un email avec un code à 6 chiffres
Et le code expire dans 10 minutes
Et je dois saisir ce code pour terminer la connexion
Scénario: Code 2FA email expiré
Étant donné que la 2FA email est activée
Et que je me suis connecté avec email/password
Et que j'ai reçu un code 2FA par email il y a 11 minutes
Quand je saisis ce code
Alors la connexion échoue
Et je vois le message "Code expiré. Demandez un nouveau code."
Scénario: Renvoyer le code 2FA email
Étant donné que la 2FA email est activée
Et que je suis sur la page de saisie du code 2FA
Quand je clique sur "Renvoyer le code"
Alors je reçois un nouveau code par email
Et l'ancien code est invalidé
Scénario: Ajouter un appareil de confiance (skip 2FA pendant 30 jours)
Étant donné que la 2FA TOTP est activée
Quand je me connecte avec email/password et code TOTP
Et que je coche "Ne plus demander sur cet appareil"
Alors je suis connecté avec succès
Et cet appareil est enregistré comme "appareil de confiance"
Quand je me reconnecte dans les 30 jours suivants sur ce même appareil
Alors je ne dois pas saisir de code 2FA
Scénario: Appareil de confiance expire après 30 jours
Étant donné que j'ai enregistré un appareil de confiance il y a 31 jours
Quand je me connecte depuis cet appareil
Alors je dois saisir un code 2FA
Et je vois le message "Appareil de confiance expiré. Veuillez vous authentifier"
Scénario: Voir la liste des appareils de confiance
Étant donné que j'ai enregistré 3 appareils de confiance
Quand je consulte mes paramètres de sécurité
Alors je vois la liste de mes 3 appareils de confiance avec:
| information | exemple |
| Nom | iPhone 13 - Safari |
| Date ajout | 15 janvier 2026 |
| Dernière vue | Il y a 2 heures |
| Expire le | 14 février 2026 |
Scénario: Révoquer un appareil de confiance
Étant donné que j'ai un iPhone enregistré comme appareil de confiance
Quand je révoque cet appareil depuis les paramètres
Alors l'appareil est supprimé de la liste
Quand je me reconnecte depuis cet iPhone
Alors je dois saisir un code 2FA
Scénario: Révoquer tous les appareils de confiance
Étant donné que j'ai 5 appareils de confiance enregistrés
Quand je clique sur "Révoquer tous les appareils de confiance"
Alors tous les appareils sont révoqués
Et je vois le message "Tous les appareils de confiance ont été révoqués"
Scénario: 2FA forcée pour connexion suspecte malgré appareil de confiance
Étant donné que j'ai un appareil de confiance enregistré en France
Et que je me connecte depuis ce même appareil mais avec une IP américaine
Quand je tente de me connecter
Alors la 2FA est requise malgré l'appareil de confiance
Et je vois le message "Connexion suspecte détectée. Authentification requise."
Scénario: Désactiver la 2FA
Étant donné que la 2FA TOTP est activée
Quand je désactive la 2FA depuis mes paramètres
Et que je confirme avec mon mot de passe
Alors la 2FA est désactivée
Et tous les codes de backup sont invalidés
Et tous les appareils de confiance sont révoqués
Scénario: Régénérer les codes de backup
Étant donné que la 2FA est activée
Et que j'ai utilisé 8 codes de backup sur 10
Quand je demande à régénérer les codes de backup
Alors je reçois 10 nouveaux codes
Et tous les anciens codes (utilisés ou non) sont invalidés

View File

@@ -0,0 +1,79 @@
# language: fr
Fonctionnalité: Vérification d'email
En tant qu'utilisateur inscrit
Je veux vérifier mon adresse email
Afin d'accéder à toutes les fonctionnalités selon mon rôle
Contexte:
Étant donné que l'API RoadWave est disponible
Scénario: Auditeur avec email non vérifié - lecture illimitée
Étant donné que je suis un auditeur avec email non vérifié
Quand j'essaie d'écouter du contenu
Alors je peux écouter tous les contenus sans limite
Scénario: Auditeur avec email non vérifié - création limitée à 5 contenus
Étant donné que je suis un auditeur avec email non vérifié
Et que j'ai créé 4 contenus
Quand je crée un 5ème contenu
Alors le contenu est créé avec succès
Mais quand j'essaie de créer un 6ème contenu
Alors la création échoue
Et je vois le message "Vérifiez votre email pour créer plus de contenus"
Scénario: Rappel de vérification après le 3ème contenu créé
Étant donné que je suis un auditeur avec email non vérifié
Et que j'ai créé 2 contenus
Quand je crée mon 3ème contenu
Alors le contenu est créé avec succès
Et je vois une notification in-app "Vérifiez votre email pour débloquer la création illimitée"
Scénario: Auditeur vérifie son email
Étant donné que je suis un auditeur avec email non vérifié
Et que j'ai reçu un lien de vérification
Quand je clique sur le lien de vérification dans l'email
Alors mon email est marqué comme vérifié
Et je vois le message "Email vérifié avec succès"
Et toutes les fonctionnalités sont débloquées
Scénario: Créateur doit vérifier son email sous 7 jours pour monétisation
Étant donné que je suis inscrit comme créateur
Et que mon email n'est pas vérifié
Et que je remplis les conditions de monétisation
Quand j'essaie d'accéder au programme de monétisation
Alors l'accès est refusé
Et je vois le message "Vérifiez votre email pour accéder à la monétisation"
Scénario: Créateur ne peut pas publier de contenus illimités sans vérification
Étant donné que je suis un créateur avec email non vérifié
Et que j'ai créé 5 contenus
Quand j'essaie de créer un 6ème contenu
Alors la création échoue
Et je vois le message "Vérifiez votre email pour publier des contenus illimités"
Scénario: Créateur vérifie son email et déboque tout
Étant donné que je suis un créateur avec email non vérifié
Et que j'ai reçu un lien de vérification
Quand je clique sur le lien de vérification
Alors mon email est marqué comme vérifié
Et je peux publier des contenus illimités
Et je peux accéder au programme de monétisation si j'en remplis les conditions
Scénario: KYC impossible sans email vérifié
Étant donné que je suis un créateur avec email non vérifié
Quand j'essaie de compléter le KYC via Mangopay
Alors l'accès au KYC est refusé
Et je vois le message "Vérifiez votre email avant de procéder au KYC"
Scénario: Tentative de vérification avec un lien déjà utilisé
Étant donné que j'ai déjà vérifié mon email avec un lien
Quand j'essaie de réutiliser le même lien de vérification
Alors la vérification échoue
Et je vois le message "Ce lien a déjà été utilisé"
Scénario: Auditeur vérifié peut créer plus de 5 contenus
Étant donné que je suis un auditeur avec email vérifié
Et que j'ai créé 10 contenus
Quand je crée un 11ème contenu
Alors le contenu est créé avec succès
Et il n'y a pas de limite de création