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.
275 lines
11 KiB
Gherkin
275 lines
11 KiB
Gherkin
# language: fr
|
||
|
||
Fonctionnalité: Audio-guides modes vélo et transport
|
||
En tant qu'utilisateur à vélo ou en transport en commun
|
||
Je veux profiter d'un guidage GPS adapté à mon mode de déplacement
|
||
Afin d'avoir une expérience optimisée avec tolérances appropriées
|
||
|
||
Contexte:
|
||
Étant donné que l'application RoadWave est démarrée
|
||
Et que l'utilisateur "jean@example.com" est connecté
|
||
Et que le GPS est activé
|
||
|
||
# 16.4 - Modes Vélo et Transport
|
||
|
||
Plan du Scénario: Paramètres par mode de déplacement
|
||
Étant donné un audio-guide configuré en mode <mode>
|
||
Alors les paramètres suivants sont appliqués:
|
||
| paramètre | valeur |
|
||
| Rayon déclenchement | <rayon_declenchement> |
|
||
| Rayon tolérance "point manqué" | <rayon_tolerance> |
|
||
| Vitesse recommandée | <vitesse_recommandee> |
|
||
| Seuil warning sécurité | <seuil_warning> |
|
||
|
||
Exemples:
|
||
| mode | rayon_declenchement | rayon_tolerance | vitesse_recommandee | seuil_warning |
|
||
| Voiture | 30m | 100m | 20-50 km/h | >10 km/h |
|
||
| Vélo | 50m | 75m | 10-25 km/h | >5 km/h |
|
||
| Transport | 100m | 150m | Variable | Désactivé |
|
||
|
||
# Mode Vélo
|
||
|
||
Scénario: Déclenchement automatique avec rayon 50m (mode vélo)
|
||
Étant donné un audio-guide vélo "Circuit des châteaux de la Loire"
|
||
Et que le point GPS 3 a un rayon de 50m
|
||
Quand l'utilisateur à vélo entre à 45m du point
|
||
Alors la séquence 3 "Château de Chambord" se déclenche automatiquement
|
||
|
||
Scénario: Rayon plus large justifié pour le vélo
|
||
Étant donné qu'un cycliste roule sur piste cyclable
|
||
Et que sa vitesse varie entre 8 et 22 km/h (arrêts fréquents)
|
||
Et que le tracé est moins prévisible qu'en voiture
|
||
Quand un point GPS avec rayon 50m est défini
|
||
Alors le rayon plus large compense la variabilité de trajectoire
|
||
|
||
Scénario: Warning sécurité dès 5 km/h en vélo
|
||
Étant donné un audio-guide vélo en cours
|
||
Et que la vitesse actuelle est 12 km/h
|
||
Quand l'utilisateur clique sur [▶|] "Suivant"
|
||
Alors l'action est exécutée
|
||
Et un warning s'affiche: "⚠️ Manipulation en déplacement détecté. Pour votre sécurité, arrêtez-vous."
|
||
|
||
Plan du Scénario: Warning vélo selon la vitesse
|
||
Étant donné que la vitesse actuelle à vélo est <vitesse> km/h
|
||
Quand l'utilisateur clique sur un bouton de navigation
|
||
Alors le warning est affiché : <warning>
|
||
|
||
Exemples:
|
||
| vitesse | warning |
|
||
| 0 | Non |
|
||
| 4 | Non |
|
||
| 6 | Oui |
|
||
| 15 | Oui |
|
||
| 25 | Oui |
|
||
|
||
Scénario: Tolérance GPS moins stricte en vélo
|
||
Étant donné qu'un cycliste passe à 65m du point GPS 4
|
||
Et que le rayon de déclenchement est 50m
|
||
Et que le rayon de tolérance est 75m
|
||
Quand la distance est détectée
|
||
Alors la popup "Point manqué" s'affiche avec 3 options
|
||
Et le système tolère l'écart (trajectoire vélo moins prévisible)
|
||
|
||
Scénario: Affichage adapté au vélo
|
||
Étant donné un audio-guide vélo en cours
|
||
Quand l'interface est affichée
|
||
Alors les informations suivantes sont visibles:
|
||
| information | valeur |
|
||
| Icône mode | 🚴 |
|
||
| Distance prochain point| "450 m" |
|
||
| ETA | "≈ 2 minutes" |
|
||
| Direction | ↗️ |
|
||
| Vitesse actuelle | "18 km/h" |
|
||
| Vitesse recommandée | "10-25 km/h" |
|
||
|
||
Scénario: Cas d'usage - Piste cyclable avec arrêts fréquents
|
||
Étant donné qu'un cycliste suit un circuit nature
|
||
Et qu'il s'arrête régulièrement (feux, photos, fatigue)
|
||
Quand il s'arrête à 40m d'un point GPS (rayon 50m)
|
||
Alors la séquence se déclenche automatiquement
|
||
Et le rayon large permet le déclenchement malgré l'arrêt
|
||
|
||
Scénario: Cas d'usage - Circulation mixte piétons/vélos
|
||
Étant donné qu'un cycliste roule sur voie partagée
|
||
Et qu'il doit ralentir fréquemment pour éviter les piétons
|
||
Quand sa vitesse varie entre 5 et 20 km/h
|
||
Alors le système s'adapte avec le rayon 50m
|
||
Et le déclenchement reste fiable
|
||
|
||
# Mode Transport
|
||
|
||
Scénario: Déclenchement automatique avec rayon 100m (mode transport)
|
||
Étant donné un audio-guide transport "Ligne touristique Paris"
|
||
Et que le point GPS "Tour Eiffel" a un rayon de 100m
|
||
Quand le bus touristique entre à 85m du point
|
||
Alors la séquence "Tour Eiffel" se déclenche automatiquement
|
||
|
||
Scénario: Rayon très large justifié pour le transport
|
||
Étant donné qu'un bus touristique suit une ligne fixe
|
||
Et qu'il effectue des arrêts fréquents (stations)
|
||
Et que l'utilisateur n'a aucun contrôle sur la trajectoire
|
||
Quand un point GPS avec rayon 100m est défini
|
||
Alors le rayon large compense les arrêts et la ligne fixe
|
||
|
||
Scénario: Pas de warning sécurité en mode transport
|
||
Étant donné un audio-guide transport en cours
|
||
Et que le bus roule à 50 km/h
|
||
Quand l'utilisateur clique sur [▶|] "Suivant"
|
||
Alors l'action est exécutée immédiatement
|
||
Et aucun warning n'est affiché
|
||
Parce que l'utilisateur est passager (pas conducteur)
|
||
|
||
Scénario: Vitesse recommandée "Selon ligne"
|
||
Étant donné un audio-guide transport
|
||
Quand l'interface est affichée
|
||
Alors la vitesse recommandée indique "Selon ligne"
|
||
Et aucune valeur fixe n'est affichée (car ligne de transport varie)
|
||
|
||
Scénario: Tolérance horaire pour retards
|
||
Étant donné qu'un bus touristique est en retard de 3 minutes
|
||
Et qu'il arrive au point GPS "Musée du Louvre" avec retard
|
||
Quand il entre dans le rayon de 100m
|
||
Alors la séquence se déclenche normalement
|
||
Et le système tolère le retard (pas de pénalité temporelle)
|
||
|
||
Scénario: Tolérance spatiale très large (150m)
|
||
Étant donné qu'un bus passe à 120m du point GPS "Arc de Triomphe"
|
||
Et que le rayon de déclenchement est 100m
|
||
Et que le rayon de tolérance est 150m
|
||
Quand la distance est détectée
|
||
Alors la popup "Point manqué" s'affiche avec 3 options
|
||
|
||
Scénario: Affichage adapté au transport
|
||
Étant donné un audio-guide transport en cours
|
||
Quand l'interface est affichée
|
||
Alors les informations suivantes sont visibles:
|
||
| information | valeur |
|
||
| Icône mode | 🚌 |
|
||
| Distance prochain point| "1.2 km" |
|
||
| ETA | "≈ 3 minutes" |
|
||
| Direction | → |
|
||
| Vitesse actuelle | "35 km/h" |
|
||
| Vitesse recommandée | "Selon ligne" |
|
||
|
||
Scénario: Cas d'usage - Bus touristique hop-on hop-off
|
||
Étant donné un bus touristique "Paris Open Tour"
|
||
Et qu'il suit un circuit fixe avec 15 arrêts
|
||
Quand il approche de chaque arrêt
|
||
Alors la séquence correspondante se déclenche automatiquement
|
||
Et l'utilisateur n'a rien à faire (expérience passive)
|
||
|
||
Scénario: Cas d'usage - Train panoramique
|
||
Étant donné un train touristique "Ligne des Alpes"
|
||
Et qu'il roule à vitesse variable (20-80 km/h)
|
||
Quand il passe près de points d'intérêt
|
||
Alors les séquences se déclenchent avec rayon 100m
|
||
Et le système compense la vitesse élevée
|
||
|
||
# Comportements identiques à la voiture
|
||
|
||
Scénario: Navigation manuelle conservée (vélo et transport)
|
||
Étant donné un audio-guide en mode <mode>
|
||
Quand l'utilisateur clique sur [▶|] ou [|◀]
|
||
Alors les boutons manuels fonctionnent normalement
|
||
Et aucune vérification GPS n'est effectuée
|
||
|
||
Exemples:
|
||
| mode |
|
||
| Vélo |
|
||
| Transport |
|
||
|
||
Scénario: Affichage distance + ETA + direction (tous modes)
|
||
Étant donné un audio-guide en mode <mode>
|
||
Quand l'interface est affichée
|
||
Alors les informations distance, ETA et direction sont affichées
|
||
Et le format est identique au mode voiture
|
||
|
||
Exemples:
|
||
| mode |
|
||
| Vélo |
|
||
| Transport |
|
||
|
||
Scénario: Gestion "Point manqué" identique
|
||
Étant donné un audio-guide en mode <mode>
|
||
Quand un point GPS est manqué (dans rayon tolérance)
|
||
Alors la popup avec 3 options s'affiche:
|
||
| option |
|
||
| 🔊 Écouter quand même |
|
||
| ⏭️ Passer au suivant |
|
||
| 🔙 Faire demi-tour |
|
||
|
||
Exemples:
|
||
| mode |
|
||
| Vélo |
|
||
| Transport |
|
||
|
||
# Publicités (identique tous modes)
|
||
|
||
Plan du Scénario: Insertion publicité dans tous les modes
|
||
Étant donné un utilisateur gratuit écoute un audio-guide en mode <mode>
|
||
Quand la séquence 5 se termine (1 pub / 5 séquences)
|
||
Alors la publicité s'enchaîne automatiquement
|
||
Et elle est skippable après 5 secondes
|
||
|
||
Exemples:
|
||
| mode |
|
||
| Voiture |
|
||
| Vélo |
|
||
| Transport |
|
||
| Piéton |
|
||
|
||
# Cas d'erreur
|
||
|
||
Scénario: GPS imprécis en forêt (vélo)
|
||
Étant donné un cycliste dans une forêt dense
|
||
Et que la précision GPS est ±80m
|
||
Quand il approche d'un point GPS avec rayon 50m
|
||
Alors un avertissement s'affiche:
|
||
"""
|
||
⚠️ Signal GPS imprécis (±80m)
|
||
Le déclenchement peut être perturbé.
|
||
Utilisez les boutons manuels si nécessaire.
|
||
"""
|
||
|
||
Scénario: Bus dévié de son itinéraire (transport)
|
||
Étant donné un bus touristique avec déviation
|
||
Et que plusieurs points GPS deviennent inaccessibles
|
||
Quand l'utilisateur est informé
|
||
Alors un message s'affiche:
|
||
"""
|
||
⚠️ Itinéraire modifié
|
||
Certains points ne seront pas atteints.
|
||
Utilisez la navigation manuelle.
|
||
"""
|
||
|
||
Scénario: Changement de mode en cours de route
|
||
Étant donné un audio-guide démarré en mode "Vélo"
|
||
Quand l'utilisateur décide de continuer à pied
|
||
Et qu'il ouvre les paramètres
|
||
Alors il peut changer le mode vers "Piéton"
|
||
Et les rayons sont reconfigurés automatiquement
|
||
Et une confirmation s'affiche:
|
||
"""
|
||
Mode changé : 🚶 Piéton
|
||
Navigation manuelle activée.
|
||
"""
|
||
|
||
Scénario: Détection automatique incohérente
|
||
Étant donné qu'un utilisateur marche rapidement (7 km/h)
|
||
Et que le système détecte "Vélo" par erreur
|
||
Quand la suggestion s'affiche
|
||
Alors l'utilisateur peut cliquer sur "Changer"
|
||
Et sélectionner manuellement "Piéton"
|
||
|
||
Scénario: Batterie en mode vélo longue distance
|
||
Étant donné un circuit vélo de 50 km avec 20 séquences
|
||
Et que l'utilisateur roule pendant 3 heures
|
||
Quand la batterie atteint 15%
|
||
Alors une notification suggère:
|
||
"""
|
||
🔋 Batterie à 15%
|
||
Recommandé : activer mode économie d'énergie
|
||
(Désactive affichage continu distance)
|
||
[Activer] [Ignorer]
|
||
"""
|