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:
333
features/ui/audio-guides/creation-audio-guide.feature
Normal file
333
features/ui/audio-guides/creation-audio-guide.feature
Normal 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
|
||||
349
features/ui/audio-guides/integration-fonctionnalites.feature
Normal file
349
features/ui/audio-guides/integration-fonctionnalites.feature
Normal 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
|
||||
243
features/ui/audio-guides/mode-pieton.feature
Normal file
243
features/ui/audio-guides/mode-pieton.feature
Normal 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)
|
||||
400
features/ui/audio-guides/mode-voiture.feature
Normal file
400
features/ui/audio-guides/mode-voiture.feature
Normal 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 7→1 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 7→1 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."
|
||||
274
features/ui/audio-guides/modes-velo-transport.feature
Normal file
274
features/ui/audio-guides/modes-velo-transport.feature
Normal 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]
|
||||
"""
|
||||
307
features/ui/audio-guides/premium-monetisation.feature
Normal file
307
features/ui/audio-guides/premium-monetisation.feature
Normal 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.
|
||||
"""
|
||||
310
features/ui/audio-guides/progression-sauvegarde.feature
Normal file
310
features/ui/audio-guides/progression-sauvegarde.feature
Normal 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
|
||||
Reference in New Issue
Block a user