US et TS en Format BDD/Gherkin

Epic 0 - Environnement Technique et Infrastructure

TS-100 : Configuration initiale du projet Spring Boot

Feature: Initialisation du projet Spring Boot backend
  En tant qu'équipe technique
  Nous devons configurer le projet Spring Boot avec tous les modules nécessaires
  Afin de garantir une architecture hexagonale et testable

  Scenario: Création du projet avec Spring Initializr
    Given nous utilisons Spring Boot 3.2.x avec Java 17
    When le projet est initialisé avec les dépendances suivantes :
      | Dépendance            |
      | Spring Web            |
      | Spring Data JPA       |
      | Spring Security       |
      | Spring Boot Actuator  |
      | PostgreSQL Driver     |
      | Flyway                |
      | Lombok                |
      | Spring Boot Test      |
    Then le fichier pom.xml contient toutes les dépendances
    And la structure de packages suit l'architecture hexagonale :
      | Package                    |
      | com.agile.domain           |
      | com.agile.application      |
      | com.agile.infrastructure   |
      | com.agile.adapters.rest    |
      | com.agile.adapters.persistence |

  Scenario: Configuration des profils application.yml
    Given le fichier application.yml est créé
    When je définis les profils "dev", "test" et "prod"
    Then chaque profil contient les configurations spécifiques :
      | Profil | Database URL                     | Log Level |
      | dev    | jdbc:postgresql://localhost:5432/agile_dev | DEBUG     |
      | test   | jdbc:h2:mem:testdb               | INFO      |
      | prod   | jdbc:postgresql://db:5432/agile_prod | WARN      |

TS-101 : Configuration Angular 17 avec NGXS

Feature: Initialisation du projet Angular frontend
  En tant qu'équipe technique
  Nous devons configurer Angular 17 avec NGXS et Angular Material
  Afin de garantir une architecture scalable et maintenable

  Scenario: Création du projet Angular avec Angular CLI
    Given Angular CLI 17 est installé
    When je crée le projet avec "ng new agile-app --routing --style=scss"
    And j'installe NGXS : "npm install @ngxs/store @ngxs/devtools-plugin"
    And j'installe Angular Material : "ng add @angular/material"
    Then la structure de fichiers suit les bonnes pratiques Angular :
      | Répertoire         |
      | src/app/core       |
      | src/app/shared     |
      | src/app/features   |
      | src/app/store      |
    And les modules de base sont configurés (AppModule, CoreModule, SharedModule)

  Scenario: Configuration NGXS Store
    Given le projet Angular est créé
    When je configure le store NGXS dans app.config.ts
    And je crée les états suivants :
      | État             |
      | AuthState        |
      | BacklogState     |
      | SprintState      |
    Then le store est fonctionnel
    And les actions et sélecteurs sont typés avec TypeScript

TS-102 : Configuration Docker Compose pour environnement local

Feature: Environnement Dockerisé local
  En tant qu'équipe DevOps
  Nous devons configurer Docker Compose pour le développement local
  Afin de standardiser l'environnement entre développeurs

  Scenario: Création du fichier docker-compose.yml
    Given le fichier docker-compose.yml est créé à la racine du projet
    When je définis les services suivants :
      | Service    | Image              | Ports       |
      | backend    | agile-backend:dev  | 8080:8080   |
      | frontend   | agile-frontend:dev | 4200:4200   |
      | database   | postgres:15        | 5432:5432   |
    And j'ajoute les variables d'environnement via .env :
      | Variable              | Valeur              |
      | POSTGRES_USER         | agile_user          |
      | POSTGRES_PASSWORD     | agile_password      |
      | POSTGRES_DB           | agile_db            |
    Then la commande "docker-compose up" démarre tous les services
    And les services backend, frontend et database sont accessibles

  Scenario: Configuration des volumes persistants
    Given Docker Compose est configuré
    When je définis les volumes suivants :
      | Volume           | Mapping                          |
      | postgres-data    | ./data/postgres:/var/lib/postgresql/data |
      | backend-logs     | ./logs:/app/logs                 |
    Then les données PostgreSQL persistent entre redémarrages
    And les logs backend sont accessibles localement

TS-103 : Migrations initiales Flyway

Feature: Migrations Flyway initiales
  En tant qu'équipe DevOps
  Nous devons créer les scripts de migration Flyway
  Afin d'initialiser le schéma de base de données

  Scenario: Création du script V1__init_schema.sql
    Given le répertoire src/main/resources/db/migration existe
    When je crée le fichier V1__init_schema.sql avec les tables :
      | Table           | Description                     |
      | users           | Utilisateurs et authentification|
      | products        | Produits agiles                 |
      | backlog_items   | Epics, Features, Stories        |
      | sprints         | Sprints et releases             |
      | tasks           | Tâches liées aux stories        |
    Then Flyway exécute le script au démarrage de l'application
    And toutes les tables sont créées dans PostgreSQL

  Scenario: Ajout de données de référence avec V2__seed_data.sql
    Given le script V1 a été exécuté
    When je crée V2__seed_data.sql avec :
      | Données                           |
      | Rôles par défaut (Admin, PO, SM, Dev) |
      | Utilisateur admin initial         |
      | Statuts par défaut (To Do, In Progress, Done) |
    Then les données de référence sont insérées
    And l'application est fonctionnelle dès le premier démarrage

TS-104 : Configuration GitLab CI/CD Pipeline

Feature: Pipeline CI/CD GitLab complet
  En tant qu'équipe DevOps
  Nous devons configurer un pipeline automatisé
  Afin d'automatiser build, tests et déploiements

  Scenario: Création du fichier .gitlab-ci.yml
    Given le fichier .gitlab-ci.yml est créé à la racine
    When je définis les stages suivants :
      | Stage    | Jobs                           |
      | build    | build:backend, build:frontend  |
      | test     | test:unit, test:integration    |
      | security | security:scan                  |
      | deploy   | deploy:staging, deploy:prod    |
    Then chaque stage s'exécute séquentiellement
    And les artifacts (JARs, bundles) sont sauvegardés entre stages

  Scenario: Déploiement automatique vers staging
    Given la branche "develop" est poussée
    When le pipeline atteint le stage "deploy:staging"
    Then le backend et frontend sont déployés automatiquement sur staging
    And les tests smoke (health checks) sont exécutés après déploiement
    And une notification Slack confirme le succès du déploiement

TS-105 : Configuration Prometheus et Grafana

Feature: Monitoring avec Prometheus et Grafana
  En tant qu'équipe DevOps
  Nous devons configurer Prometheus et Grafana
  Afin de superviser l'état de santé et les performances de l'application

  Scenario: Configuration Prometheus pour collecter les métriques
    Given Prometheus est déployé via Docker Compose
    When je configure le fichier prometheus.yml avec :
      | Target                        | Endpoint                 |
      | backend-actuator              | http://backend:8080/actuator/prometheus |
    Then Prometheus collecte les métriques toutes les 15 secondes
    And les métriques JVM, HTTP, et custom sont disponibles

  Scenario: Création de dashboards Grafana
    Given Grafana est connecté à Prometheus comme source de données
    When je crée un dashboard "Application Health" avec :
      | Panel                  | Métrique                     |
      | CPU Usage              | process_cpu_usage            |
      | Mémoire JVM            | jvm_memory_used_bytes        |
      | Taux d'erreur HTTP     | http_server_requests_seconds (status=5xx) |
      | Nombre requêtes/sec    | http_server_requests_seconds_count |
    Then le dashboard affiche les métriques en temps réel
    And des alertes Slack sont configurées pour CPU > 80%

Epic 1 - Administration et Sécurité

US-001 : Création de compte utilisateur avec attribution de rôles

Feature: Gestion des comptes utilisateurs
  En tant qu'administrateur
  Je veux créer un compte utilisateur avec attribution de rôles
  Afin de donner accès à l'application de manière contrôlée

  Background:
    Given je suis connecté en tant qu'administrateur
    And je suis sur la page de gestion des utilisateurs

  Scenario: Création réussie d'un utilisateur avec rôle unique
    Given aucun utilisateur avec l'email "alice@example.com" n'existe
    When je clique sur le bouton "Créer un utilisateur"
    And je remplis le formulaire avec les informations suivantes:
      | Champ          | Valeur            |
      | Prénom         | Alice             |
      | Nom            | Dupont            |
      | Email          | alice@example.com |
      | Rôle           | Developer         |
    And je clique sur "Enregistrer"
    Then un message de succès "Utilisateur créé avec succès" s'affiche
    And l'utilisateur "Alice Dupont" apparaît dans la liste
    And un email d'activation est envoyé à "alice@example.com"

  Scenario: Tentative de création avec email déjà existant
    Given un utilisateur avec l'email "bob@example.com" existe déjà
    When je tente de créer un nouvel utilisateur avec l'email "bob@example.com"
    Then un message d'erreur "Cet email est déjà utilisé" s'affiche
    And le formulaire reste ouvert pour correction

  Scenario: Création d'utilisateur avec plusieurs rôles
    When je crée un utilisateur avec les rôles suivants:
      | Rôle           |
      | Product Owner  |
      | Scrum Master   |
    Then l'utilisateur doit avoir les deux rôles assignés
    And les permissions cumulées des deux rôles sont appliquées

US-002 : Modification des informations et rôles utilisateur

Feature: Modification des utilisateurs existants
  En tant qu'administrateur
  Je veux modifier les informations et rôles d'un utilisateur existant
  Afin de maintenir les données à jour

  Background:
    Given je suis connecté en tant qu'administrateur
    And les utilisateurs suivants existent:
      | Nom       | Email              | Rôle      | Statut |
      | Bob Smith | bob@example.com    | Developer | Actif  |

  Scenario: Modification réussie du rôle d'un utilisateur
    Given je consulte le profil de l'utilisateur "Bob Smith"
    When je change le rôle de "Developer" à "Scrum Master"
    And je sauvegarde les modifications
    Then un message de confirmation "Utilisateur modifié avec succès" s'affiche
    And le rôle de "Bob Smith" est "Scrum Master"
    And l'utilisateur reçoit une notification de changement de rôle

  Scenario: Modification des informations personnelles
    Given je consulte le profil de l'utilisateur "Bob Smith"
    When je modifie les informations suivantes:
      | Champ    | Nouvelle valeur      |
      | Email    | bob.smith@example.com|
      | Téléphone| +33 6 12 34 56 78   |
    And je sauvegarde les modifications
    Then les nouvelles informations sont enregistrées
    And un email de confirmation est envoyé à la nouvelle adresse

US-003 : Désactivation temporaire d'un compte utilisateur

