feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024

Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture.

## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU)

- Créer structure features/{api,ui,e2e}
- Déplacer 83 features en 3 catégories via git mv (historique préservé)
  - features/api/ : 53 features (tests API backend)
  - features/ui/ : 22 features (tests UI mobile)
  - features/e2e/ : 8 features (tests end-to-end)

Domaines déplacés :
- API : authentication, recommendation, rgpd-compliance, content-creation,
  moderation, monetisation, premium, radio-live, publicites
- UI : audio-guides, navigation, interest-gauges, mode-offline,
  partage, profil, recherche
- E2E : abonnements, error-handling

## Phase 2 : Mise à jour Documentation

### ADR-007 - Tests BDD
- Ajouter section "Convention de Catégorisation des Features"
- Documenter règles api/ui/e2e avec exemples concrets
- Spécifier step definitions (backend Go, mobile Dart)

### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU)
- Créer ADR dédié pour stratégie CI/CD avec path filters
- Architecture workflows séparés (backend.yml, mobile.yml, shared.yml)
- Configuration path filters détaillée avec exemples YAML
- Matrice de déclenchement et optimisations (~70% gain temps CI)
- Plan d'implémentation (~2h, reporté jusqu'au développement)

### ADR-016 - Organisation Monorepo
- Simplifier en retirant section CI/CD détaillée
- Ajouter référence vers ADR-024 pour stratégie CI/CD

### INCONSISTENCIES-ANALYSIS.md
- Point #10 (Tests BDD synchronisés) :  RÉSOLU
  - Catégorisation features implémentée
  - ADR-007 mis à jour avec convention complète
- Point #11 (70/30 Split paiements) :  ANNULÉ (faux problème)
  - ADR-009 et Règle 18 parfaitement cohérents
  - Documentation exhaustive existante (formule, SQL, comparaisons)
- Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ
  - Architecture CI/CD complète dans ADR-024
  - Implémentation reportée (projet en phase documentation)
- Métriques mises à jour :
  - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté)
  - ADR à jour : 100% (19/19 avec ADR-024)

## Phase 3 : Validation

- Structure features validée (api/ui/e2e, aucun répertoire restant)
- Historique Git préservé (git mv, renommages détectés)
- 83 features total (API: 53, UI: 22, E2E: 8)

Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
jpgiannetti
2026-02-01 11:31:41 +01:00
parent 841028d1b2
commit 37c62206ad
88 changed files with 625 additions and 67 deletions

View File

@@ -0,0 +1,333 @@
# language: fr
Fonctionnalité: Création d'audio-guide multi-séquences
En tant que créateur de contenu
Je veux créer des audio-guides avec plusieurs séquences géolocalisées
Afin d'offrir des expériences guidées adaptées aux différents modes de déplacement
Contexte:
Étant donné que l'application RoadWave est démarrée
Et que le créateur "guide@example.com" est connecté
Et que son compte est vérifié
# 16.1 - Types d'audio-guides et modes de déplacement
Plan du Scénario: Détection automatique du mode selon la vitesse
Étant donné que l'utilisateur se déplace à <vitesse> km/h
Quand la vitesse est calculée sur 30 secondes
Alors le mode <mode> est suggéré automatiquement
Exemples:
| vitesse | mode |
| 3 | Piéton |
| 15 | Vélo |
| 35 | Voiture |
| 50 | Voiture |
Scénario: Suggestion de mode au démarrage avec confirmation
Étant donné qu'un audio-guide "Safari du Paugre" est disponible
Et que l'utilisateur se déplace à 35 km/h
Quand l'audio-guide démarre
Alors une popup s'affiche:
"""
Détection : 🚗 Voiture. Est-ce correct ?
[Oui] [Changer]
"""
Scénario: Changement manuel du mode détecté
Étant donné que le mode "Voiture" est suggéré automatiquement
Quand l'utilisateur clique sur "Changer"
Alors les 4 modes sont proposés:
| mode | emoji |
| Piéton | 🚶 |
| Voiture | 🚗 |
| Vélo | 🚴 |
| Transport | 🚌 |
Plan du Scénario: Caractéristiques 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 |
| Vitesse détection | <vitesse_detection> |
| Déclenchement | <declenchement> |
Exemples:
| mode | vitesse_detection | declenchement |
| Piéton | <5 km/h | Manuel (bouton Suivant) |
| Voiture | >10 km/h | Auto GPS + Manuel |
| Vélo | 5-25 km/h | Auto GPS + Manuel |
| Transport | Variable | Auto GPS + Manuel |
# 16.1.2 - Création d'un audio-guide (côté créateur)
Scénario: Accès au formulaire de création d'audio-guide
Étant donné que le créateur est sur son dashboard
Quand il clique sur "Créer un audio-guide"
Alors le formulaire de création s'affiche
Et le wizard guidé en 4 étapes est visible:
| étape | description |
| 1 | Infos générales |
| 2 | Ajout séquences |
| 3 | Preview carte |
| 4 | Validation modération |
Scénario: Étape 1 - Informations générales obligatoires
Étant donné que le créateur est sur l'étape 1 du wizard
Quand il complète le formulaire
Alors les champs suivants sont obligatoires:
| champ | contrainte |
| Titre | 5-100 caractères |
| Description | 10-500 caractères |
| Mode de déplacement | Choix parmi 4 |
| Tags | 1-3 tags |
| Classification âge | Tout public/13+/16+/18+ |
Scénario: Sélection du mode de déplacement
Étant donné que le créateur crée un audio-guide
Quand il sélectionne le mode "🚗 Voiture (GPS auto + manuel)"
Alors le champ "Vitesse recommandée" s'affiche
Et la plage suggérée est "30-50 km/h"
Scénario: Validation du titre
Étant donné que le créateur entre un titre
Quand le titre contient moins de 5 caractères
Alors un message d'erreur "Minimum 5 caractères" s'affiche
Et le bouton "Suivant" est désactivé
Scénario: Validation de la description
Étant donné que le créateur entre une description
Quand la description contient 520 caractères
Alors un message d'erreur "Maximum 500 caractères" s'affiche
Et les 20 caractères en trop sont surlignés en rouge
Scénario: Étape 2 - Ajout de la première séquence
Étant donné que le créateur est sur l'étape 2 "Ajout séquences"
Quand il clique sur "Ajouter séquence"
Alors le formulaire de séquence s'affiche avec:
| champ | requis | note |
| Titre séquence | | 5-80 caractères |
| Audio | | Upload MP3/AAC, max 200 MB |
| Point GPS | * | *Sauf mode piéton |
| Rayon déclenchement | * | *Sauf mode piéton, 10-200m |
Scénario: Ajout du point GPS pour une séquence
Étant donné que le créateur ajoute une séquence en mode "Voiture"
Quand il clique sur "📍 Ajouter point GPS"
Alors une carte s'affiche
Et il peut:
| action |
| Cliquer sur la carte |
| Entrer coordonnées manuelles |
| Utiliser sa position actuelle |
Scénario: Configuration du rayon de déclenchement avec preview
Étant donné qu'un point GPS est défini à (43.1234, 2.5678)
Quand le créateur ajuste le curseur de rayon
Alors le rayon varie de 10m à 200m
Et un cercle visuel est affiché sur la carte
Et la valeur actuelle s'affiche "30m"
Plan du Scénario: Rayon par défaut selon le mode
Étant donné un audio-guide en mode <mode>
Quand le créateur ajoute un point GPS
Alors le rayon par défaut est <rayon_defaut>
Exemples:
| mode | rayon_defaut |
| Voiture | 30m |
| Vélo | 50m |
| Transport | 100m |
Scénario: Suggestion intelligente du rayon
Étant donné un audio-guide en mode "Voiture" avec vitesse recommandée 30 km/h
Quand le créateur ajoute un point GPS
Alors une suggestion s'affiche: "Recommandé : 30m pour voiture à 30 km/h"
Scénario: Upload audio pour une séquence
Étant donné que le créateur crée une séquence "Introduction"
Quand il upload un fichier audio de 5 MB
Alors le fichier est vérifié:
| vérification | règle |
| Format | MP3, AAC, M4A |
| Taille max | 200 MB |
| Durée max | 15 minutes |
Scénario: Ordre des séquences modifiable
Étant donné un audio-guide avec 5 séquences:
| ordre | titre |
| 1 | Introduction |
| 2 | Les lions |
| 3 | Les girafes |
| 4 | Les éléphants |
| 5 | Conclusion |
Quand le créateur glisse "Les éléphants" en position 2
Alors l'ordre devient:
| ordre | titre |
| 1 | Introduction |
| 2 | Les éléphants |
| 3 | Les lions |
| 4 | Les girafes |
| 5 | Conclusion |
Scénario: Nombre minimum de séquences requis
Étant donné un audio-guide avec seulement 1 séquence
Quand le créateur tente de passer à l'étape suivante
Alors un message d'erreur s'affiche: "Minimum 2 séquences requis"
Et le bouton "Suivant" est désactivé
Scénario: Nombre maximum de séquences
Étant donné un audio-guide avec 50 séquences
Quand le créateur tente d'ajouter une 51ème séquence
Alors un message d'erreur s'affiche: "Maximum 50 séquences par audio-guide"
Et le bouton "+ Ajouter séquence" est désactivé
Scénario: Étape 3 - Preview carte avec tracé et points
Étant donné un audio-guide avec 5 séquences géolocalisées
Quand le créateur accède à l'étape 3 "Preview carte"
Alors une carte Leaflet s'affiche
Et les éléments suivants sont visibles:
| élément | description |
| Markers numérotés | 1, 2, 3, 4, 5 sur chaque point |
| Tracé entre points | Ligne pointillée connectant les points |
| Cercles de déclenchement | Rayon visuel autour de chaque point |
Scénario: Statistiques du parcours
Étant donné un audio-guide avec les séquences suivantes:
| séquence | durée | distance_au_suivant |
| 1 | 2:15 | 150m |
| 2 | 3:42 | 200m |
| 3 | 4:10 | 320m |
Quand les statistiques sont calculées
Alors le résumé suivant est affiché:
| métrique | valeur |
| Séquences | 3 complètes |
| Durée totale | 10:07 |
| Distance totale | 670m |
Scénario: Modification d'une séquence depuis la carte
Étant donné que la preview carte est affichée
Quand le créateur clique sur le marker "2"
Alors une popup s'affiche avec:
| information |
| Titre: "Les lions" |
| Durée: 3:42 |
| Rayon: 30m |
| [ Modifier] |
| [🗑 Supprimer] |
Scénario: Zone de diffusion géographique
Étant donné un audio-guide avec des points dans Paris
Quand le créateur définit la zone de diffusion
Alors il peut choisir:
| type | exemple |
| Polygon | Tracé manuel sur carte |
| Ville | Paris (API Nominatim) |
| Département | 75 - Paris |
| Région | Île-de-France |
Scénario: Étape 4 - Publication et validation modération
Étant donné un créateur qui publie ses 3 premiers audio-guides
Quand il clique sur " Publier audio-guide"
Alors un message s'affiche:
"""
Votre audio-guide est en cours de validation.
Notre équipe le vérifiera sous 24-48h.
Vous recevrez une notification dès validation.
"""
Scénario: Publication directe pour créateurs expérimentés
Étant donné un créateur ayant publié 5 audio-guides validés
Et aucun strike actif
Quand il publie un nouvel audio-guide
Alors l'audio-guide est publié immédiatement
Et il devient visible pour les utilisateurs
Et aucune validation manuelle n'est requise
Scénario: Mode piéton sans points GPS obligatoires
Étant donné un audio-guide en mode "🚶 Piéton"
Quand le créateur ajoute une séquence
Alors le champ "Point GPS" est optionnel
Et le champ "Rayon déclenchement" est masqué
Et un message info s'affiche: "Mode manuel : les séquences se déclenchent au clic utilisateur"
Scénario: Sauvegarde brouillon automatique
Étant donné que le créateur édite un audio-guide depuis 5 minutes
Quand il ajoute une nouvelle séquence
Alors l'audio-guide est sauvegardé en brouillon automatiquement
Et un toast "Brouillon sauvegardé" s'affiche brièvement
Scénario: Reprise d'un brouillon
Étant donné un audio-guide en brouillon "Safari du Paugre"
Et qu'il contient 3 séquences complètes
Quand le créateur retourne sur son dashboard
Alors le brouillon est visible avec le statut "📝 Brouillon"
Et un bouton "Continuer" est disponible
Et la progression "3/5 séquences" est affichée
Scénario: Suppression d'un brouillon
Étant donné un audio-guide en brouillon
Quand le créateur clique sur "🗑 Supprimer"
Alors une confirmation s'affiche:
"""
Supprimer ce brouillon ?
Toutes les séquences seront perdues.
[Annuler] [Supprimer définitivement]
"""
Scénario: Modification d'un audio-guide publié
Étant donné un audio-guide publié "Safari du Paugre"
Quand le créateur clique sur " Modifier"
Alors il peut modifier:
| élément modifiable | élément non modifiable |
| Titre | Mode de déplacement |
| Description | Points GPS |
| Tags | Rayons déclenchement |
| Séquences (ordre) | |
Et un avertissement s'affiche: "Les modifications structurelles nécessitent une nouvelle publication"
Scénario: Duplication d'un audio-guide existant
Étant donné un audio-guide publié "Visite Paris"
Quand le créateur clique sur "📋 Dupliquer"
Alors une copie est créée avec le titre "Visite Paris (copie)"
Et toutes les séquences sont copiées
Et le statut est "📝 Brouillon"
Et le créateur peut modifier avant publication
# Cas d'erreur
Scénario: Upload audio échoue (format non supporté)
Étant donné que le créateur upload un fichier "audio.wav"
Quand le format est vérifié
Alors un message d'erreur s'affiche: "Format non supporté. Utilisez MP3, AAC ou M4A"
Et le fichier est rejeté
Scénario: Upload audio échoue (taille trop grande)
Étant donné que le créateur upload un fichier de 250 MB
Quand la taille est vérifiée
Alors un message d'erreur s'affiche: "Fichier trop volumineux. Maximum 200 MB"
Et le fichier est rejeté
Scénario: Points GPS trop éloignés (alerte cohérence)
Étant donné un audio-guide en mode "Piéton"
Et une séquence au Louvre (Paris)
Quand le créateur ajoute une séquence à Lyon
Alors un avertissement s'affiche:
"""
Attention : distance importante entre points (465 km)
Vérifiez que le mode "Piéton" est approprié.
[Modifier le mode] [Continuer]
"""
Scénario: Pas de connexion lors de la sauvegarde
Étant donné que le créateur édite un audio-guide
Et que la connexion réseau est perdue
Quand il tente de sauvegarder
Alors le brouillon est sauvegardé localement
Et un message s'affiche: "Sauvegarde locale. Sera synchronisée à la reconnexion"
Et une icône " Hors ligne" s'affiche
Scénario: Reprise après perte de connexion
Étant donné un brouillon sauvegardé localement
Quand la connexion réseau est rétablie
Alors le brouillon est synchronisé automatiquement
Et un toast " Audio-guide synchronisé" s'affiche

