Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. **Structure cible:** ``` docs/domains/ ├── README.md (Context Map) ├── _shared/ (Core Domain) ├── recommendation/ (Supporting Subdomain) ├── content/ (Supporting Subdomain) ├── moderation/ (Supporting Subdomain) ├── advertising/ (Generic Subdomain) ├── premium/ (Generic Subdomain) └── monetization/ (Generic Subdomain) ``` **Changements effectués:** Phase 1: Création de l'arborescence des 7 bounded contexts Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/ Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/ Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/ Phase 5: Création des README.md pour chaque domaine Phase 6: Déplacement des features Gherkin vers domains/*/features/ Phase 7: Création du Context Map (domains/README.md) Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh) Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/) **Configuration des tests:** - Makefile: godog run docs/domains/*/features/ - scripts/generate-bdd-docs.py: features_dir → docs/domains **Avantages:** ✅ Cohésion forte: toute la doc d'un domaine au même endroit ✅ Couplage faible: domaines indépendants, dépendances explicites ✅ Navigabilité améliorée: README par domaine = entrée claire ✅ Alignement code/docs: miroir de backend/internal/ ✅ Onboarding facilité: exploration domaine par domaine ✅ Tests BDD intégrés: features au plus près des règles métier Voir docs/REFACTOR-DDD.md pour le plan complet.
251 lines
11 KiB
Gherkin
251 lines
11 KiB
Gherkin
# language: fr
|
|
|
|
@api @authentication @security @mvp
|
|
Fonctionnalité: Validation des règles de mot de passe
|
|
|
|
En tant que système d'authentification
|
|
Je veux valider la complexité des mots de passe
|
|
Afin de garantir la sécurité des comptes utilisateurs
|
|
|
|
Contexte:
|
|
Étant donné un utilisateur souhaite créer un compte ou modifier son mot de passe
|
|
|
|
# ============================================================================
|
|
# VALIDATION LONGUEUR MINIMALE (8 CARACTÈRES)
|
|
# ============================================================================
|
|
|
|
Scénario: Mot de passe valide avec 8 caractères minimum
|
|
Étant donné l'utilisateur saisit le mot de passe "Azerty123"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Et aucune erreur ne doit être affichée
|
|
|
|
Scénario: Mot de passe trop court (7 caractères)
|
|
Étant donné l'utilisateur saisit le mot de passe "Azert12"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et le message d'erreur doit être "Le mot de passe doit contenir au moins 8 caractères"
|
|
Et le champ doit être marqué en rouge
|
|
|
|
Scénario: Mot de passe très court (3 caractères)
|
|
Étant donné l'utilisateur saisit le mot de passe "Ab1"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et le message d'erreur doit être "Le mot de passe doit contenir au moins 8 caractères"
|
|
|
|
# ============================================================================
|
|
# VALIDATION MAJUSCULE REQUISE
|
|
# ============================================================================
|
|
|
|
Scénario: Mot de passe valide avec au moins 1 majuscule
|
|
Étant donné l'utilisateur saisit le mot de passe "Monpass123"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Et le critère "majuscule" doit être validé avec une coche verte
|
|
|
|
Scénario: Mot de passe sans majuscule
|
|
Étant donné l'utilisateur saisit le mot de passe "monpass123"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et le message d'erreur doit être "Le mot de passe doit contenir au moins 1 majuscule"
|
|
|
|
Scénario: Mot de passe avec plusieurs majuscules
|
|
Étant donné l'utilisateur saisit le mot de passe "MonPASSword123"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car au moins 1 majuscule est présente
|
|
|
|
# ============================================================================
|
|
# VALIDATION CHIFFRE REQUIS
|
|
# ============================================================================
|
|
|
|
Scénario: Mot de passe valide avec au moins 1 chiffre
|
|
Étant donné l'utilisateur saisit le mot de passe "Monpass1"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Et le critère "chiffre" doit être validé avec une coche verte
|
|
|
|
Scénario: Mot de passe sans chiffre
|
|
Étant donné l'utilisateur saisit le mot de passe "Monpassword"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et le message d'erreur doit être "Le mot de passe doit contenir au moins 1 chiffre"
|
|
|
|
Scénario: Mot de passe avec plusieurs chiffres
|
|
Étant donné l'utilisateur saisit le mot de passe "Monpass123456"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car au moins 1 chiffre est présent
|
|
|
|
# ============================================================================
|
|
# VALIDATION COMBINÉE DES 3 CRITÈRES
|
|
# ============================================================================
|
|
|
|
Scénario: Mot de passe valide respectant tous les critères
|
|
Étant donné l'utilisateur saisit le mot de passe "SecurePass2024!"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Et tous les critères doivent être validés :
|
|
| critère | statut |
|
|
| longueur | ✓ |
|
|
| majuscule | ✓ |
|
|
| chiffre | ✓ |
|
|
|
|
Scénario: Mot de passe échouant sur plusieurs critères
|
|
Étant donné l'utilisateur saisit le mot de passe "pass"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et les messages d'erreur suivants doivent être affichés :
|
|
| Le mot de passe doit contenir au moins 8 caractères |
|
|
| Le mot de passe doit contenir au moins 1 majuscule |
|
|
| Le mot de passe doit contenir au moins 1 chiffre |
|
|
|
|
Scénario: Mot de passe long mais sans majuscule ni chiffre
|
|
Étant donné l'utilisateur saisit le mot de passe "monmotdepasse"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et les messages d'erreur suivants doivent être affichés :
|
|
| Le mot de passe doit contenir au moins 1 majuscule |
|
|
| Le mot de passe doit contenir au moins 1 chiffre |
|
|
|
|
# ============================================================================
|
|
# VALIDATION TEMPS RÉEL (FRONTEND)
|
|
# ============================================================================
|
|
|
|
Scénario: Affichage progressif des critères pendant la saisie
|
|
Étant donné l'utilisateur commence à saisir son mot de passe
|
|
Quand l'utilisateur tape "m"
|
|
Alors les critères suivants doivent être affichés :
|
|
| critère | statut |
|
|
| longueur | ✗ |
|
|
| majuscule | ✗ |
|
|
| chiffre | ✗ |
|
|
Quand l'utilisateur tape "Mon"
|
|
Alors les critères doivent être mis à jour :
|
|
| critère | statut |
|
|
| longueur | ✗ |
|
|
| majuscule | ✓ |
|
|
| chiffre | ✗ |
|
|
Quand l'utilisateur tape "Monpass1"
|
|
Alors les critères doivent être mis à jour :
|
|
| critère | statut |
|
|
| longueur | ✓ |
|
|
| majuscule | ✓ |
|
|
| chiffre | ✓ |
|
|
|
|
Scénario: Feedback visuel temps réel
|
|
Étant donné l'utilisateur saisit progressivement son mot de passe
|
|
Quand un critère est validé
|
|
Alors une coche verte ✓ doit apparaître à côté du critère
|
|
Et le texte du critère doit passer en vert
|
|
Quand un critère n'est pas validé
|
|
Alors une croix rouge ✗ doit apparaître
|
|
Et le texte du critère doit rester en gris ou rouge
|
|
|
|
# ============================================================================
|
|
# VALIDATION BACKEND (SÉCURITÉ)
|
|
# ============================================================================
|
|
|
|
Scénario: Validation backend en plus du frontend
|
|
Étant donné l'utilisateur contourne la validation frontend
|
|
Et envoie directement le mot de passe "weak" via API
|
|
Quand le backend reçoit la requête
|
|
Alors la validation backend doit rejeter le mot de passe
|
|
Et retourner une erreur HTTP 400 Bad Request
|
|
Et le message doit être :
|
|
"""
|
|
{
|
|
"error": "invalid_password",
|
|
"details": [
|
|
"Le mot de passe doit contenir au moins 8 caractères",
|
|
"Le mot de passe doit contenir au moins 1 majuscule",
|
|
"Le mot de passe doit contenir au moins 1 chiffre"
|
|
]
|
|
}
|
|
"""
|
|
|
|
Scénario: Validation backend avec mot de passe valide
|
|
Étant donné l'utilisateur envoie le mot de passe "SecurePass123"
|
|
Quand le backend valide le mot de passe
|
|
Alors la validation backend doit réussir
|
|
Et le mot de passe doit être hashé avec bcrypt (coût 12)
|
|
Et le hash doit être stocké dans la base de données
|
|
|
|
# ============================================================================
|
|
# CAS LIMITES ET CARACTÈRES SPÉCIAUX
|
|
# ============================================================================
|
|
|
|
Scénario: Mot de passe avec caractères spéciaux (acceptés)
|
|
Étant donné l'utilisateur saisit le mot de passe "MonP@ss123!"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car les caractères spéciaux sont autorisés (mais non obligatoires)
|
|
|
|
Scénario: Mot de passe avec espaces (acceptés)
|
|
Étant donné l'utilisateur saisit le mot de passe "Mon Pass 123"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car les espaces sont autorisés
|
|
|
|
Scénario: Mot de passe avec accents (acceptés)
|
|
Étant donné l'utilisateur saisit le mot de passe "MônPàss123"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car les caractères accentués comptent comme des lettres
|
|
|
|
Scénario: Mot de passe avec émojis (acceptés)
|
|
Étant donné l'utilisateur saisit le mot de passe "MonPass123🔒"
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car les émojis sont autorisés
|
|
|
|
Scénario: Mot de passe vide
|
|
Étant donné l'utilisateur laisse le champ mot de passe vide
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit échouer
|
|
Et le message d'erreur doit être "Le mot de passe est requis"
|
|
|
|
# ============================================================================
|
|
# MODIFICATION MOT DE PASSE
|
|
# ============================================================================
|
|
|
|
Scénario: Changement de mot de passe avec validation
|
|
Étant donné un utilisateur authentifié veut changer son mot de passe
|
|
Et l'utilisateur saisit son ancien mot de passe "OldPass123"
|
|
Et l'utilisateur saisit le nouveau mot de passe "NewSecure456"
|
|
Quand le système valide le nouveau mot de passe
|
|
Alors la validation doit réussir
|
|
Et le nouveau mot de passe doit respecter les mêmes règles
|
|
Et l'ancien mot de passe doit être vérifié avant le changement
|
|
|
|
Scénario: Nouveau mot de passe identique à l'ancien (autorisé)
|
|
Étant donné un utilisateur veut changer son mot de passe
|
|
Et l'utilisateur saisit le nouveau mot de passe identique à l'ancien
|
|
Quand le système valide le mot de passe
|
|
Alors la validation doit réussir
|
|
Car il n'y a pas de règle interdisant la réutilisation
|
|
|
|
# ============================================================================
|
|
# MESSAGES D'AIDE ET UX
|
|
# ============================================================================
|
|
|
|
Scénario: Affichage des règles avant saisie
|
|
Étant donné l'utilisateur accède au formulaire d'inscription
|
|
Quand le champ mot de passe reçoit le focus
|
|
Alors une info-bulle doit s'afficher avec les règles :
|
|
"""
|
|
Votre mot de passe doit contenir :
|
|
• Au moins 8 caractères
|
|
• Au moins 1 majuscule
|
|
• Au moins 1 chiffre
|
|
"""
|
|
|
|
Scénario: Indicateur de force du mot de passe
|
|
Étant donné l'utilisateur saisit progressivement son mot de passe
|
|
Quand l'utilisateur tape "Weak1"
|
|
Alors l'indicateur de force doit afficher "Faible" en orange
|
|
Quand l'utilisateur tape "Medium12"
|
|
Alors l'indicateur de force doit afficher "Moyen" en jaune
|
|
Quand l'utilisateur tape "VeryStrong123!"
|
|
Alors l'indicateur de force doit afficher "Fort" en vert
|