Feature: Désactivation temporaire de comptes
  En tant qu'administrateur
  Je veux désactiver temporairement un compte utilisateur sans le supprimer
  Afin de gérer les départs temporaires (congés, arrêts maladie)

  Background:
    Given je suis connecté en tant qu'administrateur
    And l'utilisateur "Charlie Martin" a le statut "Actif"

  Scenario: Désactivation réussie d'un compte actif
    Given je suis sur le profil de l'utilisateur "Charlie Martin"
    When je clique sur "Désactiver le compte"
    And je confirme l'action dans la modal de confirmation
    Then le statut de l'utilisateur devient "Inactif"
    And l'utilisateur ne peut plus se connecter
    And les tâches assignées restent visibles mais marquées comme "En attente de réassignation"

  Scenario: Réactivation d'un compte désactivé
    Given l'utilisateur "Charlie Martin" a le statut "Inactif"
    When je clique sur "Réactiver le compte"
    Then le statut de l'utilisateur devient "Actif"
    And l'utilisateur peut à nouveau se connecter
    And un email de réactivation lui est envoyé

US-004 : Mise à jour du profil utilisateur

Feature: Gestion du profil utilisateur
  En tant qu'utilisateur
  Je veux mettre à jour mon profil (nom, email, avatar, préférences)
  Afin de personnaliser mon expérience

  Background:
    Given je suis connecté en tant que "David Laurent"
    And je suis sur la page "Mon profil"

  Scenario: Modification de l'avatar
    When je clique sur "Modifier l'avatar"
    And je télécharge une image au format "JPG" de taille "2 MB"
    And je sauvegarde les modifications
    Then mon nouvel avatar s'affiche sur mon profil
    And mon avatar est visible dans toute l'application

  Scenario: Modification des préférences de notification
    When je désactive les notifications email pour "Assignation de tâche"
    And j'active les notifications in-app pour "Mention dans commentaire"
    And je sauvegarde mes préférences
    Then mes nouvelles préférences sont appliquées immédiatement
    And je ne reçois plus d'emails pour les assignations de tâche

US-005 : Connexion utilisateur standard et OAuth2

Feature: Authentification multi-canaux
  En tant qu'utilisateur
  Je veux me connecter avec email/mot de passe ou via OAuth2 (Google, GitHub, GitLab)
  Afin d'accéder à l'application de manière sécurisée et flexible

  Background:
    Given l'application supporte JWT et OAuth2
    And la page de connexion affiche les options d'authentification

  Scenario: Connexion réussie avec email et mot de passe
    Given je suis sur la page de connexion
    When je saisis "alice@example.com" dans le champ email
    And je saisis "SecurePass123!" dans le champ mot de passe
    And je clique sur "Se connecter"
    Then je suis redirigé vers le dashboard principal
    And un token JWT est généré et stocké en local storage
    And mon profil utilisateur est chargé

  Scenario: Connexion avec OAuth2 Google
    Given je suis sur la page de connexion
    When je clique sur "Se connecter avec Google"
    And je m'authentifie avec mon compte Google "alice@gmail.com"
    And j'autorise l'application à accéder à mon profil
    Then je suis redirigé vers le dashboard
    And mon compte est créé automatiquement si inexistant
    And mes informations Google (nom, email, avatar) sont importées

  Scenario: Connexion avec OAuth2 GitHub
    Given je suis sur la page de connexion
    When je clique sur "Se connecter avec GitHub"
    And je m'authentifie avec mon compte GitHub
    Then un token OAuth GitHub est échangé contre un JWT applicatif
    And je suis connecté avec les droits Developer par défaut

  Scenario: Échec de connexion avec mot de passe incorrect
    Given je suis sur la page de connexion
    When je saisis "alice@example.com" et un mot de passe incorrect
    And je clique sur "Se connecter"
    Then un message d'erreur "Email ou mot de passe incorrect" s'affiche
    And aucun token n'est généré
    And je reste sur la page de connexion

US-006 : Réinitialisation de mot de passe

Feature: Réinitialisation sécurisée de mot de passe
  En tant qu'utilisateur
  Je veux réinitialiser mon mot de passe par email
  Afin de récupérer l'accès à mon compte en cas d'oubli

  Scenario: Demande de réinitialisation réussie
    Given je suis sur la page de connexion
    When je clique sur "Mot de passe oublié ?"
    And je saisis mon email "bob@example.com"
    And je clique sur "Envoyer le lien de réinitialisation"
    Then un message "Email envoyé, vérifiez votre boîte de réception" s'affiche
    And je reçois un email avec un lien sécurisé valide 24h
    And le lien contient un token unique à usage unique

  Scenario: Création du nouveau mot de passe
    Given j'ai reçu un email de réinitialisation
    And je clique sur le lien dans l'email
    When je saisis mon nouveau mot de passe "NewSecurePass456!"
    And je confirme le mot de passe "NewSecurePass456!"
    And je clique sur "Réinitialiser"
    Then un message "Mot de passe réinitialisé avec succès" s'affiche
    And je peux me connecter avec mon nouveau mot de passe
    And l'ancien lien de réinitialisation est invalidé

US-007 : Déconnexion et invalidation de session

Feature: Déconnexion sécurisée
  En tant qu'utilisateur
  Je veux me déconnecter de l'application
  Afin de sécuriser mon compte lorsque je quitte

  Scenario: Déconnexion manuelle
    Given je suis connecté à l'application
    When je clique sur "Se déconnecter"
    Then mon token JWT est supprimé du local storage
    And mon Refresh Token est invalidé côté serveur
    And je suis redirigé vers la page de connexion

  Scenario: Expiration automatique de session après inactivité
    Given je suis connecté depuis 30 minutes
    And je n'ai effectué aucune action depuis 15 minutes
    When le délai d'inactivité est dépassé (configurable)
    Then ma session expire automatiquement
    And je reçois une notification "Session expirée, veuillez vous reconnecter"
    And je suis redirigé vers la page de connexion

US-008: Gestion Multi-Factor Authentication (MFA)

Feature: Authentification multi-facteur (MFA)
  En tant qu'administrateur ou utilisateur
  Je veux activer l'authentification à deux facteurs
  Afin de renforcer la sécurité de mon compte

  Scenario: Activation de MFA via TOTP (Google Authenticator)
    Given je suis connecté à mon compte
    And je suis sur la page "Sécurité"
    When je clique sur "Activer l'authentification à deux facteurs"
    Then un QR Code est généré
    And je scanne le QR Code avec Google Authenticator
    And je saisis le code OTP à 6 chiffres
    And je clique sur "Valider"
    Then MFA est activé sur mon compte
    And des codes de secours sont générés et affichés

  Scenario: Connexion avec MFA activé
    Given MFA est activé sur mon compte
    When je me connecte avec email et mot de passe
    Then une page "Code de vérification" s'affiche
    When je saisis le code OTP généré par mon application
    And je clique sur "Valider"
    Then je suis connecté avec succès

TS-001 : Implémentation de l'authentification JWT

Feature: Authentification JWT avec tokens
  En tant qu'équipe technique
  Nous devons implémenter l'authentification JWT avec access et refresh tokens
  Afin de sécuriser l'API

  Scenario: Génération de tokens JWT lors de la connexion
    Given l'utilisateur est authentifié avec succès
    When le système génère les tokens
    Then un access token avec expiration de 30 minutes est créé
    And un refresh token avec expiration de 7 jours est créé
    And les tokens sont signés avec l'algorithme HS256
    And le payload contient userId, roles, et permissions

  Scenario: Rafraîchissement du token expiré
    Given l'access token est expiré
    And le refresh token est toujours valide
    When le client envoie une requête avec le refresh token
    Then un nouvel access token est généré
    And le refresh token est renouvelé (rotation)
    And l'ancien refresh token est invalidé

  Scenario: Validation du token sur une requête API
    Given une requête GET vers "/api/projects" est envoyée
    And le header "Authorization: Bearer <token>" est présent
    When le système valide le token
    Then la signature est vérifiée
    And l'expiration est contrôlée
    And les permissions sont extraites du payload
    And la requête est autorisée ou refusée selon les permissions

TS-002 : Configuration Spring Security avec RBAC

Feature: Gestion des autorisations RBAC
  En tant qu'équipe technique
  Nous devons configurer Spring Security avec RBAC
  Afin de gérer les autorisations par rôle et ressource

  Scenario: Configuration des rôles et permissions
    Given les rôles suivants sont définis:
      | Rôle          | Permissions                                    |
      | Admin         | MANAGE_USERS, MANAGE_PRODUCTS, VIEW_AUDIT_LOGS |
      | Product Owner | MANAGE_BACKLOG, VIEW_REPORTS                   |
      | Developer     | VIEW_BACKLOG, UPDATE_TASKS                     |
    When un utilisateur avec le rôle "Developer" tente d'accéder à "/api/users"
    Then l'accès est refusé avec le code HTTP 403
    And un message "Accès interdit" est retourné

  Scenario: Validation des permissions au runtime
    Given un utilisateur a le rôle "Product Owner"
    And il tente de supprimer un backlog item
    When le système vérifie les permissions
    Then la permission "MANAGE_BACKLOG" est requise
    And l'utilisateur possède cette permission
    And l'action est autorisée

TS-003 : Migrations Flyway pour versionnement DB

Feature: Versionnement du schéma de base de données
  En tant qu'équipe technique
  Nous devons implémenter les migrations Flyway
  Afin de versionner le schéma de base de données

  Scenario: Exécution de migration initiale au démarrage
    Given l'application démarre pour la première fois
    And aucune table n'existe en base
    When Flyway exécute les scripts de migration
    Then les migrations sont exécutées dans l'ordre (V1, V2, V3...)
    And la table "flyway_schema_history" est créée
    And toutes les tables métier sont créées
    And les données de référence sont insérées

  Scenario: Application d'une nouvelle migration en production
    Given l'application est en version V1.5
    And une nouvelle migration V1.6 est déployée
    When l'application redémarre
    Then Flyway détecte la nouvelle migration
    And exécute uniquement le script V1.6
    And l'historique est mis à jour
    And aucune régression n'est observée

TS-004 : Chiffrement des données sensibles

Feature: Chiffrement des données sensibles en base
  En tant qu'équipe technique
  Nous devons configurer le chiffrement des données sensibles
  Afin de protéger les mots de passe et tokens

  Scenario: Hachage des mots de passe avec BCrypt
    Given un utilisateur crée un compte avec le mot de passe "MyPassword123!"
    When le système enregistre le mot de passe
    Then le mot de passe est haché avec BCrypt (cost factor 12)
    And le hash est stocké dans la colonne "password_hash"
    And le mot de passe en clair n'est jamais stocké
    And le hash ne peut pas être déchiffré

  Scenario: Chiffrement des refresh tokens en base
    Given un refresh token est généré pour un utilisateur
    When le token est enregistré en base
    Then le token est chiffré avec AES-256
    And seul le système peut déchiffrer le token
    And le token chiffré est stocké dans la table "user_tokens"