View File

@@ -0,0 +1,349 @@
# language: fr
Fonctionnalité: Intégration audio-guides avec autres fonctionnalités
En tant qu'utilisateur
Je veux utiliser les audio-guides avec toutes les fonctionnalités de l'app
Afin d'avoir une expérience complète et cohérente
Contexte:
Étant donné que l'application RoadWave est démarrée
Et que l'utilisateur "jean@example.com" est connecté
# 16.14 - Téléchargement offline
Scénario: Téléchargement complet d'un audio-guide
Étant donné un audio-guide "Visite du Louvre" avec 12 séquences
Quand l'utilisateur clique sur " Télécharger pour écouter hors ligne"
Alors toutes les 12 séquences sont téléchargées
Et les métadonnées (titres, descriptions, GPS) sont sauvegardées
Et les images (cover, miniatures) sont mises en cache
Scénario: Affichage de la progression du téléchargement
Étant donné qu'un téléchargement d'audio-guide est en cours
Quand l'utilisateur consulte l'état
Alors la progression s'affiche:
"""
Téléchargement en cours...
Séquence 7/12 245 MB / 380 MB
64%
"""
Scénario: Téléchargement uniquement en WiFi (par défaut)
Étant donné que l'option "Télécharger uniquement en WiFi" est activée
Quand l'utilisateur lance un téléchargement sur réseau mobile
Alors un avertissement s'affiche:
"""
Téléchargement nécessite WiFi
Cet audio-guide pèse 380 MB.
[Attendre WiFi] [Télécharger quand même]
"""
Scénario: Gestion de l'espace de stockage
Étant donné que l'appareil a 500 MB d'espace libre
Et qu'un audio-guide pèse 380 MB
Quand l'utilisateur lance le téléchargement
Alors un avertissement s'affiche:
"""
Espace de stockage limité
Après téléchargement : 120 MB restants
[Continuer] [Gérer stockage] [Annuler]
"""
Scénario: Liste des audio-guides téléchargés
Étant donné que l'utilisateur a téléchargé 3 audio-guides
Quand il accède à "Bibliothèque > Téléchargés"
Alors il voit:
| audio_guide | taille | date_telechargement |
| Visite du Louvre | 380 MB | 2026-01-20 |
| Safari du Paugre | 245 MB | 2026-01-18 |
| Circuit Loire à Vélo | 520 MB | 2026-01-15 |
Scénario: Lecture hors connexion complète
Étant donné qu'un audio-guide est téléchargé
Et que l'utilisateur active le mode avion
Quand il lance l'audio-guide
Alors toutes les séquences sont lisibles
Et les métadonnées sont accessibles
Et les images s'affichent normalement
Et la progression est sauvegardée localement
Scénario: GPS fonctionne en mode avion (mode voiture)
Étant donné qu'un audio-guide voiture est téléchargé
Et que le mode avion est activé (avec GPS actif)
Quand l'utilisateur se déplace
Alors les déclenchements GPS fonctionnent normalement
Et la distance/ETA sont calculés
Parce que le GPS ne nécessite pas de connexion internet
Scénario: Suppression d'audio-guide téléchargé
Étant donné qu'un audio-guide téléchargé pèse 380 MB
Quand l'utilisateur clique sur "🗑 Supprimer téléchargement"
Alors une confirmation s'affiche
Et si confirmé, les 380 MB sont libérés
Et l'audio-guide reste accessible en streaming
Scénario: Mise à jour automatique si nouvelle version
Étant donné qu'un audio-guide téléchargé a été mis à jour par le créateur
Quand l'utilisateur se connecte en WiFi
Alors une notification s'affiche:
"""
🔄 Mise à jour disponible
"Visite du Louvre" - Nouvelle version
[Mettre à jour] [Plus tard]
"""
# 16.15 - Playlists et collections
Scénario: Ajout d'audio-guide à une playlist
Étant donné que l'utilisateur consulte un audio-guide
Quand il clique sur " Ajouter à une playlist"
Alors ses playlists s'affichent:
| playlist |
| 🗺 Voyages en France |
| 🏛 Musées parisiens |
| + Créer nouvelle playlist |
Scénario: Comportement audio-guide dans une playlist
Étant donné une playlist contenant 2 audio-guides et 1 podcast
Quand la lecture atteint un audio-guide
Alors l'audio-guide démarre à la séquence 1 (ou progression sauvegardée)
Et les séquences se jouent normalement
Quand l'audio-guide se termine (dernière séquence)
Alors le contenu suivant de la playlist démarre
Scénario: Audio-guide marqué comme "Favori"
Étant donné qu'un utilisateur aime un audio-guide
Quand il clique sur " Ajouter aux favoris"
Alors l'audio-guide est ajouté à la section "Favoris"
Et il est facilement accessible depuis le menu principal
Scénario: Collections thématiques d'audio-guides
Étant donné que RoadWave propose des collections éditoriales
Quand l'utilisateur accède à "Collections"
Alors il voit des collections comme:
| collection | nombre_audio_guides |
| 🏛 Musées de France | 12 |
| 🦁 Parcs animaliers | 8 |
| 🚴 Circuits vélo | 15 |
| 🚗 Routes touristiques | 10 |
# 16.16 - Partage d'audio-guide
Scénario: Bouton partager sur page audio-guide
Étant donné qu'un utilisateur consulte un audio-guide
Quand il clique sur " Partager"
Alors le menu de partage natif s'ouvre
Et le lien généré est "https://roadwave.fr/share/ag/louvre_123"
Scénario: Page web de partage pour audio-guide
Étant donné qu'un lien d'audio-guide partagé est ouvert sur le web
Quand la page se charge
Alors elle affiche:
| élément | exemple |
| Cover image 16:9 | Photo du Louvre |
| Titre | "Visite du Louvre" |
| Créateur | "@art_guide " |
| Badge type | "🎧 Audio-guide 12 séquences" |
| Durée totale | "45 minutes" |
| Mode | "🚶 Piéton" |
| Description | Texte complet |
| Preview séquence 1 | Player HTML5 (séquence intro) |
| Carte avec points GPS | Leaflet avec 12 markers |
| CTA téléchargement | Boutons App Store / Google Play |
Scénario: Deep link vers audio-guide spécifique
Étant donné que l'app est installée
Et qu'un lien "https://roadwave.fr/share/ag/louvre_123" est cliqué
Quand le système détecte l'app
Alors l'app s'ouvre directement sur l'audio-guide
Et l'utilisateur peut démarrer immédiatement
Scénario: Partage avec séquence spécifique
Étant donné qu'un utilisateur est sur la séquence 5 "La Joconde"
Quand il partage l'audio-guide
Alors le lien généré est "https://roadwave.fr/share/ag/louvre_123?seq=5"
Et le destinataire est dirigé vers la séquence 5 directement
# 16.17 - Notations et commentaires
Scénario: Note globale de l'audio-guide
Étant donné qu'un utilisateur termine un audio-guide
Quand la dernière séquence se termine
Alors une popup de notation s'affiche:
"""
Comment avez-vous trouvé cet audio-guide ?
[Ajouter un commentaire (optionnel)]
"""
Scénario: Note moyenne affichée sur la page
Étant donné qu'un audio-guide a reçu 150 notes
Et que la moyenne est 4.3/5
Quand la page est affichée
Alors la note " 4.3 (150 avis)" est visible
Scénario: Commentaires triés par pertinence
Étant donné qu'un audio-guide a 50 commentaires
Quand l'utilisateur consulte les avis
Alors les commentaires sont triés par défaut selon:
| critère | poids |
| Note élevée | 30% |
| Récent | 30% |
| Likes reçus | 40% |
Scénario: Réponse du créateur aux commentaires
Étant donné qu'un utilisateur laisse un commentaire négatif
Quand le créateur consulte son dashboard
Alors il peut répondre au commentaire
Et sa réponse apparaît en dessous avec badge "Créateur"
# 16.18 - Recommandations intelligentes
Scénario: Audio-guides similaires recommandés
Étant donné qu'un utilisateur termine "Visite du Louvre"
Quand il consulte les recommandations
Alors l'algorithme suggère des audio-guides basés sur:
| critère | exemple |
| Tags similaires | #Art #Histoire #Musée |
| Créateur identique | Autres audio-guides de @art_guide |
| Localisation proche | Autres musées parisiens |
| Mode de déplacement | Autres audio-guides piéton |
Scénario: Suggestion géographique contextuelle
Étant donné qu'un utilisateur est à Paris (GPS détecté)
Quand il ouvre l'onglet "Audio-guides"
Alors les audio-guides parisiens sont mis en avant
Et un filtre "🗺 Autour de moi" est pré-appliqué
Scénario: Badge "Populaire dans votre région"
Étant donné qu'un audio-guide a >100 écoutes dans la région Île-de-France
Et que l'utilisateur est en Île-de-France
Quand l'audio-guide est affiché
Alors un badge "🔥 Populaire près de chez vous" est visible
# 16.19 - Optimisations techniques
Scénario: Préchargement de la séquence suivante
Étant donné que la séquence 3 est en cours à 2:30/3:42
Quand il reste 60 secondes de lecture
Alors la séquence 4 est préchargée en arrière-plan
Et la transition est instantanée (0 latence)
Scénario: Buffer adaptatif selon connexion
Étant donné qu'un utilisateur est sur réseau 4G
Quand la séquence démarre
Alors 30 secondes d'audio sont bufferisées initialement
Et le buffering continue en arrière-plan
Plan du Scénario: Buffer selon qualité réseau
Étant donné qu'un utilisateur est sur réseau <reseau>
Quand une séquence démarre
Alors <buffer_secondes> secondes sont bufferisées
Exemples:
| reseau | buffer_secondes |
| WiFi | 60 |
| 5G | 45 |
| 4G | 30 |
| 3G | 20 |
Scénario: Compression audio adaptative
Étant donné qu'un utilisateur est sur connexion lente (3G)
Quand une séquence est streamée
Alors le CDN sert la version 64 kbps (au lieu de 128 kbps)
Et la qualité reste acceptable pour la voix
Scénario: Cache intelligent des séquences jouées
Étant donné qu'un utilisateur a écouté les séquences 1-5
Quand il clique sur "Précédent" pour réécouter la séquence 4
Alors la séquence 4 est chargée depuis le cache local
Et le chargement est instantané (pas de stream)
Scénario: Nettoyage automatique du cache
Étant donné que le cache audio occupe 500 MB
Et que la limite configurée est 300 MB
Quand le nettoyage automatique s'exécute
Alors les séquences les plus anciennes (non téléchargées) sont supprimées
Et le cache revient à 280 MB
# 16.20 - Analytics et tracking
Scénario: Tracking des événements clés
Étant donné qu'un utilisateur écoute un audio-guide
Quand il interagit avec l'application
Alors les événements suivants sont trackés:
| événement | données |
| audio_guide_started | audio_guide_id, mode, user_id |
| sequence_completed | sequence_id, completion_rate, duration |
| audio_guide_completed | audio_guide_id, total_time, sequences_count|
| point_gps_triggered | point_id, distance, auto_or_manual |
| point_gps_missed | point_id, distance, action_taken |
| paywall_displayed | audio_guide_id, sequence_number |
| premium_conversion | source: audio_guide_paywall |
Scénario: Heatmap des abandons par séquence
Étant donné qu'un audio-guide a été écouté 1000 fois
Quand le créateur consulte la heatmap
Alors il voit pour chaque séquence:
| sequence | starts | completions | abandon_rate |
| 1 | 1000 | 950 | 5% |
| 2 | 950 | 920 | 3% |
| 3 | 920 | 850 | 8% |
| ... | ... | ... | ... |
| 12 | 650 | 580 | 11% |
Scénario: Attribution GPS auto vs manuel
Étant donné un audio-guide voiture avec 8 points GPS
Quand les statistiques sont calculées
Alors le créateur voit:
| mode_declenchement | nombre |
| GPS automatique | 542 |
| Manuel | 123 |
| Point manqué | 89 |
# Cas d'erreur et edge cases
Scénario: Audio-guide avec une seule séquence (edge case)
Étant donné un audio-guide avec seulement 1 séquence
Quand il est publié
Alors un avertissement s'affiche:
"""
Un audio-guide doit contenir au minimum 2 séquences
Ajoutez au moins 1 séquence supplémentaire avant publication
"""
Scénario: Séquence manquante ou corrompue
Étant donné qu'une séquence 5 a un fichier audio corrompu
Quand l'utilisateur tente de la lire
Alors un message d'erreur s'affiche
Et un bouton " Passer à la suivante" est disponible
Et le créateur reçoit une notification de l'erreur
Scénario: GPS désactivé puis réactivé en cours de route
Étant donné un audio-guide voiture en cours
Et que l'utilisateur désactive le GPS
Quand il le réactive 10 minutes plus tard
Alors le déclenchement automatique reprend
Et les points GPS manqués entre-temps ne déclenchent pas de popup
Scénario: Modification d'audio-guide avec utilisateurs en cours
Étant donné qu'un audio-guide a 50 utilisateurs en cours d'écoute
Quand le créateur modifie une séquence
Alors les utilisateurs actuels conservent l'ancienne version
Et les nouveaux utilisateurs obtiennent la nouvelle version
Et un message informe les utilisateurs lors de la prochaine ouverture
Scénario: Suppression d'audio-guide par le créateur
Étant donné qu'un audio-guide a 20 utilisateurs avec progression
Quand le créateur supprime l'audio-guide
Alors une confirmation stricte est demandée
Et si confirmé, les progressions utilisateurs sont archivées (30 jours)
Et l'audio-guide devient inaccessible
Scénario: Signalement d'audio-guide pour contenu inapproprié
Étant donné qu'un utilisateur signale un audio-guide
Quand le signalement est modéré
Et jugé valide
Alors l'audio-guide est dépublié temporairement
Et le créateur reçoit une notification d'explication
Et il peut corriger puis republier

