Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend. **Structure cible:** ``` docs/domains/ ├── README.md (Context Map) ├── _shared/ (Core Domain) ├── recommendation/ (Supporting Subdomain) ├── content/ (Supporting Subdomain) ├── moderation/ (Supporting Subdomain) ├── advertising/ (Generic Subdomain) ├── premium/ (Generic Subdomain) └── monetization/ (Generic Subdomain) ``` **Changements effectués:** Phase 1: Création de l'arborescence des 7 bounded contexts Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/ Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/ Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/ Phase 5: Création des README.md pour chaque domaine Phase 6: Déplacement des features Gherkin vers domains/*/features/ Phase 7: Création du Context Map (domains/README.md) Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh) Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/) **Configuration des tests:** - Makefile: godog run docs/domains/*/features/ - scripts/generate-bdd-docs.py: features_dir → docs/domains **Avantages:** ✅ Cohésion forte: toute la doc d'un domaine au même endroit ✅ Couplage faible: domaines indépendants, dépendances explicites ✅ Navigabilité améliorée: README par domaine = entrée claire ✅ Alignement code/docs: miroir de backend/internal/ ✅ Onboarding facilité: exploration domaine par domaine ✅ Tests BDD intégrés: features au plus près des règles métier Voir docs/REFACTOR-DDD.md pour le plan complet.
244 lines
11 KiB
Gherkin
244 lines
11 KiB
Gherkin
# language: fr
|
||
|
||
Fonctionnalité: Audio-guide mode piéton (navigation manuelle)
|
||
En tant qu'utilisateur à pied
|
||
Je veux naviguer manuellement entre les séquences d'un audio-guide
|
||
Afin de contrôler mon rythme de visite
|
||
|
||
Contexte:
|
||
Étant donné que l'application RoadWave est démarrée
|
||
Et que l'utilisateur "jean@example.com" est connecté (gratuit)
|
||
Et qu'un audio-guide piéton "Visite du Louvre" est disponible avec 12 séquences
|
||
|
||
# 16.2.1 - Passage entre séquences
|
||
|
||
Scénario: Fin de séquence normale avec pause automatique
|
||
Étant donné que la séquence 1 "Introduction" est en cours de lecture
|
||
Quand la séquence se termine à 2:15
|
||
Alors le player se met en pause automatiquement
|
||
Et le message suivant s'affiche: "Séquence 1 terminée. Appuyez sur Suivant quand vous êtes prêt."
|
||
Et la barre de progression indique "1/12 complétée"
|
||
|
||
Scénario: Passage manuel à la séquence suivante
|
||
Étant donné que la séquence 1 est terminée et le player en pause
|
||
Quand l'utilisateur appuie sur le bouton [▶|] "Suivant"
|
||
Alors la séquence 2 "Pyramide du Louvre" démarre immédiatement
|
||
Et aucune latence n'est observée
|
||
|
||
Scénario: Séquence avec publicité (1/5 séquences)
|
||
Étant donné que la séquence 5 se termine
|
||
Et que c'est la 5ème séquence (1 pub toutes les 5)
|
||
Quand la séquence se termine
|
||
Alors la publicité s'enchaîne automatiquement (sans attente bouton)
|
||
Et la publicité se lit normalement
|
||
Et elle est skippable après 5 secondes
|
||
|
||
Scénario: Fin de publicité avec pause automatique
|
||
Étant donné qu'une publicité est en cours de lecture
|
||
Quand la publicité se termine
|
||
Alors le player se met en pause automatiquement
|
||
Et le message suivant s'affiche: "Séquence 6 prête. Appuyez sur Suivant."
|
||
Et l'utilisateur doit cliquer sur [▶|] pour continuer
|
||
|
||
Scénario: Flux complet séquence → pub → séquence
|
||
Étant donné que la séquence 5 démarre
|
||
Quand la séquence 5 se termine
|
||
Alors la publicité démarre automatiquement
|
||
Quand la publicité se termine
|
||
Alors le player se met en pause
|
||
Quand l'utilisateur clique sur [▶|]
|
||
Alors la séquence 6 démarre
|
||
|
||
Plan du Scénario: Fréquence de publicité configurable
|
||
Étant donné que l'utilisateur gratuit écoute un audio-guide
|
||
Et que la fréquence pub est configurée à <frequence>
|
||
Quand il termine la séquence <numero_sequence>
|
||
Alors une publicité est insérée : <pub_inseree>
|
||
|
||
Exemples:
|
||
| frequence | numero_sequence | pub_inseree |
|
||
| 1/5 | 5 | Oui |
|
||
| 1/5 | 10 | Oui |
|
||
| 1/5 | 4 | Non |
|
||
| 1/3 | 3 | Oui |
|
||
| 1/3 | 6 | Oui |
|
||
|
||
Scénario: Utilisateur Premium sans publicités
|
||
Étant donné que l'utilisateur "premium@example.com" est abonné Premium
|
||
Et qu'il écoute un audio-guide piéton
|
||
Quand il termine la séquence 5
|
||
Alors aucune publicité n'est insérée
|
||
Et le player se met en pause immédiatement
|
||
Et le message "Séquence 6 prête. Appuyez sur Suivant." s'affiche
|
||
|
||
# 16.2.2 - Navigation et contrôles
|
||
|
||
Scénario: Boutons de contrôle disponibles en mode piéton
|
||
Étant donné qu'un audio-guide piéton est en lecture
|
||
Quand l'utilisateur consulte les contrôles
|
||
Alors les boutons suivants sont visibles:
|
||
| bouton | fonction |
|
||
| [▶\|] Suivant | Passe à la séquence suivante |
|
||
| [\|◀] Précédent | Retour à la séquence précédente |
|
||
| [⏸️] Pause | Pause temporaire |
|
||
| [▶️] Play | Reprend la lecture |
|
||
| [📋] Liste | Affiche toutes les séquences |
|
||
|
||
Scénario: Passage à la séquence suivante pendant la lecture
|
||
Étant donné que la séquence 3 "La Joconde" est en cours à 1:42/3:42
|
||
Quand l'utilisateur clique sur [▶|] "Suivant"
|
||
Alors la séquence 4 "Vénus de Milo" démarre immédiatement
|
||
Et la séquence 3 n'est pas marquée comme écoutée (car <80%)
|
||
|
||
Scénario: Retour à la séquence précédente (saut direct)
|
||
Étant donné que la séquence 5 est en cours de lecture
|
||
Quand l'utilisateur clique sur [|◀] "Précédent"
|
||
Alors la séquence 4 démarre depuis le début (0:00)
|
||
Et il n'y a pas de logique "replay si >10s" (contrairement au contenu classique)
|
||
|
||
Scénario: Pause et reprise pendant une séquence
|
||
Étant donné que la séquence 2 est en cours à 1:15/1:48
|
||
Quand l'utilisateur clique sur [⏸️] "Pause"
|
||
Alors la lecture se met en pause
|
||
Et la position 1:15 est conservée
|
||
Quand l'utilisateur clique sur [▶️] "Play"
|
||
Alors la lecture reprend exactement à 1:15
|
||
|
||
Scénario: Interface liste des séquences
|
||
Étant donné qu'un audio-guide de 12 séquences est en cours
|
||
Quand l'utilisateur clique sur [📋] "Liste séquences"
|
||
Alors une liste complète s'affiche avec:
|
||
| élément | exemple |
|
||
| Numéro et titre | "3. La Joconde" |
|
||
| Durée | (3:42) |
|
||
| État | ✅ Écouté / ▶️ En cours / ⭕ À écouter |
|
||
| Date écoute (si écouté) | "Écouté le 15/01/2026" |
|
||
|
||
Scénario: Séquence en cours dans la liste
|
||
Étant donné que la séquence 3 est en cours à 1:22/3:42
|
||
Quand la liste des séquences est affichée
|
||
Alors la séquence 3 affiche:
|
||
"""
|
||
▶️ 3. La Joconde (3:42) - EN COURS
|
||
──●──────────── 1:22/3:42
|
||
"""
|
||
|
||
Scénario: Navigation libre vers séquence non encore écoutée
|
||
Étant donné que l'utilisateur est sur la séquence 3
|
||
Et que les séquences 4 à 12 n'ont pas été écoutées
|
||
Quand l'utilisateur clique sur "8. Les Appartements de Napoléon"
|
||
Alors la séquence 8 démarre immédiatement depuis 0:00
|
||
Et les séquences 4 à 7 restent marquées ⭕ "À écouter"
|
||
|
||
Scénario: Retour à une séquence déjà écoutée
|
||
Étant donné que la séquence 2 "Pyramide du Louvre" a été écoutée à 100%
|
||
Et qu'elle est marquée ✅ "Écouté"
|
||
Quand l'utilisateur clique dessus dans la liste
|
||
Alors la séquence 2 démarre depuis 0:00
|
||
Et le statut ✅ est conservé
|
||
|
||
Scénario: Checkmarks sur séquences écoutées >80%
|
||
Étant donné que l'utilisateur écoute la séquence 2 de durée 1:48
|
||
Quand il écoute jusqu'à 1:30 (83% de complétion)
|
||
Et qu'il passe à la séquence suivante
|
||
Alors la séquence 2 est marquée ✅ "Écouté"
|
||
Et la date d'écoute est enregistrée
|
||
|
||
Scénario: Pas de checkmark si séquence écoutée <80%
|
||
Étant donné que l'utilisateur écoute la séquence 3 de durée 3:42
|
||
Quand il écoute jusqu'à 1:30 (40% de complétion)
|
||
Et qu'il passe à la séquence suivante
|
||
Alors la séquence 3 reste marquée ⭕ "À écouter"
|
||
|
||
Scénario: Bouton "Tout afficher" si plus de 6 séquences
|
||
Étant donné un audio-guide avec 12 séquences
|
||
Quand la liste est affichée
|
||
Alors seules les 6 premières séquences sont visibles initialement
|
||
Et un bouton "Tout afficher ▼" est présent
|
||
Quand l'utilisateur clique sur "Tout afficher ▼"
|
||
Alors les 6 séquences restantes sont affichées
|
||
|
||
Scénario: Saut vers séquence spécifique depuis la barre de progression
|
||
Étant donné qu'un audio-guide est en cours
|
||
Quand l'utilisateur clique sur "3/12" dans la barre de progression
|
||
Alors la liste des séquences s'ouvre
|
||
Et la séquence en cours (3) est mise en surbrillance
|
||
|
||
# Sauvegarde progression
|
||
|
||
Scénario: Position exacte sauvegardée automatiquement
|
||
Étant donné que la séquence 5 est en cours à 2:34/4:10
|
||
Quand l'utilisateur quitte l'application
|
||
Alors la position 2:34 dans la séquence 5 est sauvegardée
|
||
Et la sauvegarde est effectuée localement (SQLite)
|
||
Et la sauvegarde est synchronisée sur le cloud (PostgreSQL)
|
||
|
||
Scénario: Reprise après fermeture de l'application
|
||
Étant donné que l'utilisateur a quitté l'app à la séquence 5 position 2:34
|
||
Quand il rouvre l'audio-guide
|
||
Alors une popup de reprise s'affiche
|
||
Quand il clique sur "▶️ Reprendre"
|
||
Alors la lecture reprend à la séquence 5 position 2:34 exacte
|
||
|
||
# Cas d'usage réels
|
||
|
||
Scénario: Visiteur qui connaît déjà certaines œuvres
|
||
Étant donné qu'un visiteur du Louvre démarre l'audio-guide
|
||
Et qu'il connaît déjà "La Joconde" (séquence 3)
|
||
Quand il arrive à la séquence 3
|
||
Et qu'il clique sur [▶|] "Suivant" après 10 secondes
|
||
Alors la séquence 4 démarre immédiatement
|
||
Et la séquence 3 n'est pas marquée comme écoutée
|
||
|
||
Scénario: Visiteur qui veut voir une œuvre éloignée
|
||
Étant donné qu'un visiteur est à la séquence 2
|
||
Et qu'il aperçoit "La Victoire de Samothrace" (séquence 8) physiquement
|
||
Quand il ouvre la liste et clique sur la séquence 8
|
||
Alors la séquence 8 démarre immédiatement
|
||
Et il peut écouter la description même si les séquences 3-7 ne sont pas écoutées
|
||
|
||
Scénario: Visiteur qui prend une pause café
|
||
Étant donné qu'un visiteur écoute la séquence 6
|
||
Quand il clique sur [⏸️] "Pause"
|
||
Et qu'il ferme l'application pendant 30 minutes
|
||
Quand il rouvre l'application
|
||
Alors la séquence 6 reprend à la position exacte où il s'était arrêté
|
||
|
||
Scénario: Visiteur qui revient le lendemain
|
||
Étant donné qu'un visiteur a écouté les séquences 1-5 hier
|
||
Et qu'il revient au musée aujourd'hui
|
||
Quand il ouvre l'audio-guide
|
||
Alors une popup propose "▶️ Reprendre" (séquence 6)
|
||
Et les séquences 1-5 sont marquées ✅ "Écouté"
|
||
|
||
# Cas d'erreur
|
||
|
||
Scénario: Séquence audio corrompue ou indisponible
|
||
Étant donné que la séquence 7 a un fichier audio corrompu
|
||
Quand l'utilisateur tente de la lire
|
||
Alors un message d'erreur s'affiche:
|
||
"""
|
||
⚠️ Cette séquence est temporairement indisponible.
|
||
[⏭️ Passer à la suivante] [🔄 Réessayer]
|
||
"""
|
||
|
||
Scénario: Perte de connexion pendant le chargement
|
||
Étant donné que l'utilisateur lance la séquence 4
|
||
Et que la connexion réseau est perdue
|
||
Quand le chargement échoue
|
||
Alors un message s'affiche: "Connexion perdue. Vérifiez votre réseau."
|
||
Et un bouton "🔄 Réessayer" est disponible
|
||
|
||
Scénario: Batterie faible en cours de visite
|
||
Étant donné que la batterie de l'appareil est à 5%
|
||
Quand l'utilisateur écoute une séquence
|
||
Alors une notification système s'affiche: "Batterie faible. Progression sauvegardée."
|
||
Et la position est sauvegardée localement toutes les 10 secondes
|
||
|
||
Scénario: Mode piéton sans points GPS (pas d'alerte localisation)
|
||
Étant donné un audio-guide en mode piéton
|
||
Et que le GPS est désactivé
|
||
Quand l'utilisateur démarre l'audio-guide
|
||
Alors aucune alerte GPS ne s'affiche
|
||
Et l'audio-guide fonctionne normalement (navigation 100% manuelle)
|