Epic 2 - Gestion Produit et Équipe

US-010 : Création d'un nouveau produit agile

Feature: Création de produits agiles
  En tant que Product Owner
  Je veux créer un nouveau produit agile avec nom, description et vision
  Afin d'initialiser le projet

  Background:
    Given je suis connecté en tant que Product Owner
    And je suis sur la page "Mes produits"

  Scenario: Création réussie d'un produit
    When je clique sur "Créer un produit"
    And je remplis le formulaire avec:
      | Champ       | Valeur                                      |
      | Nom         | Application Mobile Banking                  |
      | Description | Application bancaire pour clients particuliers |
      | Vision      | Devenir la banque mobile préférée en France |
      | Date début  | 01/11/2025                                  |
    And je clique sur "Créer"
    Then un message "Produit créé avec succès" s'affiche
    And le produit "Application Mobile Banking" apparaît dans ma liste
    And je suis automatiquement assigné comme Product Owner du produit
    And un backlog vide est créé pour ce produit

  Scenario: Tentative de création avec nom déjà existant
    Given un produit nommé "CRM Enterprise" existe déjà
    When je tente de créer un produit avec le nom "CRM Enterprise"
    Then un message d'erreur "Ce nom de produit existe déjà" s'affiche
    And le formulaire reste ouvert pour correction

US-011 : Constitution d'une équipe avec rôles

Feature: Constitution et gestion d'équipe
  En tant que Product Owner
  Je veux constituer une équipe en assignant des membres avec leurs rôles
  Afin de structurer l'organisation du projet

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And je suis sur la page "Équipe" du produit
    And les utilisateurs suivants sont disponibles:
      | Nom           | Email                |
      | Sophie Martin | sophie@example.com   |
      | Marc Dubois   | marc@example.com     |
      | Julie Petit   | julie@example.com    |

  Scenario: Ajout de membres avec rôles multiples
    When je clique sur "Ajouter un membre"
    And je sélectionne "Sophie Martin"
    And j'assigne le rôle "Scrum Master"
    And je clique sur "Ajouter"
    Then "Sophie Martin" apparaît dans la liste de l'équipe
    And son rôle "Scrum Master" est affiché
    And elle reçoit une notification d'ajout à l'équipe

  Scenario: Constitution complète d'une équipe
    When j'ajoute les membres suivants:
      | Nom           | Rôle        |
      | Sophie Martin | Scrum Master|
      | Marc Dubois   | Developer   |
      | Julie Petit   | Developer   |
    Then l'équipe contient 4 membres (incluant le PO)
    And tous les membres ont accès au produit
    And le dashboard d'équipe affiche la composition complète

US-012 : Modification de la composition de l'équipe

Feature: Modification de la composition d'équipe
  En tant que Scrum Master
  Je veux modifier la composition de l'équipe (ajouter/retirer membres)
  Afin de m'adapter aux évolutions du projet

  Background:
    Given je suis Scrum Master du produit "Application Mobile Banking"
    And l'équipe actuelle contient:
      | Nom           | Rôle      |
      | Marc Dubois   | Developer |
      | Julie Petit   | Developer |

  Scenario: Retrait d'un membre de l'équipe
    Given "Marc Dubois" a 3 tâches assignées
    When je clique sur "Retirer de l'équipe" pour "Marc Dubois"
    And une modal me propose de réassigner ses tâches
    And je réassigne les tâches à "Julie Petit"
    And je confirme le retrait
    Then "Marc Dubois" n'apparaît plus dans l'équipe
    And ses tâches sont maintenant assignées à "Julie Petit"
    And il ne peut plus accéder au produit
    And il reçoit une notification de retrait

  Scenario: Changement de rôle d'un membre
    Given "Julie Petit" a le rôle "Developer"
    When je change son rôle en "Scrum Master"
    And je sauvegarde la modification
    Then le rôle de "Julie Petit" est mis à jour
    And ses permissions changent en conséquence
    And elle reçoit une notification du changement de rôle

US-013 : Consultation de la liste des produits affectés

Feature: Navigation entre les produits
  En tant que membre d'équipe
  Je veux consulter la liste des produits auxquels je suis affecté
  Afin de naviguer rapidement entre mes projets

  Background:
    Given je suis connecté en tant que "Marc Dubois"
    And je suis membre des produits suivants:
      | Produit                  | Mon rôle  |
      | Application Mobile Banking| Developer |
      | CRM Enterprise           | Developer |
      | Site E-commerce          | Scrum Master |

  Scenario: Affichage de la liste des produits
    Given je suis sur le dashboard principal
    Then je vois la liste de mes 3 produits
    And chaque produit affiche:
      | Informations affichées |
      | Nom du produit         |
      | Mon rôle               |
      | Nombre de tâches actives|
      | Dernier sprint actif   |

  Scenario: Navigation vers un produit spécifique
    When je clique sur "Application Mobile Banking"
    Then je suis redirigé vers le dashboard du produit
    And je vois le backlog et les sprints du produit
    And les actions disponibles correspondent à mon rôle "Developer"

US-014 : Archivage d'un produit terminé

Feature: Archivage de produits
  En tant que Product Owner
  Je veux archiver un produit terminé sans le supprimer
  Afin de maintenir l'historique tout en désencombrant l'interface

  Background:
    Given je suis Product Owner du produit "Site E-commerce V1"
    And le produit a le statut "Actif"
    And tous les sprints sont terminés

  Scenario: Archivage réussi d'un produit terminé
    Given je suis sur la page du produit "Site E-commerce V1"
    When je clique sur "Archiver le produit"
    And je confirme l'action dans la modal
    And je saisis une raison "Projet terminé et mis en production"
    Then le produit passe au statut "Archivé"
    And il n'apparaît plus dans ma liste de produits actifs
    And je peux le retrouver dans "Produits archivés"
    And toutes les données restent accessibles en lecture seule

  Scenario: Désarchivage d'un produit
    Given le produit "Site E-commerce V1" est archivé
    When je vais dans "Produits archivés"
    And je clique sur "Désarchiver" pour ce produit
    Then le produit redevient actif
    And il réapparaît dans ma liste de produits actifs
    And l'équipe peut à nouveau y travailler

Epic 3 - Gestion du Backlog

US-020 : Création d'un Epic avec objectif business

Feature: Gestion des Epics
  En tant que Product Owner
  Je veux créer un Epic avec objectif business, priorité et description
  Afin de structurer la vision long terme du produit

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And je suis sur la page "Backlog"

  Scenario: Création réussie d'un Epic
    When je clique sur "Créer un Epic"
    And je remplis le formulaire avec:
      | Champ              | Valeur                                     |
      | Titre              | Gestion des comptes bancaires              |
      | Objectif business  | Permettre la consultation et gestion des comptes |
      | Priorité           | Haute                                      |
      | Valeur business    | 100                                        |
      | Date cible         | Q2 2026                                    |
    And je clique sur "Créer"
    Then l'Epic "Gestion des comptes bancaires" est créé
    And il apparaît en haut du backlog (priorité haute)
    And je peux maintenant y rattacher des Features

  Scenario: Ajout d'un critère de succès à l'Epic
    Given l'Epic "Gestion des comptes bancaires" existe
    When j'ajoute les critères de succès suivants:
      | Critère                                      |
      | 80% des clients utilisent la fonctionnalité  |
      | Temps de chargement < 2 secondes             |
      | Taux de satisfaction > 4/5                   |
    Then les critères sont enregistrés
    And ils sont visibles sur la page de l'Epic

US-021 : Création de Features rattachées à un Epic

Feature: Gestion des Features
  En tant que Product Owner
  Je veux créer des Features rattachées à un Epic
  Afin d'organiser le périmètre fonctionnel

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And l'Epic "Gestion des comptes bancaires" existe
    And je suis sur la page de cet Epic

  Scenario: Création d'une Feature rattachée à un Epic
    When je clique sur "Ajouter une Feature"
    And je remplis le formulaire avec:
      | Champ             | Valeur                                    |
      | Titre             | Consultation du solde                     |
      | Description       | L'utilisateur peut voir son solde en temps réel |
      | Valeur business   | 80                                        |
      | Effort estimé     | 21 points                                 |
    And je clique sur "Créer"
    Then la Feature "Consultation du solde" est créée
    And elle est rattachée à l'Epic "Gestion des comptes bancaires"
    And elle apparaît dans la liste des Features de l'Epic

  Scenario: Déplacement d'une Feature vers un autre Epic
    Given la Feature "Consultation du solde" est rattachée à l'Epic "Gestion des comptes"
    And l'Epic "Opérations bancaires" existe
    When je fais glisser la Feature vers l'Epic "Opérations bancaires"
    Then la Feature change de parent
    And elle apparaît sous le nouvel Epic
    And l'historique enregistre le changement

US-022 : Création de User Stories au format standard

Feature: Gestion des User Stories
  En tant que Product Owner
  Je veux créer des User Stories au format "En tant que... je veux... afin de..."
  Afin d'exprimer les besoins utilisateurs de manière claire

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And la Feature "Consultation du solde" existe
    And je suis sur la page de cette Feature

  Scenario: Création d'une User Story avec format standard
    When je clique sur "Créer une User Story"
    And je remplis le formulaire structuré:
      | Champ      | Valeur                                           |
      | En tant que| client de la banque                              |
      | Je veux    | consulter le solde de mon compte courant         |
      | Afin de    | connaître ma situation financière en temps réel  |
      | Priorité   | Haute                                            |
    And j'ajoute les critères d'acceptation suivants:
      | Critère                                                    |
      | Le solde est affiché en euros avec 2 décimales             |
      | Le solde se met à jour automatiquement toutes les 30 sec   |
      | Un indicateur visuel indique si le compte est débiteur     |
    And je clique sur "Créer"
    Then la User Story "Consulter le solde de mon compte courant" est créée
    And elle est rattachée à la Feature "Consultation du solde"
    And le format standard est respecté

  Scenario: Validation automatique du format de User Story
    When je crée une User Story sans remplir le champ "Afin de"
    And je tente de sauvegarder
    Then un message d'erreur "Le champ 'Afin de' est obligatoire" s'affiche
    And la User Story n'est pas créée
    And le formulaire reste ouvert pour correction

US-023 : Création de Technical Stories