View File

@@ -0,0 +1,243 @@
# 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)

View File

@@ -0,0 +1,400 @@
# language: fr
Fonctionnalité: Audio-guide mode voiture (GPS automatique)
En tant qu'utilisateur en voiture
Je veux que les séquences se déclenchent automatiquement selon ma position GPS
Afin de profiter d'une expérience guidée hands-free
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 voiture "Safari du Paugre" est disponible avec 8 séquences
Et que le GPS est activé
# 16.3.1 - Déclenchement et contrôles
Scénario: Distinction audio-guides vs contenus géolocalisés simples
Étant donné que l'utilisateur est en mode voiture
Quand il écoute un contenu géolocalisé simple (1 séquence unique)
Alors une notification avec compteur 71 est affichée 7s avant le point
Et il doit valider avec "Suivant" + décompte 5s
Et ce contenu compte 1/6 dans le quota horaire
Quand il démarre un audio-guide multi-séquences
Alors les séquences se déclenchent au point GPS exact (rayon 30m)
Et aucun compteur 7s n'est affiché (juste notification "Ding" + toast 2s)
Et l'audio-guide entier compte 1/6 dans le quota
Scénario: Démarrage automatique au premier point GPS
Étant donné que l'utilisateur démarre l'audio-guide "Safari du Paugre"
Et que le point de départ est à (43.1234, 2.5678) avec rayon 30m
Quand l'utilisateur entre dans le rayon de 30m
Alors la séquence 1 "Introduction - Point d'accueil" démarre automatiquement
Et une notification sonore "Ding" est jouée (non intrusif)
Et un toast s'affiche brièvement pendant 2s: "Introduction - Point d'accueil"
Et aucun compteur 71 n'est affiché (contrairement aux contenus géolocalisés simples)
Scénario: Déclenchement automatique séquence suivante
Étant donné que la séquence 1 est terminée
Et que l'utilisateur se déplace vers le point GPS 2 (43.1245, 2.5690)
Quand l'utilisateur entre dans le rayon de 30m du point 2
Alors la séquence 2 "Enclos des lions" démarre automatiquement
Et une notification "Ding" + toast "Enclos des lions" s'affiche
Scénario: Navigation manuelle conservée (bouton Suivant actif)
Étant donné que la séquence 1 est en cours
Et que l'utilisateur est encore loin du point GPS 2 (distance 500m)
Quand l'utilisateur clique sur [|] "Suivant"
Alors la séquence 2 démarre immédiatement
Et aucune vérification GPS n'est effectuée
Scénario: Navigation manuelle conservée (bouton Précédent actif)
Étant donné que la séquence 3 est en cours
Quand l'utilisateur clique sur [|] "Précédent"
Alors la séquence 2 démarre depuis le début
Et aucune vérification GPS n'est effectuée
Scénario: Tous les boutons de contrôle restent actifs
Étant donné qu'un audio-guide voiture est en cours
Quand l'utilisateur consulte les contrôles
Alors les boutons suivants sont actifs:
| bouton | état | comportement |
| [\|] Suivant | | Passe séquence suivante immédiate |
| [\|] Précédent | | Retour séquence précédente |
| [] Pause | | Pause temporaire |
| [📋] Liste | | Saut direct possible |
Scénario: Use case - Embouteillage (séquence finie, point GPS loin)
Étant donné que la séquence 3 "Enclos des girafes" est terminée
Et que le point GPS 4 est à 2 km de distance (embouteillage)
Quand l'utilisateur clique manuellement sur [|] "Suivant"
Alors la séquence 4 démarre immédiatement
Et l'utilisateur peut continuer l'expérience sans attendre d'atteindre le point GPS
Scénario: Use case - Route fermée (point GPS inaccessible)
Étant donné que le point GPS 5 est sur une route fermée
Et que l'utilisateur ne peut pas s'en approcher
Quand l'utilisateur clique sur [|] "Suivant"
Alors la séquence 5 démarre quand même
Et l'audio-guide continue normalement
Scénario: Use case - Passager manipule l'application
Étant donné que l'utilisateur est passager (non conducteur)
Et que la vitesse du véhicule est 45 km/h
Quand le passager clique sur [|] "Suivant"
Alors la séquence suivante démarre
Et un avertissement s'affiche pendant 3 secondes
Scénario: Avertissement sécurité si vitesse >10 km/h
Étant donné que la vitesse actuelle est 35 km/h
Quand l'utilisateur clique sur un bouton (Suivant ou Précédent)
Alors l'action est exécutée immédiatement (pas de blocage)
Et un toast s'affiche pendant 3 secondes:
"""
Manipulation en conduite détectée.
Pour votre sécurité, demandez à un passager.
"""
Plan du Scénario: Avertissement selon la vitesse
Étant donné que la vitesse actuelle est <vitesse> km/h
Quand l'utilisateur clique sur un bouton de navigation
Alors l'avertissement est affiché : <avertissement>
Exemples:
| vitesse | avertissement |
| 5 | Non |
| 10 | Non |
| 11 | Oui |
| 35 | Oui |
| 90 | Oui |
# 16.3.2 - Affichage distance et guidage
Scénario: Affichage entre deux séquences avec progress bar
Étant donné que la séquence 2 "Les lions" vient de se terminer
Et que le prochain point GPS 3 "Enclos des girafes" est à 500m
Quand l'interface bascule en mode "attente prochain point"
Alors l'écran affiche:
| élément | description |
| Statut séquence | " Séquence 2/8 terminée" |
| Nom séquence | "Les lions" |
| Progress bar | Barre dynamique remplie selon distance (0%) |
| Distance prochain point| "500 mètres" |
| ETA | " 1 minute 30" |
| Direction | |
| Vitesse actuelle | "28 km/h" |
| Bouton "Rejouer séq." | Permet de réécouter la séquence qui vient de finir |
Scénario: Progress bar dynamique vers le prochain point
Étant donné que la distance initiale vers le prochain point était 500m
Et que la séquence précédente est terminée
Quand l'utilisateur se rapproche du prochain point
Et que la distance actuelle est 175m
Alors la progress bar affiche "65%" remplie
Et le calcul est: 100 - (175 / 500 * 100) = 65%
Et la barre se met à jour chaque seconde
Scénario: Bouton "Rejouer séq." pour réécouter
Étant donné que la séquence 3 vient de se terminer
Et que l'interface "attente prochain point" est affichée
Quand l'utilisateur clique sur [ Rejouer séq.]
Alors la séquence 3 redémarre depuis 0:00
Et l'utilisateur peut la réécouter (utile si distraction)
Scénario: Interface en conduite avec distance et ETA
Étant donné que la séquence 2 est en cours
Et que le prochain point GPS 3 "Enclos des girafes" est à 320m
Et que la vitesse actuelle est 28 km/h
Quand l'interface est affichée
Alors les informations suivantes sont visibles:
| information | valeur |
| Nom prochain point | "Enclos des girafes" |
| Distance | "320 mètres" |
| ETA | " 40 secondes" |
| Direction | (flèche direction) |
| Vitesse actuelle | "28 km/h" |
| Vitesse recommandée | "20-30 km/h" |
Scénario: Mise à jour de la distance en temps réel
Étant donné que la distance au prochain point est 500m
Quand 10 secondes s'écoulent et que l'utilisateur se rapproche
Alors la distance est mise à jour chaque seconde
Et la nouvelle distance "450m" s'affiche
Scénario: Mise à jour de l'ETA en temps réel
Étant donné que l'ETA est " 2 minutes"
Et que la vitesse est constante à 30 km/h
Quand l'utilisateur se rapproche du point
Alors l'ETA est recalculé chaque seconde
Et il diminue progressivement: " 1 minute 50", " 1 minute 40", etc.
Plan du Scénario: Format d'affichage de la distance
Étant donné que la distance au prochain point est <distance_metres>
Quand l'interface est mise à jour
Alors la distance affichée est "<affichage>"
Exemples:
| distance_metres | affichage |
| 50 | 50 m |
| 320 | 320 m |
| 980 | 980 m |
| 1200 | 1.2 km |
| 5400 | 5.4 km |
Plan du Scénario: Format d'affichage de l'ETA
Étant donné que l'ETA calculé est <secondes> secondes
Quand l'interface est mise à jour
Alors l'ETA affiché est "<affichage>"
Exemples:
| secondes | affichage |
| 30 | 30 secondes |
| 75 | 1 minute |
| 150 | 2 minutes |
| 400 | 6 minutes |
Scénario: Calcul de la direction (flèche 8 directions)
Étant donné que la position actuelle est (43.1234, 2.5678)
Et que le prochain point est au nord-est (angle 45°)
Quand la direction est calculée
Alors la flèche "" est affichée
Plan du Scénario: Flèches de direction selon l'angle
Étant donné que l'angle vers le prochain point est <angle>°
Quand la direction est calculée
Alors la flèche "<fleche>" est affichée
Exemples:
| angle | fleche |
| 0 | |
| 45 | |
| 90 | |
| 135 | |
| 180 | |
| 225 | |
| 270 | |
| 315 | |
Scénario: Mise à jour de la direction toutes les 5 secondes
Étant donné que la direction actuelle est (nord)
Et que l'utilisateur tourne vers l'est
Quand 5 secondes s'écoulent
Alors la direction est recalculée
Et la nouvelle flèche (nord-est) s'affiche
Scénario: Message "En attente de déplacement" si vitesse <5 km/h
Étant donné que la vitesse actuelle est 2 km/h (arrêté)
Quand l'ETA est calculé
Alors le message "En attente de déplacement" s'affiche
Et l'ETA n'est pas calculé (car vitesse insuffisante)
Scénario: Simplicité de l'interface (pas de carte miniature)
Étant donné qu'un audio-guide voiture est en cours
Quand l'interface est affichée
Alors aucune carte miniature n'est présente
Et seuls les éléments essentiels sont affichés:
| élément |
| Distance |
| ETA |
| Direction (flèche) |
| Vitesse |
| Contrôles audio |
# 16.3.3 - Rayon de déclenchement et tolérance
Scénario: Rayon de déclenchement par défaut en mode voiture
Étant donné un audio-guide voiture
Quand un point GPS est défini
Alors le rayon de déclenchement est 30 mètres par défaut
Et le rayon de tolérance "point manqué" est 100 mètres
Scénario: Déclenchement dans le rayon (30m)
Étant donné que le point GPS 3 est défini avec rayon 30m
Quand l'utilisateur entre à 25m du point
Alors la séquence 3 se déclenche automatiquement
Scénario: Pas de déclenchement hors rayon
Étant donné que le point GPS 3 a un rayon de 30m
Quand l'utilisateur passe à 45m du point
Alors la séquence 3 ne se déclenche pas automatiquement
Scénario: Point manqué dans rayon de tolérance (100m)
Étant donné que l'utilisateur passe à 60m du point GPS 4 (hors rayon 30m)
Et que 60m < 100m (rayon tolérance)
Quand le point est détecté comme manqué
Alors un toast s'affiche: "⚠️ Point manqué : Enclos des éléphants"
Et une popup s'affiche pendant 5 secondes avec 3 options
Scénario: Popup "Point manqué" avec 3 actions
Étant donné qu'un point GPS a été manqué (distance 60m)
Quand la popup s'affiche
Alors les options suivantes sont disponibles:
| bouton | icône | comportement |
| Écouter quand même | 🔊 | Lance séquence immédiatement (même hors zone) |
| Passer au suivant | ⏭️ | Skip séquence, continue vers prochain point |
| Faire demi-tour | 🔙 | Ouvre GPS externe (Google Maps/Waze) vers point |
Scénario: Action "Écouter quand même"
Étant donné qu'un point GPS est manqué
Quand l'utilisateur clique sur "🔊 Écouter quand même"
Alors la séquence correspondante démarre immédiatement
Et l'utilisateur peut continuer sa route
Scénario: Action "Passer au suivant"
Étant donné qu'un point GPS 5 est manqué
Quand l'utilisateur clique sur "⏭️ Passer au suivant"
Alors la séquence 5 est ignorée (non écoutée)
Et l'application attend le point GPS 6
Et la distance vers le point 6 s'affiche
Scénario: Action "Faire demi-tour"
Étant donné qu'un point GPS est manqué à (43.1250, 2.5700)
Quand l'utilisateur clique sur "🔙 Faire demi-tour"
Alors l'application détecte l'app GPS installée (Google Maps ou Waze)
Et ouvre la navigation GPS externe vers (43.1250, 2.5700)
Scénario: Point manqué au-delà du rayon de tolérance (>100m)
Étant donné que l'utilisateur passe à 150m du point GPS 6
Quand la distance est détectée
Alors aucune popup ne s'affiche (point trop loin)
Et l'utilisateur peut naviguer manuellement avec [|]
Plan du Scénario: Gestion selon la distance au point
Étant donné un point GPS avec rayon 30m et tolérance 100m
Quand l'utilisateur passe à <distance> du point
Alors le comportement est <comportement>
Exemples:
| distance | comportement |
| 20m | Déclenchement automatique séquence |
| 40m | Rien (hors rayon, pas encore tolérance) |
| 60m | Popup "Point manqué" avec 3 options |
| 110m | Rien (trop loin, hors tolérance) |
Scénario: Configuration rayon personnalisé par le créateur
Étant donné qu'un créateur définit un rayon de 50m (au lieu de 30m)
Quand un utilisateur entre à 45m du point
Alors la séquence se déclenche automatiquement
Et le rayon personnalisé est respecté
Scénario: Rayon minimum et maximum configurables
Étant donné qu'un créateur configure un rayon
Quand il ajuste le curseur
Alors les valeurs disponibles sont de 10m à 200m
Et le rayon par défaut suggéré est 30m pour la voiture
# Cas d'usage réels
Scénario: Safari-parc avec déclenchement automatique fluide
Étant donné qu'un utilisateur roule dans un safari à 20 km/h
Quand il passe devant "Enclos des lions" (point GPS 2)
Alors la séquence 2 démarre automatiquement sans intervention
Et il peut se concentrer sur la conduite et l'observation
Scénario: Détour imprévu (travaux sur la route)
Étant donné qu'un utilisateur prend un détour à cause de travaux
Et que le point GPS 4 devient inaccessible
Quand il est loin du point (>100m)
Et qu'il clique manuellement sur [|]
Alors la séquence 4 démarre quand même
Et l'expérience continue sans blocage
Scénario: Passager qui navigue librement
Étant donné qu'un passager utilise l'application
Et que le conducteur roule à 50 km/h
Quand le passager clique sur "Précédent" pour réécouter
Alors l'action est exécutée immédiatement
Et un warning apparaît brièvement (sensibilisation)
Scénario: Embouteillage prolongé
Étant donné que la séquence 3 est terminée depuis 10 minutes
Et que l'utilisateur est bloqué dans un embouteillage
Et que le point GPS 4 est encore à 1.5 km
Quand l'utilisateur clique sur [|]
Alors la séquence 4 démarre immédiatement
Et l'utilisateur peut passer le temps en écoutant
# Cas d'erreur
Scénario: GPS désactivé en mode voiture
Étant donné qu'un audio-guide voiture est démarré
Et que le GPS est désactivé
Quand l'application détecte l'absence de GPS
Alors une alerte s'affiche:
"""
GPS requis pour le mode Voiture
Activez la localisation pour profiter du déclenchement automatique.
[Activer GPS] [Passer en mode Manuel]
"""
Scénario: Action "Passer en mode Manuel"
Étant donné que le GPS est désactivé
Quand l'utilisateur clique sur "Passer en mode Manuel"
Alors l'audio-guide bascule en navigation 100% manuelle
Et les boutons [|] et [|] permettent de naviguer
Et aucun déclenchement GPS n'est tenté
Scénario: Précision GPS insuffisante
Étant donné que le signal GPS a une précision de ±150m
Quand l'utilisateur approche d'un point GPS avec rayon 30m
Alors un avertissement s'affiche:
"""
Signal GPS imprécis (±150m)
Le déclenchement automatique peut être perturbé.
Utilisez les boutons manuels si nécessaire.
"""
Scénario: Perte signal GPS en cours de route
Étant donné qu'un audio-guide voiture est en cours
Quand le signal GPS est perdu (tunnel, parking souterrain)
Alors un toast s'affiche: "Signal GPS perdu. Navigation manuelle active."
Et les boutons de navigation restent actifs
Quand le signal GPS revient
Alors un toast s'affiche: "Signal GPS rétabli"
Et le déclenchement automatique est réactivé
Scénario: Dépassement de la vitesse recommandée
Étant donné qu'un audio-guide recommande 20-30 km/h
Et que l'utilisateur roule à 65 km/h
Quand la vitesse est détectée
Alors l'affichage vitesse est en orange: " 65 km/h"
Et un message info s'affiche: "Vitesse élevée. Risque de manquer des points."

