# 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