Feature: Gestion des Technical Stories
  En tant que développeur
  Je veux créer des Technical Stories
  Afin de documenter les besoins techniques non visibles par l'utilisateur

  Background:
    Given je suis Developer dans le produit "Application Mobile Banking"
    And je suis sur la page "Backlog"

  Scenario: Création d'une Technical Story
    When je clique sur "Créer une Technical Story"
    And je remplis le formulaire avec:
      | Champ                  | Valeur                                         |
      | Titre                  | Migration base de données vers PostgreSQL 15   |
      | Description technique  | Migrer de PostgreSQL 13 vers 15 pour améliorer les performances |
      | Impact architecture    | Base de données, couche persistance            |
      | Complexité             | Élevée                                         |
      | Points story           | 13                                             |
    And j'ajoute les critères techniques:
      | Critère                                               |
      | Compatibilité backward assurée                        |
      | Scripts de migration testés sur environnement staging |
      | Rollback documenté                                    |
    And je clique sur "Créer"
    Then la Technical Story est créée
    And elle est identifiée visuellement comme "Technical" dans le backlog
    And elle peut être planifiée dans un sprint

  Scenario: Liaison d'une Technical Story à une User Story
    Given la User Story "Consulter le solde" existe
    And la Technical Story "Optimisation requêtes SQL" existe
    When j'ouvre la Technical Story "Optimisation requêtes SQL"
    And je lie cette story à "Consulter le solde"
    Then la liaison est créée
    And les deux stories affichent le lien dans leur détail

US-024 : Définition des critères d'acceptation

Feature: Critères d'acceptation des stories
  En tant que membre d'équipe
  Je veux définir des critères d'acceptation pour chaque User Story
  Afin de clarifier la Definition of Done

  Background:
    Given la User Story "Consulter l'historique des transactions" existe
    And je suis sur la page de détail de cette story

  Scenario: Ajout de critères d'acceptation
    When je clique sur "Ajouter un critère d'acceptation"
    And je saisis les critères suivants:
      | Critère                                                      |
      | L'historique affiche les 50 dernières transactions          |
      | Chaque transaction indique: date, montant, libellé, catégorie|
      | L'utilisateur peut filtrer par date (début et fin)           |
      | Les transactions sont paginées (20 par page)                 |
    And je sauvegarde
    Then les 4 critères sont enregistrés
    And ils apparaissent dans la section "Critères d'acceptation"
    And ils servent de checklist lors de la review

  Scenario: Validation des critères lors de la review
    Given la User Story "Consulter l'historique des transactions" a 4 critères
    And la story est en status "En review"
    When le Product Owner teste la fonctionnalité
    And il coche les critères un par un:
      | Critère                                         | Validé |
      | L'historique affiche les 50 dernières transactions | Oui    |
      | Chaque transaction indique les bonnes informations | Oui    |
      | Filtrage par date fonctionne                     | Oui    |
      | Pagination fonctionne correctement               | Oui    |
    Then tous les critères sont validés
    And la story peut être marquée "Done"

US-025 : Priorisation des éléments du backlog par drag \& drop

Feature: Priorisation du backlog
  En tant que Product Owner
  Je veux prioriser les éléments du backlog par drag & drop
  Afin de refléter la valeur business

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And je suis sur la page "Backlog"
    And le backlog contient les User Stories suivantes (par ordre):
      | Position | Titre                              | Priorité actuelle |
      | 1        | Consulter le solde                 | Haute             |
      | 2        | Effectuer un virement              | Moyenne           |
      | 3        | Consulter l'historique             | Haute             |

  Scenario: Réorganisation par drag & drop
    When je fais glisser "Consulter l'historique" de la position 3 vers la position 1
    Then l'ordre du backlog devient:
      | Position | Titre                              |
      | 1        | Consulter l'historique             |
      | 2        | Consulter le solde                 |
      | 3        | Effectuer un virement              |
    And les priorités sont recalculées automatiquement
    And un message "Backlog mis à jour" s'affiche brièvement
    And les changements sont enregistrés immédiatement

  Scenario: Déplacement d'une story vers un sprint
    Given le Sprint 5 est en cours
    When je fais glisser "Effectuer un virement" depuis le backlog
    And je la dépose dans la zone "Sprint 5"
    Then la story est ajoutée au Sprint 5
    And elle disparaît du product backlog
    And les points du sprint sont recalculés automatiquement

US-026 : Visualisation du backlog en multiples vues

Feature: Vues multiples du backlog
  En tant que Product Owner
  Je veux visualiser le backlog en vue liste, Kanban et calendrier
  Afin de m'adapter au contexte et aux besoins

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And je suis sur la page "Backlog"

  Scenario: Basculement en vue Liste
    Given je suis en vue "Kanban"
    When je clique sur l'icône "Vue Liste"
    Then le backlog s'affiche sous forme de tableau avec colonnes:
      | Colonnes affichées   |
      | Titre                |
      | Type (Epic/Feature/US/TS) |
      | Priorité             |
      | Points               |
      | Assigné à            |
      | Statut               |
    And je peux trier par chaque colonne
    And je peux filtrer par type, priorité, statut

  Scenario: Basculement en vue Kanban
    Given je suis en vue "Liste"
    When je clique sur l'icône "Vue Kanban"
    Then le backlog s'affiche en colonnes:
      | Colonnes      |
      | To Do         |
      | In Progress   |
      | Review        |
      | Done          |
    And chaque carte affiche: titre, type, points, assigné
    And je peux déplacer les cartes par drag & drop

  Scenario: Basculement en vue Calendrier
    Given je suis en vue "Liste"
    When je clique sur l'icône "Vue Calendrier"
    Then le backlog s'affiche dans un calendrier mensuel
    And les stories avec date cible apparaissent aux dates correspondantes
    And je peux déplacer une story en la faisant glisser vers une autre date

US-027 : Ajout de commentaires et pièces jointes

Feature: Collaboration sur les stories
  En tant que membre d'équipe
  Je veux ajouter des commentaires et pièces jointes sur les stories
  Afin d'enrichir la documentation et faciliter la collaboration

  Background:
    Given la User Story "Effectuer un virement" existe
    And je suis sur la page de détail de cette story

  Scenario: Ajout d'un commentaire
    When je clique dans la zone "Ajouter un commentaire"
    And je saisis "Attention: bien vérifier le RIB avant validation"
    And je clique sur "Publier"
    Then mon commentaire apparaît dans le fil de discussion
    And il affiche: mon nom, ma photo, date et heure
    And tous les membres de l'équipe sont notifiés

  Scenario: Mention d'un membre dans un commentaire
    When je saisis le commentaire "@Sophie peux-tu clarifier le besoin sur les virements internationaux ?"
    And je clique sur "Publier"
    Then Sophie reçoit une notification spécifique de mention
    And le commentaire affiche "@Sophie" en surbrillance
    And Sophie peut cliquer sur la notification pour accéder directement à la story

  Scenario: Ajout d'une pièce jointe
    When je clique sur "Joindre un fichier"
    And je sélectionne le fichier "mockup-virement.pdf" (2 MB)
    And je clique sur "Télécharger"
    Then le fichier est uploadé sur le serveur
    And il apparaît dans la section "Pièces jointes"
    And je peux le télécharger en cliquant dessus
    And les formats acceptés sont: PDF, PNG, JPG, DOC, XLS (max 10 MB)

US-028 : Filtrage et recherche dans le backlog

Feature: Recherche et filtrage du backlog
  En tant que Product Owner
  Je veux filtrer et rechercher dans le backlog
  Afin de naviguer efficacement dans un backlog volumineux

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And le backlog contient 150 items
    And je suis sur la page "Backlog"

  Scenario: Recherche textuelle
    When je saisis "virement" dans la barre de recherche
    And j'appuie sur Entrée
    Then seules les stories contenant "virement" dans le titre ou description s'affichent
    And le compteur indique "8 résultats sur 150"
    And les termes recherchés sont surlignés dans les résultats

  Scenario: Filtrage par statut et priorité
    When je sélectionne les filtres suivants:
      | Filtre   | Valeur           |
      | Statut   | To Do, In Progress|
      | Priorité | Haute            |
    And je clique sur "Appliquer les filtres"
    Then seules les stories correspondantes s'affichent
    And le compteur indique "12 résultats sur 150"
    And les filtres actifs sont affichés en haut avec possibilité de les retirer

  Scenario: Filtrage par assignation
    When je filtre par "Assigné à: Marc Dubois"
    Then seules les stories assignées à Marc s'affichent
    And je vois 15 résultats
    And je peux combiner ce filtre avec d'autres

US-029 : Création de Defects (bugs)

Feature: Gestion des bugs
  En tant que membre d'équipe
  Je veux créer des Defects (bugs) avec sévérité et priorité
  Afin de suivre les anomalies

  Background:
    Given je suis Developer dans le produit "Application Mobile Banking"
    And je suis sur la page "Backlog"

  Scenario: Création d'un bug avec sévérité haute
    When je clique sur "Créer un Defect"
    And je remplis le formulaire avec:
      | Champ                 | Valeur                                          |
      | Titre                 | Crash lors du virement avec montant > 10000€    |
      | Sévérité              | Critique                                        |
      | Priorité              | Haute                                           |
      | Environnement         | Production, iOS 17.1                            |
      | Steps reproduction    | 1. Se connecter\n2. Aller sur Virement\n3. Saisir montant > 10000€\n4. Cliquer Valider |
      | Résultat attendu      | Le virement est validé                          |
      | Résultat observé      | L'application crash                             |
    And je joins une capture d'écran "crash-screenshot.png"
    And je clique sur "Créer"
    Then le Defect est créé
    And il est marqué comme "Bug" avec icône spécifique
    And il apparaît en haut du backlog (priorité haute + sévérité critique)
    And le Product Owner reçoit une notification immédiate

  Scenario: Liaison d'un bug à une User Story
    Given la User Story "Effectuer un virement" existe
    And le bug "Crash lors du virement" existe
    When j'ouvre le bug
    And je le lie à la User Story "Effectuer un virement"
    Then la liaison est créée
    And le bug apparaît dans la section "Bugs associés" de la User Story

US-030 : Création de Spikes

Feature: Gestion des Spikes (investigations)
  En tant que Product Owner
  Je veux créer des Spikes
  Afin de documenter les investigations et recherches nécessaires

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And je suis sur la page "Backlog"

  Scenario: Création d'un Spike pour investigation technique
    When je clique sur "Créer un Spike"
    And je remplis le formulaire avec:
      | Champ               | Valeur                                             |
      | Titre               | Investigation API bancaire PSD2                    |
      | Question recherche  | Quelle API PSD2 utiliser pour connexion multi-banques? |
      | Objectif            | Comparer 3 providers et recommander le meilleur    |
      | Timebox             | 16 heures (2 jours)                                |
      | Assigné à           | Marc Dubois                                        |
    And je définis les livrables attendus:
      | Livrable                                               |
      | Document de comparaison des 3 providers                |
      | POC avec l'API sélectionnée                            |
      | Recommandation argumentée                              |
    And je clique sur "Créer"
    Then le Spike est créé
    And il est identifié visuellement comme "Spike" dans le backlog
    And la timebox de 16h est affichée
    And le Spike peut être planifié dans un sprint

  Scenario: Clôture d'un Spike avec résultats
    Given le Spike "Investigation API bancaire PSD2" est terminé
    When Marc clique sur "Clôturer le Spike"
    And il ajoute un résumé des conclusions:
      """
      Après comparaison, nous recommandons l'API "BankConnect" car:
      - Meilleure couverture (95% des banques FR)
      - Documentation complète
      - Support réactif
      - Coût compétitif
      """
    And il joint le document "comparatif-api-psd2.pdf"
    And il clique sur "Clôturer"
    Then le Spike passe au statut "Done"
    And les résultats sont enregistrés
    And le PO peut créer les User Stories basées sur ces résultats