View File

@@ -0,0 +1,274 @@
# 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]
"""

View File

@@ -0,0 +1,307 @@
# language: fr
Fonctionnalité: Audio-guides Premium et monétisation
En tant que créateur
Je veux pouvoir proposer des audio-guides Premium
Afin de monétiser mon contenu de qualité
Contexte:
Étant donné que l'application RoadWave est démarrée
Et que le créateur "guide@example.com" est connecté et vérifié
# 16.9 - Audio-guides Premium
Scénario: Création d'un audio-guide Premium
Étant donné que le créateur crée un audio-guide "Visite VIP Versailles"
Quand il accède aux paramètres de monétisation (étape 4)
Alors il peut choisir:
| option | description |
| Gratuit | Accessible à tous (avec pubs) |
| Premium | Réservé abonnés Premium |
Scénario: Badge Premium visible sur l'audio-guide
Étant donné un audio-guide configuré en Premium
Quand il est affiché dans les résultats de recherche
Alors un badge "👑 Premium" est visible
Et la cover image a un cadre doré subtil
Scénario: Preview 3 premières séquences pour utilisateurs gratuits
Étant donné un audio-guide Premium "Visite VIP Versailles" avec 15 séquences
Et qu'un utilisateur gratuit ouvre l'audio-guide
Quand il consulte la liste des séquences
Alors les séquences affichent:
| séquence | état |
| 1 | Accessible (preview) |
| 2 | Accessible (preview) |
| 3 | Accessible (preview) |
| 4 | 🔒 Réservé Premium |
| 5-15 | 🔒 Réservé Premium |
Scénario: Écoute des 3 premières séquences sans blocage
Étant donné un utilisateur gratuit
Et un audio-guide Premium avec preview
Quand il écoute les séquences 1, 2 et 3
Alors aucune publicité n'est insérée (preview = teasing)
Et l'écoute est fluide
Scénario: Paywall après la 3ème séquence
Étant donné qu'un utilisateur gratuit termine la séquence 3
Quand la séquence se termine
Alors un overlay paywall s'affiche immédiatement:
"""
👑 Contenu réservé Premium
Continuez cette expérience exclusive
et accédez à 12 séquences supplémentaires
Sans publicité
Accès illimité à tous les contenus Premium
Téléchargement offline
Audio haute qualité
[Passer Premium - 4.99/mois]
[Découvrir d'autres audio-guides gratuits]
"""
Scénario: Bouton "Passer Premium" vers tunnel d'abonnement
Étant donné que l'overlay paywall Premium est affiché
Quand l'utilisateur clique sur "Passer Premium"
Alors il est redirigé vers la page d'abonnement Mangopay
Et l'audio-guide actuel est marqué en "pending" (reprise après souscription)
Scénario: Reprise automatique après souscription Premium
Étant donné qu'un utilisateur s'est abonné Premium depuis un paywall audio-guide
Quand l'abonnement est activé
Alors il est redirigé vers l'audio-guide automatiquement
Et la séquence 4 démarre immédiatement
Et un toast de bienvenue s'affiche: " Bienvenue Premium ! Profitez de votre audio-guide"
Scénario: Utilisateur Premium - Accès complet immédiat
Étant donné qu'un utilisateur Premium ouvre un audio-guide Premium
Quand il consulte la liste des séquences
Alors toutes les 15 séquences sont accessibles
Et aucun paywall ne s'affiche
Et aucune publicité n'est insérée
Scénario: Pas de preview si l'audio-guide a <3 séquences
Étant donné un audio-guide Premium avec seulement 2 séquences
Quand un utilisateur gratuit tente de l'ouvrir
Alors un paywall s'affiche immédiatement (avant lecture)
Et aucune preview n'est disponible
# 16.10 - Revenus créateur
Scénario: Rémunération créateur pour audio-guide Premium
Étant donné un créateur avec un audio-guide Premium
Et que 50 utilisateurs Premium ont écouté l'audio-guide ce mois
Quand la répartition des revenus est calculée
Alors le créateur reçoit 70% des revenus proportionnels
Et la formule est: (Écoutes créateur / Total écoutes Premium) × 70% pool Premium
Scénario: Dashboard revenus par audio-guide
Étant donné qu'un créateur a 3 audio-guides Premium publiés
Quand il consulte son dashboard revenus
Alors il voit pour chaque audio-guide:
| audio_guide | ecoutes_mois | revenus_estime |
| Visite VIP Versailles | 142 | 45.20 |
| Secrets du Louvre | 89 | 28.50 |
| Châteaux de la Loire | 203 | 64.80 |
Scénario: Comparaison gratuit vs Premium
Étant donné qu'un créateur a publié 2 audio-guides:
| titre | type | ecoutes_mois | revenus |
| Tour de Paris | Gratuit | 1200 | 12.50 |
| Visite VIP Versailles| Premium | 142 | 45.20 |
Quand il consulte son dashboard
Alors il peut comparer les performances
Et constater que Premium génère plus de revenus par écoute
Scénario: Seuil minimum de paiement (20€)
Étant donné qu'un créateur a généré 18 de revenus ce mois
Quand le paiement mensuel est traité
Alors le montant est reporté au mois suivant
Et un message s'affiche: "Seuil minimum non atteint (20). Montant reporté."
Scénario: Paiement automatique mensuel
Étant donné qu'un créateur a généré 138.50 de revenus en janvier
Quand le 5 février arrive
Alors le paiement est initié automatiquement via Mangopay
Et le créateur reçoit une notification: "Paiement de 138.50 en cours"
Et les fonds arrivent sous 2-3 jours ouvrés
# 16.11 - Publicités dans audio-guides gratuits
Scénario: Insertion publicité toutes les 5 séquences (gratuit)
Étant donné un audio-guide gratuit avec 12 séquences
Et un utilisateur gratuit
Quand il termine la séquence 5
Alors une publicité démarre automatiquement
Quand il termine la séquence 10
Alors une deuxième publicité démarre
Scénario: Publicité après séquence en mode piéton (avec pause)
Étant donné un audio-guide piéton gratuit
Quand la séquence 5 se termine
Alors la publicité démarre automatiquement (pas d'attente bouton)
Et la pub est skippable après 5 secondes
Quand la publicité se termine
Alors le player se met en pause
Et l'utilisateur doit cliquer sur [|] pour continuer
Scénario: Publicité en mode voiture/vélo/transport (automatique)
Étant donné un audio-guide voiture gratuit
Quand la séquence 5 se termine
Alors la publicité démarre automatiquement
Quand la publicité se termine
Alors la séquence 6 démarre automatiquement (pas de pause)
Parce que l'utilisateur est en conduite (mode hands-free)
Scénario: Publicités géolocalisées dans audio-guides
Étant donné un audio-guide dans la région "Île-de-France"
Quand une publicité doit être insérée
Alors l'API publicitaire filtre par:
| critère | valeur |
| Géolocalisation | Île-de-France |
| Catégorie | Tourisme, Culture |
| Langue | Français |
Scénario: Comptabilisation des impressions pub pour créateur
Étant donné qu'un audio-guide gratuit génère 200 écoutes complètes
Et que chaque écoute complète = 2 publicités (séq. 5 et 10)
Quand les revenus pub sont calculés
Alors 400 impressions sont comptabilisées
Et le créateur reçoit 0.80 (400 × 0.002)
# 16.12 - Stratégies de conversion
Scénario: CTA Premium après audio-guide gratuit complété
Étant donné qu'un utilisateur gratuit complète un audio-guide gratuit
Quand il termine la dernière séquence
Alors un overlay s'affiche:
"""
🎉 Audio-guide complété !
Vous avez aimé cette expérience ?
Découvrez nos audio-guides Premium pour aller plus loin
[Découvrir Premium] [Fermer]
"""
Scénario: Recommandations d'audio-guides Premium après gratuit
Étant donné qu'un utilisateur termine un audio-guide gratuit "Tour de Paris"
Quand l'overlay de fin s'affiche
Alors 3 audio-guides Premium similaires sont suggérés:
| titre | type | créateur |
| Secrets de Montmartre | Premium | @paris_stories |
| Visite VIP Musée d'Orsay | Premium | @art_guide |
| Paris hors des sentiers | Premium | @explore_paris |
Scénario: Badge "Premium recommandé" sur audio-guides populaires
Étant donné un audio-guide Premium avec >500 écoutes et note >4.5/5
Quand il est affiché dans les résultats de recherche
Alors un badge " Premium recommandé" est visible
Et il est mis en avant dans les résultats
Scénario: Conversion tracking pour attribution créateur
Étant donné qu'un utilisateur découvre Premium via un audio-guide créateur
Quand il s'abonne
Alors la conversion est trackée:
| donnée | valeur |
| source_conversion | audio_guide_paywall |
| audio_guide_id | visite_vip_versailles_123 |
| creator_id | guide_versailles_456 |
Et le créateur bénéficie d'un bonus de conversion
# 16.13 - Offres spéciales
Scénario: Essai gratuit 7 jours Premium via audio-guide
Étant donné qu'un utilisateur gratuit atteint le paywall d'un audio-guide Premium
Et qu'il n'a jamais essayé Premium
Quand l'overlay s'affiche
Alors une offre d'essai est proposée:
"""
👑 Essayez Premium gratuitement pendant 7 jours
Accès complet à cet audio-guide
Tous les contenus Premium débloqués
Sans engagement, annulable à tout moment
[Démarrer l'essai gratuit] [Plus tard]
"""
Scénario: Activation immédiate après essai gratuit
Étant donné qu'un utilisateur démarre un essai gratuit 7 jours
Quand l'essai est activé
Alors l'audio-guide Premium démarre immédiatement
Et toutes les séquences sont débloquées
Et aucune publicité n'est insérée
Scénario: Rappel 2 jours avant fin d'essai
Étant donné qu'un utilisateur a démarré un essai gratuit le 15/01
Quand le 20/01 arrive (J-2)
Alors une notification est envoyée:
"""
Votre essai Premium se termine dans 2 jours
Continuez à profiter de tous les audio-guides Premium
pour seulement 4.99/mois
[Rester Premium] [Gérer abonnement]
"""
# Cas d'usage
Scénario: Créateur mix gratuit + Premium
Étant donné qu'un créateur a publié 5 audio-guides:
| titre | type |
| Découverte de Paris | Gratuit |
| Visite VIP Louvre | Premium |
| Balade Montmartre | Gratuit |
| Secrets Versailles | Premium |
| Visite express Orsay | Gratuit |
Quand un utilisateur découvre son profil
Alors les audio-guides gratuits servent de teasing
Et les audio-guides Premium sont mis en avant avec badge
Scénario: Utilisateur hésite à s'abonner
Étant donné qu'un utilisateur atteint le paywall d'un audio-guide Premium
Et qu'il clique sur "Découvrir d'autres audio-guides gratuits"
Quand il revient 2 jours plus tard sur le même audio-guide
Alors le paywall s'affiche à nouveau
Et une réduction temporaire est proposée: "Offre spéciale : -20% premier mois"
# Cas d'erreur
Scénario: Échec du paiement Premium via paywall
Étant donné qu'un utilisateur tente de s'abonner Premium
Quand le paiement Mangopay échoue
Alors un message d'erreur s'affiche:
"""
Paiement refusé
Vérifiez vos informations bancaires ou contactez votre banque.
[Réessayer] [Annuler]
"""
Scénario: Abonnement Premium expiré pendant écoute
Étant donné qu'un utilisateur Premium écoute un audio-guide Premium
Et que son abonnement expire pendant l'écoute (séquence 8/15)
Quand l'expiration est détectée
Alors l'écoute continue jusqu'à la fin de la séquence en cours
Et un overlay s'affiche ensuite:
"""
Votre abonnement Premium a expiré
Renouvelez pour continuer à profiter des contenus exclusifs
[Renouveler - 4.99/mois] [Plus tard]
"""
Scénario: Créateur change audio-guide de gratuit à Premium
Étant donné qu'un audio-guide gratuit a 50 utilisateurs avec progression
Quand le créateur le passe en Premium
Alors les utilisateurs ayant déjà commencé gardent l'accès complet
Et seuls les nouveaux utilisateurs sont soumis au paywall
Et un message de transparence s'affiche:
"""
Cet audio-guide est maintenant Premium
Vous conservez votre accès car vous l'aviez démarré avant le changement.
"""

View File

@@ -0,0 +1,310 @@
# language: fr
Fonctionnalité: Sauvegarde et reprise de progression audio-guide
En tant qu'utilisateur
Je veux que ma progression soit sauvegardée automatiquement
Afin de pouvoir reprendre mon audio-guide là où je me suis arrêté
Contexte:
Étant donné que l'application RoadWave est démarrée
Et que l'utilisateur "jean@example.com" est connecté
# 16.5 - Sauvegarde de progression
Scénario: Sauvegarde automatique toutes les 10 secondes
Étant donné qu'un audio-guide "Visite du Louvre" est en cours
Et que la séquence 3 est à la position 1:24
Quand 10 secondes s'écoulent
Alors la progression est sauvegardée automatiquement:
| donnée | valeur |
| audio_guide_id | louvre_123 |
| sequence_actuelle | 3 |
| position_audio | 1:24 |
| timestamp | 2026-01-22 14:35:42 |
| sequences_ecoutees | [1, 2] |
Scénario: Sauvegarde locale (SQLite) pour rapidité
Étant donné qu'une sauvegarde est déclenchée
Quand la progression est enregistrée
Alors les données sont écrites en SQLite local
Et l'écriture prend moins de 50ms
Et l'application reste fluide
Scénario: Synchronisation cloud en arrière-plan
Étant donné qu'une sauvegarde locale est effectuée
Quand 30 secondes s'écoulent
Alors la progression est synchronisée vers PostgreSQL cloud
Et la synchronisation s'effectue en arrière-plan
Et elle n'impacte pas les performances
Scénario: Sauvegarde immédiate lors de la fermeture
Étant donné qu'un audio-guide est en cours à la séquence 4 position 2:15
Quand l'utilisateur ferme l'application
Alors la progression est sauvegardée immédiatement (local + cloud)
Et les données sont écrites avant la fermeture complète
Scénario: Sauvegarde des séquences complétées
Étant donné qu'un audio-guide de 12 séquences est en cours
Et que les séquences 1, 2, 4, 5 ont été écoutées à >80%
Quand la progression est sauvegardée
Alors les séquences complétées sont enregistrées:
"""json
{
"audio_guide_id": "louvre_123",
"completed_sequences": [1, 2, 4, 5],
"current_sequence": 6,
"current_position": "0:42",
"last_played_at": "2026-01-22T14:35:42Z"
}
"""
Scénario: Historique des écoutes pour statistiques
Étant donné qu'un utilisateur a écouté 3 séquences d'un audio-guide
Quand les données sont sauvegardées
Alors l'historique d'écoute inclut:
| sequence_id | started_at | completed_at | completion_rate |
| 1 | 2026-01-22 14:10:00 | 2026-01-22 14:12:15 | 100% |
| 2 | 2026-01-22 14:12:20 | 2026-01-22 14:14:08 | 100% |
| 3 | 2026-01-22 14:14:15 | 2026-01-22 14:17:45 | 92% |
# 16.6 - Reprise de progression
Scénario: Popup de reprise au redémarrage
Étant donné que l'utilisateur a quitté l'app à la séquence 6 position 2:34
Quand il rouvre l'audio-guide "Visite du Louvre"
Alors une popup s'affiche:
"""
Continuer où vous vous étiez arrêté ?
📍 Séquence 6/12 : "Vénus de Milo"
Position : 2:34 / 4:10
[ Reprendre] [🔄 Recommencer]
"""
Scénario: Action "Reprendre" - Position exacte restaurée
Étant donné qu'une popup de reprise est affichée
Quand l'utilisateur clique sur " Reprendre"
Alors la séquence 6 "Vénus de Milo" se charge
Et la position exacte 2:34 est restaurée
Et la lecture démarre automatiquement après 1 seconde
Scénario: Action "Recommencer" - Réinitialisation complète
Étant donné qu'une popup de reprise est affichée
Quand l'utilisateur clique sur "🔄 Recommencer"
Alors l'audio-guide redémarre depuis la séquence 1 position 0:00
Et toutes les séquences sont marquées "À écouter"
Et l'historique d'écoute est réinitialisé pour cette session
Scénario: Reprise après 7 jours d'inactivité
Étant donné qu'un utilisateur a arrêté un audio-guide le 15/01/2026
Et qu'il le rouvre le 22/01/2026 (7 jours plus tard)
Quand l'audio-guide se charge
Alors la popup de reprise s'affiche normalement
Et toutes les données de progression sont conservées
Scénario: Reprise sur un autre appareil (synchronisation cloud)
Étant donné qu'un utilisateur écoute un audio-guide sur iPhone
Et qu'il quitte à la séquence 4 position 1:20
Quand il ouvre le même audio-guide sur iPad
Alors la popup de reprise s'affiche avec la progression iPhone
Et il peut reprendre exactement où il s'était arrêté
Scénario: Conflit de synchronisation (dernier appareil gagne)
Étant donné qu'un utilisateur écoute sur iPhone à la séquence 3
Et simultanément sur iPad à la séquence 7
Quand les deux appareils synchronisent
Alors la progression la plus récente (timestamp) est conservée
Et l'appareil avec ancienne progression affiche une notification:
"""
Progression mise à jour
Une écoute plus récente a été détectée.
Séquence 7 restaurée.
"""
Scénario: Mode hors-ligne - Sauvegarde locale uniquement
Étant donné qu'un utilisateur écoute un audio-guide hors connexion
Et qu'il atteint la séquence 5
Quand la progression est sauvegardée
Alors les données sont écrites localement (SQLite)
Et une icône " Non synchronisé" s'affiche discrètement
Scénario: Synchronisation automatique à la reconnexion
Étant donné que l'utilisateur a écouté hors ligne jusqu'à la séquence 8
Et que 5 progressions locales ne sont pas synchronisées
Quand la connexion réseau est rétablie
Alors les 5 progressions sont synchronisées automatiquement
Et un toast s'affiche brièvement: " Progression synchronisée"
Scénario: Suppression de la progression (recommencer proprement)
Étant donné qu'un utilisateur est à la séquence 10/12
Quand il ouvre les paramètres de l'audio-guide
Et qu'il clique sur "🔄 Réinitialiser progression"
Alors une confirmation s'affiche:
"""
Réinitialiser cet audio-guide ?
Toutes les séquences seront marquées comme non écoutées.
[Annuler] [Réinitialiser]
"""
Et si confirmé, la progression est effacée
# 16.7 - Statistiques d'écoute
Scénario: Taux de complétion global de l'audio-guide
Étant donné un audio-guide de 12 séquences
Et que l'utilisateur a écouté complètement 8 séquences
Et partiellement 1 séquence (45%)
Quand les statistiques sont calculées
Alors le taux de complétion affiché est "67%" (8/12)
Scénario: Badge "Audio-guide complété" à 100%
Étant donné un audio-guide de 12 séquences
Quand l'utilisateur écoute la 12ème séquence à 100%
Alors un badge " Audio-guide complété" s'affiche
Et une notification de félicitations est envoyée
Et le statut "Complété le 22/01/2026" est visible dans l'historique
Scénario: Temps total passé sur l'audio-guide
Étant donné qu'un utilisateur a écouté un audio-guide sur 2 sessions:
| session | durée |
| 1 | 25 min |
| 2 | 18 min |
Quand les statistiques sont calculées
Alors le temps total est "43 minutes"
Et il est affiché dans l'historique personnel
Scénario: Liste des audio-guides "En cours" dans le profil
Étant donné qu'un utilisateur a 3 audio-guides en cours:
| audio_guide | progression |
| Visite du Louvre | 6/12 |
| Safari du Paugre | 3/8 |
| Circuit Loire à Vélo | 12/15 |
Quand il consulte son profil "Audio-guides"
Alors la section "📍 En cours" affiche les 3 audio-guides
Et chaque élément montre la progression sous forme de barre
Scénario: Liste des audio-guides "Complétés" dans le profil
Étant donné qu'un utilisateur a complété 2 audio-guides:
| audio_guide | date_completion |
| Tour de Paris | 2026-01-15 |
| Découverte de Lyon | 2026-01-20 |
Quand il consulte son profil "Audio-guides"
Alors la section " Complétés" affiche les 2 audio-guides
Et la date de complétion est visible
Scénario: Badge "Complétiste" pour 10 audio-guides complétés
Étant donné qu'un utilisateur complète son 10ème audio-guide
Quand la complétion est enregistrée
Alors un badge "🏆 Complétiste" est débloqué
Et il apparaît sur son profil
Et une notification est envoyée:
"""
🎉 Badge débloqué : Complétiste
Vous avez complété 10 audio-guides !
"""
Plan du Scénario: Niveaux de badges selon nombre d'audio-guides complétés
Étant donné qu'un utilisateur complète <nombre> audio-guides
Quand le badge est attribué
Alors il reçoit le badge "<badge>"
Exemples:
| nombre | badge |
| 1 | 🎧 Premier audio-guide |
| 5 | 🗺 Explorateur |
| 10 | 🏆 Complétiste |
| 25 | 🌟 Expert |
| 50 | 💎 Maître audio-guideur |
# 16.8 - Métriques créateur
Scénario: Dashboard créateur - Statistiques par audio-guide
Étant donné qu'un créateur a publié l'audio-guide "Visite du Louvre"
Quand il consulte son dashboard
Alors les métriques suivantes sont affichées:
| métrique | valeur |
| Écoutes totales | 1542 |
| Écoutes complètes (>80%) | 892 |
| Taux de complétion moyen | 58% |
| Temps d'écoute total | 423h |
| Séquence la plus écoutée | Séq. 3 |
| Séquence la moins écoutée | Séq. 11 |
Scénario: Graphique de complétion par séquence
Étant donné un audio-guide de 12 séquences
Quand le créateur consulte les statistiques détaillées
Alors un graphique en barres affiche:
| séquence | taux_completion |
| 1 | 100% |
| 2 | 95% |
| 3 | 89% |
| ... | ... |
| 12 | 58% |
Scénario: Détection des points d'abandon
Étant donné qu'un audio-guide a un taux de complétion de 58%
Et que 35% des utilisateurs abandonnent à la séquence 7
Quand le créateur consulte les insights
Alors un avertissement s'affiche:
"""
Point d'abandon détecté
35% des utilisateurs abandonnent à la séquence 7 "Aile Richelieu"
Durée : 8 min
Suggestion : Réduire la durée ou rendre plus captivant
"""
Scénario: Heatmap géographique des écoutes
Étant donné un audio-guide géolocalisé
Quand le créateur consulte la heatmap
Alors une carte affiche:
| élément | description |
| Densité d'écoutes | Zones rouge/orange/jaune selon écoutes |
| Points GPS | Marqueurs sur chaque point |
| Statistiques par point | Nombre d'écoutes par zone |
Scénario: Temps moyen par séquence
Étant donné qu'un créateur analyse son audio-guide
Quand il consulte les statistiques temporelles
Alors il voit pour chaque séquence:
| séquence | durée_audio | temps_ecoute_moyen | ecart |
| 1 | 2:15 | 2:10 | -5s |
| 2 | 1:48 | 1:30 | -18s |
| 3 | 3:42 | 3:40 | -2s |
Scénario: Notification créateur pour milestone
Étant donné qu'un audio-guide atteint 1000 écoutes
Quand le seuil est franchi
Alors une notification est envoyée au créateur:
"""
🎉 Félicitations !
Votre audio-guide "Visite du Louvre" a atteint 1000 écoutes !
Taux de complétion : 58%
"""
# Cas d'erreur et limites
Scénario: Corruption de données de sauvegarde
Étant donné qu'une sauvegarde locale (SQLite) est corrompue
Quand l'application tente de charger la progression
Alors une récupération depuis le cloud est tentée
Et si réussie, les données cloud sont restaurées
Et la base locale est reconstruite
Scénario: Échec de synchronisation cloud
Étant donné que l'API cloud est indisponible
Quand une tentative de synchronisation est effectuée
Alors l'application continue avec sauvegarde locale uniquement
Et un retry automatique est programmé dans 5 minutes
Et l'icône " Non synchronisé" reste affichée
Scénario: Suppression accidentelle de progression (récupération)
Étant donné qu'un utilisateur réinitialise un audio-guide par erreur
Quand il contacte le support dans les 7 jours
Alors l'équipe peut restaurer la progression depuis les backups
Et les données sont récupérables (backup quotidien conservé 30 jours)
Scénario: Nettoyage automatique des vieilles progressions
Étant donné qu'une progression n'a pas été mise à jour depuis 6 mois
Quand le nettoyage automatique s'exécute
Alors la progression est archivée (mais pas supprimée)
Et l'utilisateur peut la restaurer via l'historique