Epic 4 - Estimation et Planning Poker

US-040 : Création d'une session de Planning Poker

Feature: Planning Poker pour estimation collaborative
  En tant que Scrum Master
  Je veux créer une session de Planning Poker pour un ensemble de stories
  Afin d'obtenir des estimations collaboratives

  Background:
    Given je suis Scrum Master du produit "Application Mobile Banking"
    And 10 User Stories n'ont pas encore été estimées
    And je suis sur la page "Planning Poker"

  Scenario: Création et configuration d'une session
    When je clique sur "Nouvelle session"
    And je sélectionne l'échelle "Fibonacci (0, 1, 2, 3, 5, 8, 13, 21)"
    And je sélectionne les stories à estimer:
      | Story                              |
      | Consulter le solde                 |
      | Effectuer un virement              |
      | Consulter l'historique             |
    And j'invite les participants:
      | Nom            |
      | Sophie Martin  |
      | Marc Dubois    |
      | Julie Petit    |
    And je clique sur "Démarrer la session"
    Then la session est créée
    And tous les participants reçoivent une notification
    And un lien vers la session leur est envoyé

  Scenario: Partage de session en temps réel
    Given une session Planning Poker est en cours
    When un participant clique sur le lien de la session
    Then il rejoint la session en temps réel
    And il voit la première story à estimer
    And il voit la liste des participants connectés

US-041 : Vote anonyme dans une session Planning Poker

Feature: Vote collaboratif en Planning Poker
  En tant que membre d'équipe
  Je veux rejoindre une session de Planning Poker et voter de manière anonyme
  Afin de contribuer à l'estimation sans biais

  Background:
    Given une session Planning Poker est en cours
    And je suis participant à cette session
    And la story "Consulter le solde" est en cours d'estimation

  Scenario: Déroulement d'un vote
    Given tous les participants sont connectés
    And la story à estimer s'affiche pour tous
    When chaque participant sélectionne sa carte (5, 8, 5, 8, 5)
    Then les votes restent cachés tant que tous n'ont pas voté
    And un indicateur montre qui a voté et qui n'a pas encore voté

  Scenario: Révélation des votes
    Given tous les participants ont voté
    When le Scrum Master clique sur "Révéler les votes"
    Then tous les votes sont affichés simultanément:
      | Participant   | Vote |
      | Sophie Martin | 5    |
      | Marc Dubois   | 8    |
      | Julie Petit   | 5    |
      | Moi-même      | 5    |
    And la médiane (5) et la moyenne (5.75) sont calculées
    And les écarts importants sont mis en évidence

  Scenario: Discussion et nouveau vote en cas d'écart
    Given les votes révélés montrent un écart (5, 8, 13)
    When le Scrum Master lance une discussion
    And Marc (qui a voté 13) explique sa vision
    And l'équipe discute pendant 5 minutes
    And le Scrum Master lance un nouveau vote
    Then un nouveau round commence
    And les participants peuvent changer leur estimation

US-042 : Configuration de l'échelle d'estimation

Feature: Configuration de l'échelle d'estimation
  En tant que Scrum Master
  Je veux configurer l'échelle d'estimation
  Afin d'adapter aux préférences de l'équipe

  Background:
    Given je suis sur la page de création d'une session Planning Poker

  Scenario: Sélection de l'échelle Fibonacci
    When je sélectionne l'échelle "Fibonacci"
    Then les cartes disponibles sont: 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
    And une carte "?" est disponible pour "Je ne sais pas"
    And une carte "" est disponible pour "Pause nécessaire"

  Scenario: Sélection de l'échelle T-shirt
    When je sélectionne l'échelle "T-shirt sizes"
    Then les cartes disponibles sont: XS, S, M, L, XL, XXL
    And ces tailles sont converties en points: XS=1, S=2, M=3, L=5, XL=8, XXL=13

  Scenario: Création d'une échelle personnalisée
    When je sélectionne "Échelle personnalisée"
    And je définis les valeurs: 1, 2, 4, 8, 16
    And je sauvegarde cette échelle sous le nom "Échelle équipe mobile"
    Then l'échelle est enregistrée
    And elle est disponible pour les prochaines sessions
    And seules ces valeurs sont proposées lors des votes

US-043 : Révélation simultanée des votes

Feature: Révélation synchronisée des votes
  En tant que participant
  Je veux voir les résultats révélés simultanément après que tous aient voté
  Afin de garantir l'indépendance des estimations

  Background:
    Given une session Planning Poker est en cours
    And 5 participants sont connectés
    And la story "Effectuer un virement" est en cours d'estimation

  Scenario: Attente de tous les votes
    Given 4 participants sur 5 ont voté
    When je suis le 5ème participant et je n'ai pas encore voté
    Then je vois un message "En attente de votre vote"
    And je vois les avatars des participants avec indicateur "a voté" / "en attente"
    And je ne peux pas voir les votes des autres
    And le bouton "Révéler" est désactivé pour le Scrum Master

  Scenario: Révélation automatique quand tous ont voté
    Given tous les participants ont voté
    When le dernier participant valide son vote
    Then les votes sont automatiquement révélés pour tous en même temps
    And une animation affiche les cartes qui se retournent simultanément
    And les statistiques s'affichent: min, max, moyenne, médiane, mode

US-044 : Chat intégré pour discussion

Feature: Discussion collaborative pendant l'estimation
  En tant qu'équipe
  Nous voulons discuter via chat intégré
  Afin de converger vers un consensus d'estimation

  Background:
    Given une session Planning Poker est en cours
    And les votes viennent d'être révélés avec un écart important
    And je suis dans la vue de la session

  Scenario: Envoi de messages dans le chat
    When je clique dans la zone de chat
    And je saisis "Je pense que la connexion à l'API externe ajoute de la complexité"
    And j'appuie sur Entrée
    Then mon message apparaît immédiatement dans le chat pour tous les participants
    And il affiche mon nom et l'heure d'envoi
    And une notification sonore discrète alerte les autres participants

  Scenario: Demande de parole pour explication
    Given Marc a voté 13 alors que les autres ont voté 5
    When Sophie clique sur "Demander explication" à côté du vote de Marc
    Then Marc reçoit une notification
    And le Scrum Master voit la demande
    And Marc peut prendre la parole pour expliquer son estimation

  Scenario: Utilisation du chat pour argumenter
    When plusieurs participants échangent dans le chat:
      | Participant   | Message                                          |
      | Marc          | Il faut gérer les erreurs réseau et les timeouts |
      | Sophie        | Oui mais on a déjà un composant réutilisable     |
      | Julie         | Le composant couvre 70% du besoin                |
    Then l'équipe converge vers une compréhension commune
    And le Scrum Master peut lancer un nouveau vote

US-045 : Consultation de l'historique des sessions

Feature: Historique des sessions d'estimation
  En tant que Product Owner
  Je veux consulter l'historique des sessions d'estimation
  Afin d'analyser la fiabilité et la cohérence des estimations

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And 15 sessions Planning Poker ont été réalisées
    And je suis sur la page "Historique Planning Poker"

  Scenario: Consultation de l'historique
    When j'ouvre la liste des sessions
    Then je vois toutes les sessions avec:
      | Informations affichées  |
      | Date de la session      |
      | Nombre de stories       |
      | Participants            |
      | Durée totale            |
      | Statut (Terminée/En cours)|
    And je peux filtrer par date, participants, statut

  Scenario: Analyse d'une session spécifique
    When je clique sur la session du "15/10/2025"
    Then je vois le détail de toutes les stories estimées
    And pour chaque story, je vois:
      | Détails affichés         |
      | Titre de la story        |
      | Votes de chaque participant |
      | Nombre de rounds de vote |
      | Estimation finale retenue|
      | Temps passé sur cette story|
    And je peux exporter les données au format CSV

  Scenario: Comparaison estimation vs réalité
    Given des stories estimées ont été réalisées
    When je consulte le rapport "Estimation vs Réalité"
    Then je vois un tableau comparatif:
      | Story                | Estimation | Temps réel | Écart |
      | Consulter le solde   | 5 points   | 6 points   | +20%  |
      | Effectuer un virement| 8 points   | 8 points   | 0%    |
    And je vois un graphique de tendance des écarts
    And je peux identifier les patterns d'écart pour améliorer

Epic 5 - Sprints et Releases

US-050 : Création d'une Release avec roadmap

Feature: Planification des Releases
  En tant que Product Owner
  Je veux créer une Release avec nom, objectif, dates et roadmap
  Afin de planifier à moyen terme

  Background:
    Given je suis Product Owner du produit "Application Mobile Banking"
    And je suis sur la page "Releases"

  Scenario: Création d'une Release
    When je clique sur "Créer une Release"
    And je remplis le formulaire avec:
      | Champ           | Valeur                                      |
      | Nom             | Release 1.0 - MVP                           |
      | Objectif        | Livrer les fonctionnalités bancaires de base|
      | Date début      | 01/11/2025                                  |
      | Date fin        | 31/12/2025                                  |
      | Nombre sprints  | 4                                           |
    And je sélectionne les Epics inclus:
      | Epic                             |
      | Gestion des comptes bancaires    |
      | Virements et paiements           |
    And je clique sur "Créer"
    Then la Release "Release 1.0 - MVP" est créée
    And elle apparaît dans la roadmap produit
    And 4 sprints de 2 semaines sont générés automatiquement
    And je peux maintenant assigner des stories aux sprints de cette release

  Scenario: Visualisation de la roadmap visuelle
    Given 3 Releases sont planifiées
    When j'ouvre la vue "Roadmap"
    Then je vois une timeline avec les 3 releases
    And chaque release affiche: nom, dates, progression (%)
    And les Epics inclus dans chaque release sont visibles
    And je peux zoomer sur une release pour voir les sprints

US-051 : Création d'un Sprint

Feature: Gestion des Sprints
  En tant que Scrum Master
  Je veux créer un Sprint avec durée, dates et capacité équipe
  Afin de cadrer l'itération

  Background:
    Given je suis Scrum Master du produit "Application Mobile Banking"
    And la "Release 1.0 - MVP" existe
    And je suis sur la page "Sprints"

  Scenario: Création d'un Sprint dans une Release
    When je clique sur "Créer un Sprint"
    And je remplis le formulaire avec:
      | Champ            | Valeur           |
      | Nom              | Sprint 1         |
      | Release          | Release 1.0 - MVP|
      | Date début       | 01/11/2025       |
      | Date fin         | 14/11/2025       |
      | Durée            | 2 semaines       |
      | Capacité équipe  | 40 points        |
    And je clique sur "Créer"
    Then le "Sprint 1" est créé
    And il est rattaché à la "Release 1.0 - MVP"
    And la capacité de 40 points est définie
    And je peux maintenant planifier les stories dans ce sprint

  Scenario: Calcul automatique de la capacité
    Given l'équipe contient:
      | Membre        | Disponibilité | Points/jour |
      | Marc Dubois   | 100%          | 2           |
      | Julie Petit   | 100%          | 2           |
      | Sophie Martin | 80% (SM)      | 1.6         |
    And le sprint dure 10 jours ouvrés
    When je clique sur "Calculer la capacité automatiquement"
    Then la capacité suggérée est (2+2+1.6) * 10 = 56 points
    And je peux ajuster manuellement si nécessaire

US-052 : Définition d'un Sprint Goal

Feature: Sprint Goal (Objectif de Sprint)
  En tant que Product Owner
  Je veux définir un Sprint Goal clair et mesurable
  Afin d'aligner l'équipe sur l'objectif de l'itération

  Background:
    Given le "Sprint 1" est créé
    And je suis dans la vue de planification du Sprint 1

  Scenario: Définition du Sprint Goal
    When je clique sur "Définir le Sprint Goal"
    And je saisis l'objectif "Les utilisateurs peuvent consulter leurs comptes et effectuer des virements simples"
    And j'ajoute les critères de succès:
      | Critère                                          |
      | Consultation du solde fonctionnelle              |
      | Virement entre comptes propres fonctionnel       |
      | Tests d'acceptation passés à 100%                |
      | Démonstration réussie au Product Owner           |
    And je clique sur "Enregistrer"
    Then le Sprint Goal est défini
    And il est affiché en haut du board Sprint
    And il est visible par tous les membres de l'équipe
    And il sert de référence pour le Sprint Planning et la Review

  Scenario: Validation du Sprint Goal en Daily
    Given le Sprint Goal est "Les utilisateurs peuvent consulter leurs comptes"
    And nous sommes au jour 5 du sprint
    When l'équipe fait le daily stand-up
    Then chaque membre indique si son travail contribue au Sprint Goal
    And les blocages sont priorisés selon leur impact sur le Sprint Goal

US-053 : Sélection des stories pour le sprint backlog

Feature: Planning du Sprint Backlog
  En tant que membre d'équipe
  Je veux sélectionner des stories du product backlog vers le sprint backlog
  Afin de définir le périmètre du sprint lors du planning

  Background:
    Given nous sommes en Sprint Planning pour le "Sprint 1"
    And la capacité du sprint est 40 points
    And le product backlog contient des stories estimées
    And je suis sur la vue "Sprint Planning"

  Scenario: Ajout de stories au sprint backlog
    Given le sprint backlog est vide (0 points)
    When je sélectionne les stories suivantes depuis le product backlog:
      | Story                              | Points |
      | Consulter le solde                 | 5      |
      | Effectuer un virement simple       | 8      |
      | Consulter l'historique             | 5      |
      | Notifications push                 | 8      |
    And je les glisse dans la zone "Sprint Backlog"
    Then les 4 stories sont ajoutées au sprint
    And le total des points est 26/40
    And un indicateur visuel montre qu'il reste 14 points de capacité

  Scenario: Avertissement de sur-engagement
    Given le sprint backlog contient 38 points
    When je tente d'ajouter une story de 8 points
    Then un avertissement "Attention: capacité dépassée (46/40)" s'affiche
    And je peux quand même ajouter la story si l'équipe est d'accord
    And une note est enregistrée pour analyse en rétrospective

  Scenario: Engagement de l'équipe sur le périmètre
    Given le sprint backlog contient 38 points
    And toutes les stories sont clairement comprises
    When le Scrum Master demande "L'équipe s'engage-t-elle sur ce périmètre ?"
    And tous les membres votent "Oui"
    And je clique sur "Valider et démarrer le sprint"
    Then le sprint passe au statut "En cours"
    And les stories du sprint backlog deviennent disponibles sur le board
    And la date de début officielle est enregistrée

US-054 : Décomposition des User Stories en tâches

Feature: Décomposition en tâches techniques
  En tant que développeur
  Je veux décomposer une User Story en tâches techniques
  Afin de faciliter l'exécution et le suivi

  Background:
    Given la User Story "Consulter le solde" (5 points) est dans le sprint backlog
    And je suis sur la page de détail de cette story

  Scenario: Création de tâches techniques
    When je clique sur "Décomposer en tâches"
    And je crée les tâches suivantes:
      | Titre de la tâche                        | Estimation | Assigné à   |
      | Créer l'endpoint GET /accounts/:id/balance | 4h         | Marc Dubois |
      | Implémenter le service de récupération     | 3h         | Marc Dubois |
      | Créer le composant Angular d'affichage     | 4h         | Julie Petit |
      | Ajouter les tests unitaires backend        | 2h         | Marc Dubois |
      | Ajouter les tests E2E                      | 3h         | Julie Petit |
    And je clique sur "Enregistrer les tâches"
    Then les 5 tâches sont créées et rattachées à la story
    And le total estimé est 16 heures
    And chaque tâche apparaît sur le board avec la story parente
    And les développeurs peuvent mettre à jour le statut de chaque tâche

  Scenario: Suivi de la progression via les tâches
    Given la story "Consulter le solde" a 5 tâches
    And 3 tâches sont "Done", 1 est "In Progress", 1 est "To Do"
    When je consulte la story
    Then un indicateur de progression affiche "3/5 tâches terminées (60%)"
    And la story reste "In Progress" tant que toutes les tâches ne sont pas terminées

US-055 : Mise à jour du statut des tâches sur le board Kanban

Feature: Board Kanban du Sprint
  En tant que membre d'équipe
  Je veux mettre à jour le statut des tâches et stories sur le board Kanban par drag & drop
  Afin de refléter l'avancement en temps réel

  Background:
    Given le "Sprint 1" est en cours
    And je suis sur le board Kanban du sprint
    And le board contient les colonnes: To Do | In Progress | Review | Done

  Scenario: Démarrage d'une tâche
    Given la tâche "Créer l'endpoint GET /accounts/:id/balance" est dans "To Do"
    When je fais glisser cette tâche vers "In Progress"
    Then la tâche change de colonne
    And elle est automatiquement assignée à moi si elle ne l'était pas
    And un timestamp "Démarré le XX/XX à XXh" est enregistré
    And les autres membres voient le changement en temps réel

  Scenario: Respect des WIP limits
    Given la colonne "In Progress" a un WIP limit de 3
    And elle contient déjà 3 tâches
    When je tente de glisser une 4ème tâche vers "In Progress"
    Then un avertissement "WIP limit atteint (3/3)" s'affiche
    And le déplacement est bloqué
    And un message me suggère "Terminez une tâche avant d'en démarrer une nouvelle"

  Scenario: Passage en review
    Given la tâche "Créer le composant Angular" est dans "In Progress"
    And j'ai terminé le développement
    When je la glisse vers "Review"
    Then la tâche change de colonne
    And une notification est envoyée au reviewer désigné (ou au PO)
    And un commentaire automatique "Prêt pour review - @Sophie" est ajouté

  Scenario: Validation et passage en Done
    Given la tâche est dans "Review"
    And Sophie a validé le code review
    When Sophie glisse la tâche vers "Done"
    Then la tâche est marquée comme terminée
    And un timestamp "Terminé le XX/XX à XXh" est enregistré
    And si toutes les tâches de la story sont "Done", la story passe aussi "Done"

US-056 : Consultation du burndown chart

Feature: Burndown Chart du Sprint
  En tant que Product Owner
  Je veux consulter le burndown chart du sprint en cours
  Afin de suivre la progression et détecter les risques

  Background:
    Given le "Sprint 1" est en cours (jour 7/10)
    And le sprint contenait 40 points initialement
    And je suis sur la page du "Sprint 1"

  Scenario: Affichage du burndown chart
    When je clique sur l'onglet "Burndown"
    Then je vois un graphique avec:
      | Éléments affichés              |
      | Axe X: Jours du sprint (1 à 10)|
      | Axe Y: Points restants         |
      | Ligne idéale (droite descendante de 40 à 0)|
      | Ligne réelle (points restants par jour)    |
    And le graphique montre qu'au jour 7, il reste 18 points
    And la ligne idéale indique qu'il devrait rester 12 points
    And un écart de +6 points est identifié

  Scenario: Interprétation des tendances
    Given le burndown montre un écart de +6 points au jour 7
    When je consulte l'analyse de tendance
    Then une alerte "Risque de non-atteinte du Sprint Goal" s'affiche
    And une projection indique "À ce rythme, 8 points resteront en fin de sprint"
    And des suggestions sont proposées:
      | Suggestion                                       |
      | Reporter une story de 8 points au prochain sprint|
      | Identifier et lever les blocages                 |
      | Augmenter la capacité (heures sup, aide externe) |

  Scenario: Zoom sur une journée spécifique
    When je clique sur le point du jour 5
    Then je vois le détail de ce jour:
      | Détails affichés          |
      | Points brûlés: 3          |
      | Stories terminées: 1      |
      | Événements: Daily stand-up|
    And je peux voir les stories terminées ce jour-là

US-057 : Clôture du sprint et génération du rapport

Feature: Clôture de Sprint
  En tant que Scrum Master
  Je veux clôturer un sprint et générer automatiquement le rapport
  Afin de documenter les résultats et la vélocité

  Background:
    Given le "Sprint 1" est en cours
    And nous sommes au dernier jour du sprint (jour 10/10)
    And la Sprint Review a eu lieu
    And je suis sur la page du "Sprint 1"

  Scenario: Clôture d'un sprint réussi
    Given 38 points sur 40 ont été complétés
    And 2 stories restent "In Progress"
    When je clique sur "Clôturer le sprint"
    And une modal me demande ce que je veux faire des stories non terminées
    And je sélectionne "Reporter au Sprint 2" pour les 2 stories restantes
    And je clique sur "Confirmer la clôture"
    Then le sprint passe au statut "Terminé"
    And les 2 stories non terminées sont déplacées vers le Sprint 2
    And un rapport de sprint est généré automatiquement

  Scenario: Génération automatique du rapport de sprint
    Given le sprint vient d'être clôturé
    When j'ouvre le "Rapport du Sprint 1"
    Then je vois les métriques suivantes:
      | Métrique                      | Valeur                |
      | Points planifiés              | 40                    |
      | Points complétés              | 38                    |
      | Taux de complétion            | 95%                   |
      | Vélocité                      | 38 points             |
      | Nombre de stories             | 5 planifiées, 4 Done  |
      | Bugs créés pendant le sprint  | 2                     |
      | Bugs résolus                  | 2                     |
    And je vois un burndown chart final
    And je vois la liste des stories complétées avec lien vers les démos
    And je peux exporter le rapport en PDF

  Scenario: Calcul de la vélocité moyenne
    Given les 3 derniers sprints ont les vélocités suivantes:
      | Sprint   | Vélocité |
      | Sprint 1 | 38       |
      | Sprint 2 | 42       |
      | Sprint 3 | 40       |
    When je consulte les statistiques d'équipe
    Then la vélocité moyenne affichée est 40 points
    And cette vélocité est suggérée pour le prochain sprint planning

US-058 : Report des stories non terminées

Feature: Gestion des stories non terminées
  En tant que Product Owner
  Je veux reporter les stories non terminées vers le prochain sprint ou le backlog
  Afin de gérer proprement la fin de sprint

  Background:
    Given le "Sprint 1" se termine
    And 2 stories sont restées "In Progress":
      | Story                         | Points | Progression |
      | Notifications push            | 8      | 70%         |
      | Export des transactions       | 5      | 30%         |

  Scenario: Report au prochain sprint
    Given je suis en train de clôturer le "Sprint 1"
    When la modal de clôture s'affiche
    And je sélectionne "Reporter au Sprint 2" pour "Notifications push"
    And je sélectionne "Reporter au Sprint 2" pour "Export des transactions"
    And je confirme
    Then les 2 stories sont déplacées dans le "Sprint 2"
    And elles conservent leur estimation (8 et 5 points)
    And elles conservent leurs tâches et commentaires
    And un commentaire automatique indique "Reporté depuis Sprint 1"

  Scenario: Report au product backlog
    Given je suis en train de clôturer le "Sprint 1"
    When la modal de clôture s'affiche
    And je sélectionne "Renvoyer au product backlog" pour "Export des transactions"
    And je saisis la raison "Priorité réévaluée à la baisse"
    And je confirme
    Then la story est retirée du sprint
    And elle retourne dans le product backlog
    And elle est repositionnée selon sa priorité
    And un commentaire enregistre la raison du report

  Scenario: Analyse des reports récurrents
    Given "Export des transactions" a été reportée 2 fois
    When je consulte l'historique de cette story
    Then je vois un avertissement "Story reportée 2 fois"
    And une analyse suggère:
      | Suggestion                                          |
      | Story trop grosse ? Envisager de la découper        |
      | Dépendances bloquantes ? Identifier et résoudre     |
      | Estimation incorrecte ? Ré-estimer en équipe        |

Epic 6 - Ceremonies Agile

US-070 : Organisation d’un Sprint Planning

Feature: Sprint Planning
  En tant que Scrum Master
  Je veux organiser un Sprint Planning avec ordre du jour et participants
  Afin de structurer la cérémonie et définir le périmètre du sprint

  Background:
    Given le "Sprint 2" démarre demain
    And je suis Scrum Master du produit "Application Mobile Banking"
    And les stories du backlog sont prêtes (refinement terminé)
    And l’équipe est au complet (PO, SM, Devs)

  Scenario: Planification d’un Sprint réussie
    When je planifie la réunion "Sprint Planning"
    And j’invite tous les membres de l’équipe
    And je partage l’ordre du jour suivant:
      | Étape | Objectif                          |
      | 1     | Rappel du Sprint Goal précédent   |
      | 2     | Sélection des stories             |
      | 3     | Estimation de la capacité équipe  |
      | 4     | Définition du Sprint Goal         |
    Then la réunion est enregistrée dans le calendrier d’équipe
    And tous les participants reçoivent une invitation automatique
    And la salle virtuelle de réunion est configurée (Teams/Zoom)

  Scenario: Sélection des stories adaptées à la capacité
    Given le backlog contient 15 stories prêtes
    And la capacité estimée de l’équipe est de 40 points
    When l’équipe sélectionne les stories les plus prioritaires jusqu’à 38 points
    Then le "Sprint Goal" est défini autour de ces stories
    And le backlog du sprint est validé et publié

US-071 : Daily Stand-up (Mêlée quotidienne)

Feature: Daily Stand-up
  En tant que membre d’équipe
  Je veux enregistrer mon compte-rendu daily
  Afin de maintenir la transparence et identifier les blocages rapidement

  Background:
    Given le "Sprint 2" est en cours (jour 5/10)
    And la réunion daily est planifiée chaque jour à 9h30
    And je suis connecté à la plateforme de l’équipe

  Scenario: Conduite d’un Daily structuré
    When le Scrum Master démarre la réunion
    And chaque membre répond aux trois questions :
      | Question                               |
      | Que faisais-tu hier ?                 |
      | Que feras-tu aujourd’hui ?            |
      | As-tu des blocages ?                  |
    Then chaque réponse est enregistrée dans le journal du sprint
    And le tableau Kanban est mis à jour avec les tâches concernées
    And les blocages identifiés sont notifiés au Scrum Master

  Scenario: Dépassement de la durée maximale
    Given la réunion dure depuis 20 minutes
    When le Scrum Master constate un hors-sujet
    Then il clôture le daily à 15 minutes
    And les discussions annexes sont planifiées dans une autre réunion

US-072 : Historique des Daily Stand-ups

Feature: Historique des Daily Meetings
  En tant que Scrum Master
  Je veux consulter l’historique des Daily
  Afin d’identifier les tendances et blocages récurrents

  Background:
    Given l’équipe a complété 7 Dailies sur 10 jours de sprint
    And un journal de daily est enregistré automatiquement

  Scenario: Consultation de l’historique
    When je consulte la section "Historique des Dailies"
    Then je vois les entrées suivantes :
      | Date       | Points bloquants | Stories impactées |
      | 12/10/2025 | API lente        | Virement bancaire  |
      | 13/10/2025 | Blocage QA       | Authentification   |
    And je peux filtrer par membre ou par story

  Scenario: Détection de blocages récurrents
    When je lance l’analyse des blocages
    Then le système me signale une récurrence sur le module "API Comptes"
    And propose une action corrective "Pair Programming ou revue technique"

US-073 : Organisation d’une Sprint Review

Feature: Sprint Review
  En tant que Product Owner
  Je veux organiser une Sprint Review à la fin du sprint
  Afin de présenter les incréments livrés et recueillir les feedbacks

  Background:
    Given le "Sprint 2" se termine demain
    And les stories suivantes sont terminées :
      | Story                   | Points | Statut |
      | Consultation solde      | 5      | Done   |
      | Historique transactions | 8      | Done   |

  Scenario: Planification de la Sprint Review
    When je crée une réunion "Sprint Review"
    And j’invite le client et les parties prenantes
    And j’ajoute les stories Done à l’ordre du jour
    Then la réunion est enregistrée avec ordre du jour clair
    And tous les participants reçoivent les invitations

  Scenario: Déroulement réussi de la Review
    Given la review débute avec PO, SM, Devs et stakeholders
    When le Scrum Master anime la démonstration des incréments
    And le Product Owner recueille les retours clients
    Then chaque feedback est enregistré dans la section "Actions à suivre"
    And la satisfaction client est notée en fin de réunion

US-074 : Réalisation de la Rétrospective

Feature: Sprint Retrospective
  En tant que Scrum Master
  Je veux animer une rétrospective de sprint
  Afin d’améliorer le processus par l’analyse collective des améliorations

  Background:
    Given le "Sprint 2" est terminé
    And la Sprint Review a été réalisée
    And je suis sur la page "Rétrospective"

  Scenario: Animation d’une rétrospective Start/Stop/Continue
    When je sélectionne le format "Start / Stop / Continue"
    And chaque membre ajoute ses notes :
      | Type   | Note                            |
      | Start  | Faire des tests pairés          |
      | Stop   | Lancer trop de stories à la fois|
      | Continue| Daily concis                   |
    Then les notes sont visibles par tous
    And le Scrum Master anime le regroupement par thèmes
    And les membres votent sur les points prioritaires à traiter

  Scenario: Définition d’actions d’amélioration
    Given les votes sont terminés
    When je clique sur "Créer actions d’amélioration"
    Then les actions suivantes sont créées :
      | Action                   | Responsable   | Sprint cible |
      | Réduire WIP à 2 par dev   | Sophie Martin | Sprint 3     |
      | Ajouter tests unitaires   | Marc Dubois   | Sprint 3     |
    And ces actions sont suivies comme stories techniques

US-075 : Suivi des actions d’amélioration

Feature: Suivi des actions rétrospectives
  En tant que Scrum Master
  Je veux suivre les actions décidées en rétrospective
  Afin de vérifier qu’elles sont mises en œuvre dans les prochains sprints

  Background:
    Given 3 actions ont été décidées à la rétrospective du Sprint 2
    And chacune a un responsable
    And le "Sprint 3" a commencé

  Scenario: Suivi d’avancement des actions
    When j’ouvre le tableau "Actions d’amélioration"
    Then je vois les statuts suivants :
      | Action                   | Responsable   | Statut       |
      | Réduire WIP à 2 par dev   | Sophie Martin | En cours     |
      | Ajouter tests unitaires   | Marc Dubois   | Done         |
    And le pourcentage global d’avancement est calculé

  Scenario: Clôture d’une action
    Given l’action "Ajouter tests unitaires" est Done
    When je clique sur "Clôturer"
    Then l’action est archivée avec sa date de réalisation
    And elle apparaît dans l’historique des rétrospectives

US-076 : Historique et récurrence des rétrospectives

Feature: Historique des rétrospectives
  En tant que Scrum Master
  Je veux conserver l’historique des rétrospectives
  Afin d’analyser l’évolution continue de l’équipe

  Background:
    Given les rétrospectives des 5 derniers sprints sont archivées
    And chaque rétrospective contient les actions et votes associés

  Scenario: Consultation de l’historique complet
    When je clique sur "Historique des rétrospectives"
    Then je vois la liste des rétrospectives passées
    And pour chacune :
      | Sprint | Nombre d’actions | Taux réalisées |
      | 1      | 3                | 100%           |
      | 2      | 3                | 66%            |
      | 3      | 4                | En cours       |
    And les thèmes récurrents sont identifiés automatiquement

  Scenario: Détection de récurrences négatives
    Given plusieurs rétrospectives mentionnent "Manque de tests"
    When j’exécute l’analyse d’historiques
    Then une alerte "Problème persistant identifié" s’affiche
    And une story technique est suggérée : "Renforcer couverture de tests"

US-077 : Synchronisation automatique du calendrier Agile

Feature: Synchronisation du calendrier agile
  En tant qu’équipe
  Nous voulons synchroniser automatiquement les cérémonies
  Afin d’assurer une visibilité complète sur le planning des sprints

  Background:
    Given le produit "Application Mobile Banking" suit une cadence de sprints de 2 semaines
    And les cérémonies suivantes sont planifiées pour chaque sprint :
      | Type             | Fréquence       |
      | Sprint Planning  | 1 fois par sprint |
      | Daily            | Tous les jours   |
      | Review           | Fin de sprint    |
      | Rétrospective    | Fin de sprint    |

  Scenario: Synchronisation avec l’agenda externe
    When je configure l’intégration Google Calendar
    And j’autorise la connexion
    Then toutes les cérémonies futures apparaissent dans mon agenda
    And les invitations sont envoyées aux membres concernés

  Scenario: Mise à jour automatique des décalages
    Given la date du sprint a été modifiée
    When je décale la date de fin de 2 jours
    Then toutes les cérémonies (Review et Rétrospective) sont automatiquement ajustées
    And les invitations mises à jour sont renvoyées

Epic 7 – Dashboard et Reporting

US-080 : Tableau de bord produit

Feature: Tableau de bord produit
  En tant que Product Owner
  Je veux visualiser le dashboard produit avec les métriques clés
  Afin de suivre la progression et la qualité du projet

  Background:
    Given le produit "Application Mobile Banking" contient 4 sprints terminés
    And la vélocité moyenne est 40 points/sprint
    And je suis sur la page "Dashboard Produit"

  Scenario: Affichage des métriques globales
    When je consulte le dashboard
    Then je vois les indicateurs clés :
      | Indicateur                   | Valeur |
      | Stories terminées            | 52     |
      | Défauts ouverts              | 8      |
      | Vélocité moyenne             | 40 pts |
      | Satisfaction client moyenne  | 4.6/5  |
    And les graphiques burndown et burnup sont à jour
    And le sprint actuel est mis en surbrillance

  Scenario: Navigation vers les détails
    Given je clique sur la partie "Défauts ouverts"
    Then je suis redirigé vers la liste des bugs actifs
    And le filtre "Statut: Ouvert" est appliqué automatiquement

US-081 : Calendrier des événements d’équipe

Feature: Calendrier des événements d’équipe
  En tant que membre d’équipe
  Je veux consulter le calendrier des événements équipe
  Afin d’avoir une visibilité claire sur le planning des réunions et échéances

  Background:
    Given l’équipe "Mobile Banking" a planifié ses sprints, reviews et rétrospectives
    And le calendrier est synchronisé avec Google Calendar

  Scenario: Affichage du calendrier mensuel
    When je clique sur l’onglet "Calendrier"
    Then je vois tous les événements du sprint courant
      | Type            | Date          |
      | Daily stand-up   | Tous les jours|
      | Sprint Review    | 31/10/2025    |
      | Rétrospective    | 31/10/2025    |
    And chaque événement affiche l’heure, le lien visio, et les participants

  Scenario: Notification d’un changement de planning
    Given la Sprint Review est prévue pour le 31/10/2025
    When le Scrum Master décale la réunion au 1/11/2025
    Then tous les membres reçoivent une notification automatique
    And le calendrier est mis à jour pour l’ensemble de l’équipe

US-082 : Export des rapports de sprint

Feature: Exportation de rapports
  En tant que Product Owner
  Je veux exporter les rapports de sprint au format PDF ou Excel
  Afin de partager les résultats avec les parties prenantes externes

  Background:
    Given le "Sprint 5" est terminé
    And je suis sur la page "Rapports de Sprint"

  Scenario: Export d’un rapport PDF
    When je clique sur "Exporter Rapport PDF"
    Then le document est généré avec :
      | Section                 |
      | Objectif du Sprint       |
      | Stories terminées / en cours |
      | Vélocité                |
      | Actions rétrospectives  |
    And le fichier "Sprint_5_Report.pdf" est téléchargé
    And la date d’export est enregistrée dans l’historique

  Scenario: Export Excel avec graphiques
    When je sélectionne "Exporter en Excel"
    Then un fichier ".xlsx" contenant les mêmes données est généré
    And les graphiques burndown et vélocité sont intégrés dans les onglets

Epic 8 – Notifications et Collaboration

US-090 : Notifications en temps réel

Feature: Notifications en temps réel
  En tant qu’utilisateur
  Je veux recevoir des notifications instantanées
  Afin d’être informé des changements importants dans les stories et tâches

  Background:
    Given le backend supporte WebSocket pour les notifications
    And je suis connecté sur l’interface web

  Scenario: Notification d’assignation de story
    When le Scrum Master m’assigne la story "Optimiser le tableau de bord"
    Then une notification "Vous avez été assigné à une story" s’affiche dans l’application
    And un badge rouge s’affiche sur l’icône des notifications
    And je peux cliquer dessus pour accéder directement à la story

  Scenario: Notification de mention dans un commentaire
    Given Sophie écrit "@Marc merci de vérifier les validations"
    Then je reçois une notification "Sophie vous a mentionné dans un commentaire"
    And la notification contient un lien vers la story concernée

US-091 : Configuration des préférences de notifications

Feature: Gestion des préférences de notification
  En tant qu’utilisateur
  Je veux configurer mes préférences de notification
  Afin de choisir les canaux et types d’alertes que je reçois

  Scenario: Modification des alertes reçues
    Given je suis dans "Mes préférences → Notifications"
    When je décoche "Emails de Daily Report"
    And je coche "Notifications push pour mentions"
    And je clique sur "Sauvegarder"
    Then mes nouvelles préférences sont appliquées
    And un message "Vos paramètres ont été enregistrés" s’affiche

  Scenario: Activation des notifications Slack
    Given une intégration Slack est configurée
    When j’ajoute mon identifiant "@marc.dev"
    And je clique "Activer"
    Then les alertes "Sprint Review" et "Rétrospective" me sont envoyées sur Slack

Epic 9 – Intégrations Externes

US-100 : Synchronisation des commits Git avec stories

Feature: Synchronisation Git
  En tant que développeur
  Je veux synchroniser mes commits avec les stories
  Afin de tracer le code source lié à chaque fonctionnalité

  Scenario: Lien automatique via commit message
    Given je pousse un commit avec le message "US-304: Ajout API solde compte"
    When le pipeline CI/CD analyse le commit
    Then le commit est lié automatiquement à la User Story US-304
    And un lien "Voir commits" apparaît dans la story

US-101 : Import/export du backlog produit

Feature: Import/export backlog
  En tant que Product Owner
  Je veux exporter ou importer le backlog au format CSV/JSON
  Afin de faciliter la migration ou la sauvegarde

  Scenario: Exportation du backlog vers CSV
    Given le backlog contient 25 stories
    When je clique sur "Exporter CSV"
    Then un fichier "backlog_2025-10.csv" est téléchargé
    And le fichier contient les colonnes : ID, Titre, Type, Priorité, Points

Epic 10 – DevOps, Monitoring et Maintenance

US-120 : Monitoring applicatif avec Prometheus

Feature: Monitoring applicatif
  En tant que DevOps
  Je veux surveiller les performances via Prometheus
  Afin de détecter les anomalies système

  Scenario: Vérification des endpoints de health check
    Given le service backend expose /actuator/health
    When Prometheus collecte les données toutes les 15 secondes
    Then les indicateurs up/down sont mis à jour
    And des alertes Slack sont envoyées en cas de code HTTP 500

US-121 : Sauvegarde automatisée des bases

Feature: Sauvegarde quotidienne
  En tant que DevOps
  Je veux planifier des sauvegardes automatiques des bases
  Afin de garantir la restauration en cas d’incident

  Scenario: Exécution automatique de sauvegarde nocturne
    Given la tâche cron "backup-db" s’exécute à 03h00 chaque jour
    When la sauvegarde est terminée
    Then un fichier backup_postgres_<date>.dump est stocké dans le dossier /backups
    And une notification de succès est envoyée
    And un test de restauration aléatoire est programmé chaque semaine

Epic 11 – Accessibilité et UX (Compléments)

US-110 : Navigation au clavier (Accessibilité WCAG)

Feature: Navigation clavier (WCAG 2.1)
  En tant qu’utilisateur en situation de handicap
  Je veux naviguer dans l’interface uniquement au clavier
  Afin d’accéder à toutes les fonctionnalités sans souris

  Scenario: Focus visible et clavier
    Given je navigue dans l’application avec la touche "Tab"
    When je passe d’un champ à un autre
    Then le focus est visible (bordure bleue)
    And aucun élément interactif n’est inaccessible au clavier

US-111 : Thème clair/sombre (Dark Mode)

Feature: Mode clair/sombre
  En tant qu’utilisateur
  Je veux basculer entre le thème clair et sombre
  Afin d’améliorer mon confort visuel selon la luminosité

  Scenario: Basculement en mode sombre
    Given l’application est en thème clair
    When je clique sur "Activer mode sombre"
    Then tous les composants UI passent en teinte sombre
    And le paramètre est enregistré dans mes préférences

  Scenario: Retour automatique au thème clair
    Given il est 08h00
    When "Changement automatique jour/nuit" est activé
    Then le thème clair est réactivé sans intervention manuelle

US-112 : Design responsive mobile

Feature: Responsive Design mobile
  En tant qu’utilisateur
  Je veux accéder aux principales fonctionnalités sur smartphone
  Afin d’utiliser l’application en déplacement

  Scenario: Chargement sur écran ≤ 768px
    Given je me connecte depuis un mobile
    When j’ouvre le tableau de bord
    Then la structure passe en une seule colonne
    And les menus latéraux deviennent des icônes dans la barre inférieure

US-113 : Onboarding interactif

Feature: Onboarding interactif
  En tant que nouvel utilisateur
  Je veux suivre un parcours d’accueil pour découvrir l’application
  Afin de comprendre les fonctionnalités principales rapidement

  Scenario: Affichage du tutoriel pas-à-pas
    Given je me connecte pour la première fois
    When l’onboarding démarre
    Then je vois une série de 5 étapes :
      | Étape | Message                          |
      | 1     | Bienvenue dans AgileManage !     |
      | 2     | Voici le tableau de bord         |
      | 3     | Gérons ensemble ton premier backlog |
      | 4     | Découvre ton profil et préférences |
      | 5     | Commence ton premier sprint !     |

  Scenario: Relance de l’onboarding
    Given j’ai déjà terminé le tutoriel
    When je clique sur "Aide → Revoir le tutoriel"
    Then le tutoriel recommence depuis l’étape 1
    And mes anciennes préférences ne sont pas réinitialisées