feat(gherkin): compléter couverture règles métier avec 47 features manquantes
Ajout de 47 features Gherkin (~650 scénarios) pour couvrir 100% des règles métier : - Authentification (5) : validation mot de passe, tentatives connexion, multi-device, 2FA, récupération - Audio-guides (12) : détection mode, création, navigation piéton/voiture, ETA, gestion points, progression - Navigation (5) : notifications minimalistes, décompte 5s, stationnement, historique, basculement auto - Création contenu (3) : image auto, restrictions modification, suppression - Radio live (2) : enregistrement auto, interdictions modération - Droits auteur (6) : fair use 30s, détection musique, signalements, sanctions, appels - Modération (9) : badges Bronze/Argent/Or, score fiabilité, utilisateur confiance, audit, anti-abus - Premium (2) : webhooks Mangopay, tarification multi-canal - Profil/Partage/Recherche (5) : badge vérifié, stats arrondies, partage premium, filtres avancés, carte Tous les scénarios incluent edge cases, métriques de performance et conformité RGPD. Couverture fonctionnelle MVP maintenant complète.
This commit is contained in:
@@ -0,0 +1,205 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @navigation @ui @mvp
|
||||
Fonctionnalité: Affichage avancé distance, direction et ETA
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux voir la distance, la direction et le temps d'arrivée estimé vers les points d'intérêt
|
||||
Afin de planifier mon déplacement et anticiper les prochaines séquences
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système affiche les informations suivantes:
|
||||
| Information | Format | Mise à jour |
|
||||
| Distance | Mètres / Kilomètres | Temps réel |
|
||||
| Direction | Boussole + Flèche | Temps réel |
|
||||
| ETA | Minutes / Heures | Dynamique |
|
||||
| Vitesse utilisateur | km/h (mode voiture) | Temps réel |
|
||||
|
||||
Scénario: Affichage de la distance en mètres pour proximité < 1km
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode piéton
|
||||
Et elle se trouve à 450m du Panthéon
|
||||
Quand elle consulte l'écran de l'audio-guide
|
||||
Alors la distance affichée est: "450 m"
|
||||
Et la précision de la distance est de ±10m
|
||||
Et un événement "DISTANCE_DISPLAYED" est enregistré avec unité: "meters", valeur: 450
|
||||
Et la métrique "distance.displayed.meters" est incrémentée
|
||||
|
||||
Scénario: Affichage de la distance en kilomètres pour distance > 1km
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en mode voiture
|
||||
Et il se trouve à 12.5 km du Château de Chambord
|
||||
Quand il consulte l'écran de l'audio-guide
|
||||
Alors la distance affichée est: "12.5 km"
|
||||
Et la précision de la distance est de ±100m
|
||||
Et un événement "DISTANCE_DISPLAYED" est enregistré avec unité: "kilometers", valeur: 12.5
|
||||
Et la métrique "distance.displayed.kilometers" est incrémentée
|
||||
|
||||
Scénario: Mise à jour en temps réel de la distance pendant le déplacement
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" en mode piéton
|
||||
Et il marche vers la Sainte-Chapelle initialement à 800m
|
||||
Quand il marche à une vitesse de 5 km/h
|
||||
Alors la distance est mise à jour toutes les 2 secondes:
|
||||
| Temps | Distance affichée |
|
||||
| T+0s | 800 m |
|
||||
| T+30s | 760 m |
|
||||
| T+60s | 720 m |
|
||||
| T+90s | 680 m |
|
||||
Et la barre de progression visuelle se remplit progressivement
|
||||
Et un événement "DISTANCE_UPDATED" est enregistré toutes les 10 secondes
|
||||
Et la métrique "distance.real_time_updates" est incrémentée
|
||||
|
||||
Scénario: Affichage de la direction avec boussole et flèche
|
||||
Étant donné un utilisateur "david@roadwave.fr" en mode piéton
|
||||
Et il se trouve face au nord
|
||||
Et le Panthéon est au sud-est de sa position
|
||||
Quand il consulte l'écran de l'audio-guide
|
||||
Alors une boussole s'affiche avec:
|
||||
| Élément | Affichage |
|
||||
| Orientation boussole | Nord en haut |
|
||||
| Flèche vers POI | Pointe vers 135° (sud-est) |
|
||||
| Angle cardinal | "SE" (sud-est) |
|
||||
| Rotation dynamique | Suit l'orientation du téléphone|
|
||||
Et la flèche est colorée selon la distance:
|
||||
| Distance | Couleur |
|
||||
| < 100m | Vert |
|
||||
| 100m - 500m | Orange |
|
||||
| > 500m | Bleu |
|
||||
Et un événement "DIRECTION_DISPLAYED" est enregistré avec angle: 135
|
||||
Et la métrique "direction.displayed" est incrémentée
|
||||
|
||||
Scénario: Mise à jour de la direction en temps réel lors de la rotation
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en mode piéton
|
||||
Et elle se trouve face au nord avec le Panthéon au sud-est
|
||||
Quand elle tourne son téléphone vers l'est
|
||||
Alors la boussole pivote dynamiquement
|
||||
Et la flèche vers le POI reste fixée sur la direction réelle (135°)
|
||||
Et l'affichage est fluide à 60 FPS
|
||||
Et un événement "COMPASS_ROTATED" est enregistré
|
||||
Et la métrique "compass.rotations" est incrémentée
|
||||
|
||||
Scénario: Calcul de l'ETA en mode piéton (vitesse moyenne 5 km/h)
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en mode piéton
|
||||
Et il se trouve à 600m du Jardin du Luxembourg
|
||||
Quand le système calcule l'ETA avec vitesse piéton moyenne: 5 km/h
|
||||
Alors l'ETA affiché est: "7 min"
|
||||
Et le calcul utilise la formule: temps = distance / vitesse_moyenne_pieton
|
||||
Et un événement "ETA_CALCULATED" est enregistré avec mode: "pedestrian", eta: 7
|
||||
Et la métrique "eta.calculated.pedestrian" est incrémentée
|
||||
|
||||
Scénario: Calcul de l'ETA en mode voiture avec vitesse réelle
|
||||
Étant donné un utilisateur "grace@roadwave.fr" en mode voiture
|
||||
Et elle se trouve à 15 km du Château de Chenonceau
|
||||
Et elle roule actuellement à 80 km/h
|
||||
Quand le système calcule l'ETA
|
||||
Alors l'ETA affiché est: "11 min"
|
||||
Et le calcul utilise la vitesse réelle actuelle
|
||||
Et un événement "ETA_CALCULATED" est enregistré avec mode: "car", vitesse: 80, eta: 11
|
||||
Et la métrique "eta.calculated.car" est incrémentée
|
||||
|
||||
Scénario: Recalcul dynamique de l'ETA en fonction des changements de vitesse
|
||||
Étant donné un utilisateur "henry@roadwave.fr" en mode voiture
|
||||
Et l'ETA initial vers le Château d'Amboise est: "15 min" (vitesse: 70 km/h)
|
||||
Quand il ralentit à 40 km/h à cause d'un bouchon
|
||||
Alors l'ETA est recalculé et mis à jour: "22 min"
|
||||
Et une notification discrète s'affiche: "ETA mis à jour : +7 min"
|
||||
Quand il accélère à nouveau à 90 km/h
|
||||
Alors l'ETA est recalculé: "12 min"
|
||||
Et un événement "ETA_UPDATED" est enregistré avec ancienETA: 22, nouveauETA: 12
|
||||
Et la métrique "eta.recalculated" est incrémentée
|
||||
|
||||
Scénario: Affichage du temps d'arrivée absolu en mode voiture
|
||||
Étant donné un utilisateur "iris@roadwave.fr" en mode voiture
|
||||
Et il est 14h30
|
||||
Et l'ETA vers le prochain point est: "25 min"
|
||||
Quand elle active l'option "Afficher l'heure d'arrivée"
|
||||
Alors l'affichage change de "25 min" à "Arrivée à 14h55"
|
||||
Et les deux formats peuvent être basculés par un tap sur l'ETA
|
||||
Et un événement "ETA_FORMAT_CHANGED" est enregistré avec format: "absolute_time"
|
||||
Et la métrique "eta.format.absolute" est incrémentée
|
||||
|
||||
Scénario: Affichage groupé distance + direction + ETA sur une carte compacte
|
||||
Étant donné un utilisateur "jack@roadwave.fr" en mode piéton
|
||||
Et il se trouve à 450m du Panthéon au sud-est
|
||||
Quand il consulte la carte de l'audio-guide
|
||||
Alors une carte compacte s'affiche pour chaque point d'intérêt:
|
||||
| Point d'intérêt | Distance | Direction | ETA |
|
||||
| Panthéon | 450 m | SE ↗ | 5 min |
|
||||
| Jardin Lux. | 1.2 km | SO ↙ | 14 min |
|
||||
| Sorbonne | 320 m | E → | 4 min |
|
||||
Et les points sont triés par distance (plus proche en premier)
|
||||
Et un événement "POI_LIST_DISPLAYED" est enregistré
|
||||
Et la métrique "poi_list.displayed" est incrémentée
|
||||
|
||||
Scénario: Indication visuelle "Vous y êtes !" à l'arrivée
|
||||
Étant donné un utilisateur "kate@roadwave.fr" en mode piéton
|
||||
Et elle approche du Panthéon
|
||||
Quand elle entre dans un rayon de 10m du point d'intérêt
|
||||
Alors l'affichage change de "15 m" à "🎯 Vous y êtes !"
|
||||
Et une animation de succès est jouée
|
||||
Et une notification sonore subtile est jouée
|
||||
Et l'audio de la séquence démarre automatiquement
|
||||
Et un événement "POI_ARRIVED" est enregistré avec précision: 8m
|
||||
Et la métrique "poi.arrived" est incrémentée
|
||||
|
||||
Scénario: Affichage du trajet à vol d'oiseau vs trajet routier
|
||||
Étant donné un utilisateur "luke@roadwave.fr" en mode voiture
|
||||
Et il se trouve à 12 km à vol d'oiseau du Château de Chambord
|
||||
Mais le trajet routier est de 18 km (détours)
|
||||
Quand il consulte l'ETA
|
||||
Alors la distance affichée est celle du trajet routier: "18 km"
|
||||
Et l'ETA est calculé sur le trajet routier: "15 min"
|
||||
Et un bouton "Itinéraire" permet de voir le trajet détaillé
|
||||
Et un événement "ROUTE_DISPLAYED" est enregistré avec routeDistance: 18, airDistance: 12
|
||||
Et la métrique "route.displayed" est incrémentée
|
||||
|
||||
Scénario: Mode d'économie de batterie avec mise à jour moins fréquente
|
||||
Étant donné un utilisateur "mary@roadwave.fr" avec batterie < 20%
|
||||
Et le mode économie d'énergie est activé
|
||||
Quand elle utilise l'audio-guide
|
||||
Alors la fréquence de mise à jour des distances est réduite:
|
||||
| Mode normal | Mode économie |
|
||||
| Toutes les 2s | Toutes les 10s|
|
||||
Et la précision GPS est réduite (précision: ±30m au lieu de ±10m)
|
||||
Et un événement "BATTERY_SAVER_ENABLED" est enregistré
|
||||
Et la métrique "battery_saver.enabled" est incrémentée
|
||||
|
||||
Scénario: Affichage de la vitesse actuelle en mode voiture
|
||||
Étant donné un utilisateur "nathan@roadwave.fr" en mode voiture
|
||||
Et il roule à 75 km/h
|
||||
Quand il consulte l'écran de l'audio-guide
|
||||
Alors sa vitesse actuelle est affichée: "75 km/h"
|
||||
Et la vitesse est mise à jour en temps réel
|
||||
Et un événement "SPEED_DISPLAYED" est enregistré avec vitesse: 75
|
||||
Et la métrique "speed.displayed" est incrémentée
|
||||
|
||||
Scénario: Alerte de dépassement de limite de vitesse (optionnel)
|
||||
Étant donné un utilisateur "olive@roadwave.fr" en mode voiture
|
||||
Et elle a activé l'option "Alertes de vitesse"
|
||||
Et la limite de vitesse sur sa route est 80 km/h
|
||||
Quand elle roule à 95 km/h
|
||||
Alors une alerte visuelle discrète s'affiche: "⚠️ 95 km/h (limite: 80)"
|
||||
Et l'alerte disparaît quand elle ralentit en dessous de 85 km/h
|
||||
Et un événement "SPEED_LIMIT_EXCEEDED" est enregistré avec vitesse: 95, limite: 80
|
||||
Et la métrique "speed.limit_exceeded" est incrémentée
|
||||
|
||||
Scénario: Indication de zones à forte densité de points d'intérêt
|
||||
Étant donné un utilisateur "paul@roadwave.fr" en mode piéton
|
||||
Et il se trouve dans une zone avec 5 points d'intérêt dans un rayon de 200m
|
||||
Quand il consulte la carte
|
||||
Alors une indication s'affiche: "Zone dense : 5 points à proximité"
|
||||
Et les marqueurs sont regroupés en cluster pour éviter la surcharge visuelle
|
||||
Et en zoomant, le cluster se décompose en marqueurs individuels
|
||||
Et un événement "HIGH_DENSITY_ZONE_DETECTED" est enregistré avec count: 5
|
||||
Et la métrique "zones.high_density" est incrémentée
|
||||
|
||||
Scénario: Métriques de précision de la localisation GPS
|
||||
Étant donné un utilisateur "quinn@roadwave.fr" utilisant l'audio-guide
|
||||
Quand les métriques de précision GPS sont collectées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur cible |
|
||||
| Précision GPS moyenne | ±10m |
|
||||
| Précision GPS en mode économie | ±30m |
|
||||
| Fréquence de mise à jour GPS | 1-2 Hz |
|
||||
| Taux d'erreur de positionnement | < 5% |
|
||||
| Latence de calcul ETA | < 100ms |
|
||||
Et les métriques sont exportées vers le système de monitoring
|
||||
Et des alertes sont déclenchées si précision > ±50m
|
||||
247
features/api/audio-guides/creation-wizard-complet.feature
Normal file
247
features/api/audio-guides/creation-wizard-complet.feature
Normal file
@@ -0,0 +1,247 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @content-creation @mvp
|
||||
Fonctionnalité: Wizard complet de création d'audio-guide multi-séquences
|
||||
|
||||
En tant que créateur de contenu
|
||||
Je veux créer un audio-guide avec plusieurs séquences géolocalisées
|
||||
Afin de proposer une expérience guidée immersive aux utilisateurs
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système supporte les limites suivantes:
|
||||
| Paramètre | Valeur |
|
||||
| Nombre max de séquences par guide | 50 |
|
||||
| Taille max fichier audio | 100 MB |
|
||||
| Formats audio acceptés | MP3, M4A, WAV |
|
||||
| Durée max par séquence | 15 minutes |
|
||||
| Rayon min d'un point d'intérêt | 10 mètres |
|
||||
| Rayon max d'un point d'intérêt | 500 mètres |
|
||||
|
||||
Scénario: Création d'un audio-guide - Étape 1: Informations générales
|
||||
Étant donné un créateur "alice@roadwave.fr" connecté
|
||||
Quand le créateur clique sur "Créer un audio-guide"
|
||||
Alors le wizard s'ouvre sur l'étape 1 "Informations générales"
|
||||
Et le créateur remplit le formulaire:
|
||||
| Champ | Valeur |
|
||||
| Titre | Visite guidée du Quartier Latin |
|
||||
| Description courte | Découvrez l'histoire du quartier étudiant |
|
||||
| Description longue | Plongez dans 2000 ans d'histoire... |
|
||||
| Catégorie | Tourisme |
|
||||
| Langues disponibles | Français, Anglais |
|
||||
| Durée estimée | 2 heures |
|
||||
| Difficulté | Facile |
|
||||
| Accessibilité PMR | Oui |
|
||||
Et le créateur clique sur "Suivant"
|
||||
Alors les données sont validées et enregistrées en brouillon
|
||||
Et un événement "AUDIO_GUIDE_CREATION_STARTED" est enregistré
|
||||
Et la métrique "audio_guide.creation.step1_completed" est incrémentée
|
||||
|
||||
Scénario: Création d'un audio-guide - Étape 2: Image de couverture
|
||||
Étant donné un créateur "bob@roadwave.fr" à l'étape 2 du wizard
|
||||
Quand le créateur upload une image de couverture:
|
||||
| Propriété | Valeur |
|
||||
| Fichier | quartier-latin-cover.jpg |
|
||||
| Taille | 1920x1080 px |
|
||||
| Format | JPEG |
|
||||
| Poids | 2.5 MB |
|
||||
Alors l'image est uploadée vers le stockage S3
|
||||
Et une miniature est générée automatiquement (300x200 px)
|
||||
Et un aperçu de l'image est affiché
|
||||
Et le créateur peut recadrer l'image via un éditeur intégré
|
||||
Et le créateur clique sur "Suivant"
|
||||
Alors l'image est associée au brouillon
|
||||
Et un événement "AUDIO_GUIDE_COVER_UPLOADED" est enregistré
|
||||
Et la métrique "audio_guide.creation.step2_completed" est incrémentée
|
||||
|
||||
Scénario: Création d'un audio-guide - Étape 3: Ajout de séquences via carte
|
||||
Étant donné un créateur "charlie@roadwave.fr" à l'étape 3 du wizard
|
||||
Quand le créateur voit une carte interactive centrée sur Paris
|
||||
Et clique sur "Ajouter un point d'intérêt" sur la carte
|
||||
Et place un marqueur à la position: 48.8534, 2.3488 (Notre-Dame)
|
||||
Alors un formulaire de séquence s'ouvre:
|
||||
| Champ | Valeur par défaut |
|
||||
| Nom du point | [Vide] |
|
||||
| Position GPS | 48.8534, 2.3488 |
|
||||
| Rayon de déclenchement| 50 mètres |
|
||||
| Ordre dans le parcours| 1 |
|
||||
| Fichier audio | [Non uploadé] |
|
||||
Et le créateur remplit les informations:
|
||||
| Champ | Valeur |
|
||||
| Nom du point | Cathédrale Notre-Dame de Paris |
|
||||
| Rayon de déclenchement| 100 mètres |
|
||||
| Ordre dans le parcours| 1 |
|
||||
Et le créateur upload un fichier audio "notre-dame.mp3" (12 MB, 8min 30s)
|
||||
Et le créateur clique sur "Enregistrer le point"
|
||||
Alors la séquence 1 est créée et affichée sur la carte
|
||||
Et un événement "AUDIO_GUIDE_SEQUENCE_ADDED" est enregistré
|
||||
Et la métrique "audio_guide.sequences.added" est incrémentée
|
||||
|
||||
Scénario: Ajout de plusieurs séquences consécutives
|
||||
Étant donné un créateur "david@roadwave.fr" avec 1 séquence créée
|
||||
Quand le créateur ajoute 4 nouvelles séquences:
|
||||
| Ordre | Nom | Position GPS | Rayon | Audio |
|
||||
| 2 | Sainte-Chapelle | 48.8555, 2.3450 | 80m | chapelle.mp3 |
|
||||
| 3 | Panthéon | 48.8462, 2.3464 | 100m | pantheon.mp3 |
|
||||
| 4 | Jardin du Luxembourg | 48.8462, 2.3371 | 150m | jardin.mp3 |
|
||||
| 5 | Sorbonne | 48.8487, 2.3431 | 70m | sorbonne.mp3 |
|
||||
Alors les 5 séquences sont affichées sur la carte avec des marqueurs numérotés
|
||||
Et une ligne de parcours relie les points dans l'ordre
|
||||
Et la distance totale du parcours est calculée: 3.2 km
|
||||
Et la durée totale des audios est calculée: 42 minutes
|
||||
Et un panneau latéral liste les séquences avec possibilité de réorganiser
|
||||
Et un événement "AUDIO_GUIDE_SEQUENCES_BATCH_ADDED" est enregistré
|
||||
Et la métrique "audio_guide.sequences.count" est mise à jour: 5
|
||||
|
||||
Scénario: Réorganisation de l'ordre des séquences par drag & drop
|
||||
Étant donné un créateur "eve@roadwave.fr" avec 5 séquences créées
|
||||
Quand le créateur utilise le panneau latéral
|
||||
Et fait glisser la séquence #3 "Panthéon" vers la position #2
|
||||
Alors l'ordre des séquences est mis à jour:
|
||||
| Nouvel ordre | Nom |
|
||||
| 1 | Cathédrale Notre-Dame |
|
||||
| 2 | Panthéon |
|
||||
| 3 | Sainte-Chapelle |
|
||||
| 4 | Jardin du Luxembourg |
|
||||
| 5 | Sorbonne |
|
||||
Et la ligne de parcours sur la carte est recalculée
|
||||
Et la distance totale est recalculée: 3.5 km
|
||||
Et un événement "AUDIO_GUIDE_SEQUENCES_REORDERED" est enregistré
|
||||
Et la métrique "audio_guide.sequences.reordered" est incrémentée
|
||||
|
||||
Scénario: Modification d'une séquence existante
|
||||
Étant donné un créateur "frank@roadwave.fr" avec 5 séquences créées
|
||||
Quand le créateur clique sur le marqueur #2 "Panthéon" sur la carte
|
||||
Alors le formulaire d'édition s'ouvre avec les données actuelles
|
||||
Et le créateur modifie:
|
||||
| Champ | Ancienne valeur | Nouvelle valeur |
|
||||
| Rayon de déclenchement| 100m | 120m |
|
||||
| Fichier audio | pantheon.mp3 | pantheon-v2.mp3 |
|
||||
Et le créateur clique sur "Enregistrer les modifications"
|
||||
Alors la séquence est mise à jour
|
||||
Et le nouveau fichier audio remplace l'ancien
|
||||
Et l'ancien fichier est supprimé du stockage S3
|
||||
Et un événement "AUDIO_GUIDE_SEQUENCE_UPDATED" est enregistré
|
||||
Et la métrique "audio_guide.sequences.updated" est incrémentée
|
||||
|
||||
Scénario: Suppression d'une séquence
|
||||
Étant donné un créateur "grace@roadwave.fr" avec 5 séquences créées
|
||||
Quand le créateur clique sur l'icône de suppression de la séquence #3
|
||||
Alors un dialogue de confirmation s'affiche: "Supprimer cette séquence ?"
|
||||
Et le créateur confirme la suppression
|
||||
Alors la séquence #3 est supprimée
|
||||
Et le fichier audio associé est marqué pour suppression différée (30 jours)
|
||||
Et les séquences suivantes sont renumérotées automatiquement:
|
||||
| Ancien ordre | Nouveau ordre | Nom |
|
||||
| 4 | 3 | Jardin du Luxembourg |
|
||||
| 5 | 4 | Sorbonne |
|
||||
Et la ligne de parcours est recalculée
|
||||
Et un événement "AUDIO_GUIDE_SEQUENCE_DELETED" est enregistré
|
||||
Et la métrique "audio_guide.sequences.deleted" est incrémentée
|
||||
|
||||
Scénario: Validation de la distance minimale entre séquences
|
||||
Étant donné un créateur "henry@roadwave.fr" avec 2 séquences créées
|
||||
Quand le créateur tente d'ajouter une 3ème séquence à 5 mètres de la séquence #1
|
||||
Alors un message d'erreur s'affiche: "Ce point est trop proche d'un point existant (min: 20m)"
|
||||
Et le marqueur est affiché en rouge sur la carte
|
||||
Et la séquence n'est pas enregistrée tant que le créateur ne déplace pas le marqueur
|
||||
Et un événement "AUDIO_GUIDE_SEQUENCE_TOO_CLOSE" est enregistré
|
||||
Et la métrique "audio_guide.validation.sequence_too_close" est incrémentée
|
||||
|
||||
Scénario: Création d'un audio-guide - Étape 4: Configuration avancée
|
||||
Étant donné un créateur "iris@roadwave.fr" à l'étape 4 du wizard
|
||||
Quand le créateur configure les options avancées:
|
||||
| Option | Valeur |
|
||||
| Prix (gratuit ou payant) | Gratuit |
|
||||
| Visibilité | Publique |
|
||||
| Mode de lecture | Séquentiel obligatoire |
|
||||
| Autoriser les avis utilisateurs | Oui |
|
||||
| Autoriser le téléchargement | Non |
|
||||
| Activer les sous-titres | Oui |
|
||||
Et clique sur "Suivant"
|
||||
Alors les options sont enregistrées
|
||||
Et un événement "AUDIO_GUIDE_CONFIG_COMPLETED" est enregistré
|
||||
Et la métrique "audio_guide.creation.step4_completed" est incrémentée
|
||||
|
||||
Scénario: Création d'un audio-guide - Étape 5: Prévisualisation et publication
|
||||
Étant donné un créateur "jack@roadwave.fr" à l'étape 5 du wizard
|
||||
Quand le créateur voit la prévisualisation complète:
|
||||
| Section | Contenu |
|
||||
| Informations | Titre, description, durée |
|
||||
| Image | Aperçu de la couverture |
|
||||
| Parcours | Carte avec 5 séquences |
|
||||
| Audio | Liste des 5 fichiers audio |
|
||||
| Configuration | Prix, visibilité, options |
|
||||
Et clique sur "Tester le parcours en simulation"
|
||||
Alors une simulation GPS est lancée avec lecture des audios
|
||||
Et le créateur peut naviguer dans le parcours virtuel
|
||||
Et après validation, le créateur clique sur "Publier l'audio-guide"
|
||||
Alors l'audio-guide passe du statut "brouillon" à "publié"
|
||||
Et l'audio-guide devient visible dans les recherches et recommandations
|
||||
Et un événement "AUDIO_GUIDE_PUBLISHED" est enregistré
|
||||
Et la métrique "audio_guide.published" est incrémentée
|
||||
Et un email de confirmation est envoyé au créateur
|
||||
|
||||
Scénario: Sauvegarde automatique du brouillon pendant la création
|
||||
Étant donné un créateur "kate@roadwave.fr" en train de créer un audio-guide
|
||||
Quand le créateur remplit des informations à chaque étape
|
||||
Alors le brouillon est automatiquement sauvegardé toutes les 30 secondes
|
||||
Et un indicateur "Sauvegardé automatiquement à 14:32" s'affiche
|
||||
Et en cas de fermeture accidentelle, le créateur peut reprendre la création
|
||||
Et un événement "AUDIO_GUIDE_DRAFT_AUTOSAVED" est enregistré toutes les 30s
|
||||
Et la métrique "audio_guide.drafts.autosaved" est incrémentée
|
||||
|
||||
Scénario: Récupération d'un brouillon après interruption
|
||||
Étant donné un créateur "luke@roadwave.fr" qui a commencé un audio-guide hier
|
||||
Et le brouillon a été sauvegardé automatiquement à l'étape 3
|
||||
Quand le créateur clique sur "Créer un audio-guide"
|
||||
Alors un message s'affiche: "Vous avez un brouillon en cours. Reprendre la création ?"
|
||||
Et le créateur clique sur "Reprendre"
|
||||
Alors le wizard s'ouvre directement à l'étape 3
|
||||
Et toutes les données saisies sont restaurées
|
||||
Et un événement "AUDIO_GUIDE_DRAFT_RESUMED" est enregistré
|
||||
Et la métrique "audio_guide.drafts.resumed" est incrémentée
|
||||
|
||||
Scénario: Import d'un parcours GPX pour créer automatiquement les séquences
|
||||
Étant donné un créateur "mary@roadwave.fr" à l'étape 3 du wizard
|
||||
Quand le créateur clique sur "Importer un parcours GPX"
|
||||
Et upload un fichier "parcours-paris.gpx" avec 10 waypoints
|
||||
Alors le système extrait les coordonnées GPS de chaque waypoint
|
||||
Et crée automatiquement 10 séquences avec positions GPS pré-remplies
|
||||
Et les marqueurs sont affichés sur la carte
|
||||
Et le créateur doit ensuite ajouter les fichiers audio et noms pour chaque séquence
|
||||
Et un événement "AUDIO_GUIDE_GPX_IMPORTED" est enregistré
|
||||
Et la métrique "audio_guide.gpx.imported" est incrémentée
|
||||
|
||||
Scénario: Validation de la qualité audio avant publication
|
||||
Étant donné un créateur "nathan@roadwave.fr" qui tente de publier un audio-guide
|
||||
Quand le système analyse les fichiers audio uploadés
|
||||
Et détecte que le fichier "sequence-3.mp3" a un bitrate de 32 kbps (trop faible)
|
||||
Alors un avertissement s'affiche: "Le fichier 'sequence-3.mp3' a une qualité audio faible. Recommandé: 128 kbps minimum"
|
||||
Et le créateur peut choisir de:
|
||||
| Action | Conséquence |
|
||||
| Ignorer et publier quand même | Publication autorisée |
|
||||
| Remplacer le fichier | Retour à l'édition |
|
||||
Et un événement "AUDIO_GUIDE_LOW_QUALITY_WARNING" est enregistré
|
||||
Et la métrique "audio_guide.quality.warnings" est incrémentée
|
||||
|
||||
Scénario: Limitation du nombre de brouillons par créateur
|
||||
Étant donné un créateur "olive@roadwave.fr" avec 10 brouillons en cours
|
||||
Quand le créateur tente de créer un 11ème audio-guide
|
||||
Alors un message s'affiche: "Vous avez atteint la limite de 10 brouillons. Veuillez publier ou supprimer des brouillons existants."
|
||||
Et un lien vers la liste des brouillons est affiché
|
||||
Et la création est bloquée jusqu'à suppression d'un brouillon
|
||||
Et un événement "AUDIO_GUIDE_DRAFT_LIMIT_REACHED" est enregistré
|
||||
Et la métrique "audio_guide.drafts.limit_reached" est incrémentée
|
||||
|
||||
Scénario: Métriques de performance du wizard de création
|
||||
Étant donné que 1000 audio-guides sont créés par mois
|
||||
Quand les métriques de création sont collectées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur cible |
|
||||
| Taux de complétion du wizard | > 65% |
|
||||
| Temps moyen de création | < 45 min |
|
||||
| Nombre moyen de séquences par guide | 5-8 |
|
||||
| Taux d'abandon à chaque étape | < 15% |
|
||||
| Taux d'utilisation de l'autosave | 100% |
|
||||
Et les métriques sont exportées vers le système de monitoring
|
||||
Et des optimisations UX sont proposées si taux d'abandon > 20%
|
||||
@@ -0,0 +1,223 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @car-mode @geolocation @mvp
|
||||
Fonctionnalité: Déclenchement GPS automatique des audio-guides en mode voiture
|
||||
|
||||
En tant qu'utilisateur en voiture
|
||||
Je veux que les audio-guides se déclenchent automatiquement à l'approche des points d'intérêt
|
||||
Afin de profiter d'une expérience guidée sans interaction manuelle pendant la conduite
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système de déclenchement en mode voiture respecte:
|
||||
| Paramètre | Valeur |
|
||||
| Rayon de déclenchement | 200-500m |
|
||||
| Vitesse max pour déclenchement | 90 km/h |
|
||||
| Ordre de séquences | Strict |
|
||||
| Notification visuelle | Minimale |
|
||||
| Notification audio | Prioritaire |
|
||||
| Auto-play | Obligatoire |
|
||||
|
||||
Scénario: Démarrage d'un audio-guide en mode voiture
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode voiture
|
||||
Et elle roule à 50 km/h sur l'autoroute A6
|
||||
Quand elle lance l'audio-guide "Route des Châteaux de la Loire"
|
||||
Alors l'audio de la séquence d'introduction démarre automatiquement
|
||||
Et l'interface minimaliste en mode voiture s'affiche:
|
||||
| Élément | État |
|
||||
| Carte | Simplifiée, zoom automatique |
|
||||
| Notifications visuelles | Minimales |
|
||||
| Prochain point | Château de Chambord - 25 km |
|
||||
| ETA | Arrivée dans 18 minutes |
|
||||
| Contrôles audio | Gros boutons [Pause] [Skip] |
|
||||
Et un événement "AUDIO_GUIDE_STARTED_CAR_MODE" est enregistré
|
||||
Et la métrique "audio_guide.started.car_mode" est incrémentée
|
||||
|
||||
Scénario: Déclenchement automatique à l'approche d'un point d'intérêt
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en mode voiture à 60 km/h
|
||||
Et il écoute l'audio-guide "Route des Châteaux de la Loire"
|
||||
Et il approche du Château de Chambord
|
||||
Quand il entre dans un rayon de 400m du château (configuré par le créateur)
|
||||
Alors l'audio en cours se termine en fondu (3 secondes)
|
||||
Et l'audio de la séquence "Château de Chambord" démarre automatiquement
|
||||
Et une notification audio est jouée: "À votre droite, Château de Chambord"
|
||||
Et une notification visuelle minimale s'affiche brièvement (2s):
|
||||
| Élément | Contenu |
|
||||
| Titre | Château de Chambord |
|
||||
| Direction | → À droite |
|
||||
| Distance | 400m |
|
||||
Et un événement "SEQUENCE_AUTO_TRIGGERED_CAR" est enregistré
|
||||
Et la métrique "audio_guide.sequence.car.triggered" est incrémentée
|
||||
|
||||
Scénario: Calcul de l'ETA dynamique basé sur la vitesse réelle
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" en mode voiture
|
||||
Et il approche du prochain point d'intérêt à 15 km
|
||||
Et il roule à 80 km/h
|
||||
Quand le système calcule l'ETA
|
||||
Alors l'ETA affiché est: "Arrivée dans 11 minutes"
|
||||
Quand il ralentit à 50 km/h (bouchon)
|
||||
Alors l'ETA est recalculé en temps réel: "Arrivée dans 18 minutes"
|
||||
Et un événement "ETA_RECALCULATED" est enregistré
|
||||
Et la métrique "audio_guide.eta.updated" est incrémentée
|
||||
|
||||
Scénario: Notification vocale d'approche 2km avant le point
|
||||
Étant donné un utilisateur "david@roadwave.fr" en mode voiture à 70 km/h
|
||||
Et il écoute l'audio-guide "Route des Châteaux de la Loire"
|
||||
Quand il est à 2 km du Château de Chenonceau
|
||||
Alors une notification vocale est jouée par-dessus l'audio actuel:
|
||||
"Dans 2 kilomètres, vous découvrirez le Château de Chenonceau"
|
||||
Et le volume de l'audio actuel est réduit de 50% pendant la notification (ducking audio)
|
||||
Et après la notification, le volume reprend normalement
|
||||
Et un événement "POI_ADVANCE_NOTIFICATION" est enregistré avec distance: 2000m
|
||||
Et la métrique "audio_guide.advance_notification" est incrémentée
|
||||
|
||||
Scénario: Gestion du dépassement d'un point d'intérêt sans déclenchement
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en mode voiture à 90 km/h
|
||||
Et elle approche du Château d'Amboise (séquence #3)
|
||||
Mais elle a manqué la séquence #2 (Château de Chaumont)
|
||||
Quand elle entre dans le rayon du Château d'Amboise
|
||||
Alors l'audio de la séquence #2 est automatiquement joué d'abord
|
||||
Et un message vocal indique: "Séquence précédente: Château de Chaumont"
|
||||
Et après la fin de la séquence #2, la séquence #3 démarre
|
||||
Et un événement "SEQUENCE_CATCH_UP" est enregistré
|
||||
Et la métrique "audio_guide.sequence.catch_up" est incrémentée
|
||||
|
||||
Scénario: Marquage automatique d'une séquence comme "manquée"
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en mode voiture à 100 km/h
|
||||
Et il a dépassé le Château de Chaumont sans entrer dans son rayon
|
||||
Et il s'éloigne maintenant à plus de 5 km
|
||||
Alors la séquence "Château de Chaumont" est marquée comme "Manquée"
|
||||
Et elle reste disponible dans la liste pour écoute manuelle ultérieure
|
||||
Et un événement "SEQUENCE_MISSED" est enregistré avec raison: "too_fast"
|
||||
Et la métrique "audio_guide.sequence.missed" est incrémentée
|
||||
|
||||
Scénario: Pause automatique lors d'un appel téléphonique
|
||||
Étant donné un utilisateur "grace@roadwave.fr" en mode voiture
|
||||
Et elle écoute l'audio-guide à la position 3min 20s
|
||||
Quand elle reçoit un appel téléphonique via CarPlay
|
||||
Alors l'audio-guide se met automatiquement en pause
|
||||
Et la position de lecture est sauvegardée: 3min 20s
|
||||
Et un événement "AUDIO_PAUSED_PHONE_CALL" est enregistré
|
||||
Quand l'appel se termine
|
||||
Alors l'audio-guide reprend automatiquement à 3min 20s
|
||||
Et un événement "AUDIO_RESUMED_AFTER_CALL" est enregistré
|
||||
Et la métrique "audio_guide.interruption.phone" est incrémentée
|
||||
|
||||
Scénario: Intégration avec CarPlay pour affichage sur écran véhicule
|
||||
Étant donné un utilisateur "henry@roadwave.fr" en mode voiture
|
||||
Et son iPhone est connecté via CarPlay
|
||||
Quand il lance l'audio-guide "Route des Châteaux de la Loire"
|
||||
Alors l'interface CarPlay s'affiche sur l'écran du véhicule:
|
||||
| Élément | Affichage |
|
||||
| Carte simplifiée | Vue routière optimisée |
|
||||
| Prochain point | Nom + distance + ETA |
|
||||
| Contrôles audio | Gros boutons tactiles |
|
||||
| Progression | Barre 3/10 séquences |
|
||||
| Commandes vocales | "Dis Siri, suivant" |
|
||||
Et les contrôles au volant du véhicule fonctionnent (lecture/pause)
|
||||
Et un événement "CARPLAY_SESSION_STARTED" est enregistré
|
||||
Et la métrique "audio_guide.carplay.used" est incrémentée
|
||||
|
||||
Scénario: Commandes vocales Siri pour contrôle sans les mains
|
||||
Étant donné un utilisateur "iris@roadwave.fr" en mode voiture
|
||||
Et elle écoute l'audio-guide via CarPlay
|
||||
Quand elle dit "Dis Siri, mets en pause"
|
||||
Alors l'audio-guide se met en pause
|
||||
Quand elle dit "Dis Siri, reprends la lecture"
|
||||
Alors l'audio-guide reprend
|
||||
Quand elle dit "Dis Siri, séquence suivante"
|
||||
Alors la séquence suivante démarre
|
||||
Et un événement "VOICE_COMMAND_EXECUTED" est enregistré avec commande: "next"
|
||||
Et la métrique "audio_guide.voice_commands.used" est incrémentée
|
||||
|
||||
Scénario: Adaptation du volume en fonction de la vitesse du véhicule
|
||||
Étant donné un utilisateur "jack@roadwave.fr" en mode voiture
|
||||
Et il écoute l'audio-guide avec volume configuré à 70%
|
||||
Quand il roule à 50 km/h
|
||||
Alors le volume reste à 70% (bruit ambiant faible)
|
||||
Quand il accélère à 130 km/h sur autoroute
|
||||
Alors le volume augmente automatiquement à 85% (compensation du bruit)
|
||||
Et un événement "VOLUME_AUTO_ADJUSTED" est enregistré avec vitesse: 130, volume: 85
|
||||
Et la métrique "audio_guide.volume.auto_adjusted" est incrémentée
|
||||
|
||||
Scénario: Désactivation temporaire en cas de vitesse excessive
|
||||
Étant donné un utilisateur "kate@roadwave.fr" en mode voiture
|
||||
Et elle écoute l'audio-guide sur autoroute
|
||||
Quand elle dépasse les 110 km/h
|
||||
Alors l'audio continue de jouer normalement
|
||||
Mais aucune nouvelle séquence ne se déclenche automatiquement
|
||||
Et un message vocal indique: "Déclenchements automatiques suspendus à haute vitesse"
|
||||
Quand elle ralentit en dessous de 90 km/h
|
||||
Alors les déclenchements automatiques sont réactivés
|
||||
Et un événement "AUTO_TRIGGER_SPEED_LIMITED" est enregistré
|
||||
Et la métrique "audio_guide.speed.limited" est incrémentée
|
||||
|
||||
Scénario: Mode nuit avec interface sombre automatique
|
||||
Étant donné un utilisateur "luke@roadwave.fr" en mode voiture
|
||||
Et il est 22h30 (nuit)
|
||||
Quand il utilise l'audio-guide
|
||||
Alors l'interface passe automatiquement en mode nuit:
|
||||
| Élément | Mode nuit |
|
||||
| Fond d'écran | Noir |
|
||||
| Texte | Blanc/Gris clair |
|
||||
| Carte | Thème sombre |
|
||||
| Luminosité | Réduite de 40% |
|
||||
Et les notifications visuelles sont encore plus discrètes
|
||||
Et un événement "NIGHT_MODE_AUTO_ENABLED" est enregistré
|
||||
Et la métrique "audio_guide.night_mode.enabled" est incrémentée
|
||||
|
||||
Scénario: Connexion automatique via Android Auto
|
||||
Étant donné un utilisateur "mary@roadwave.fr" avec téléphone Android
|
||||
Et son téléphone est connecté via Android Auto
|
||||
Quand elle lance l'audio-guide "Route des Châteaux de la Loire"
|
||||
Alors l'interface Android Auto s'affiche sur l'écran du véhicule
|
||||
Et les fonctionnalités sont identiques à CarPlay:
|
||||
| Fonctionnalité | Disponible |
|
||||
| Carte simplifiée | Oui |
|
||||
| Contrôles audio | Oui |
|
||||
| Commandes vocales | Oui (Google Assistant) |
|
||||
| Notifications | Oui |
|
||||
Et un événement "ANDROID_AUTO_SESSION_STARTED" est enregistré
|
||||
Et la métrique "audio_guide.android_auto.used" est incrémentée
|
||||
|
||||
Scénario: Gestion de la perte de signal GPS temporaire
|
||||
Étant donné un utilisateur "nathan@roadwave.fr" en mode voiture
|
||||
Et il écoute l'audio-guide dans un tunnel
|
||||
Quand le signal GPS est perdu pendant 2 minutes
|
||||
Alors l'audio en cours continue de jouer normalement
|
||||
Et la position estimée est calculée selon la vitesse et direction précédentes
|
||||
Et un message discret s'affiche: "Signal GPS perdu - Position estimée"
|
||||
Quand le signal GPS est retrouvé
|
||||
Alors la position est recalculée immédiatement
|
||||
Et les déclenchements automatiques sont réactivés
|
||||
Et un événement "GPS_SIGNAL_RESTORED" est enregistré
|
||||
Et la métrique "audio_guide.gps.signal_lost" est incrémentée
|
||||
|
||||
Scénario: Statistiques de fin de parcours en mode voiture
|
||||
Étant donné un utilisateur "olive@roadwave.fr" en mode voiture
|
||||
Et elle vient de terminer l'audio-guide "Route des Châteaux de la Loire"
|
||||
Quand elle arrive à destination
|
||||
Alors un écran de statistiques s'affiche:
|
||||
| Métrique | Valeur |
|
||||
| Séquences écoutées | 9/10 |
|
||||
| Séquences manquées | 1 (trop rapide) |
|
||||
| Distance parcourue | 142 km |
|
||||
| Temps total | 2h 15min |
|
||||
| Temps d'écoute | 1h 05min |
|
||||
| Vitesse moyenne | 63 km/h |
|
||||
| Badge débloqué | Voyageur des châteaux |
|
||||
Et un bouton "Partager mon voyage" est disponible
|
||||
Et un événement "AUDIO_GUIDE_COMPLETED_CAR" est enregistré
|
||||
Et la métrique "audio_guide.completed.car_mode" est incrémentée
|
||||
|
||||
Scénario: Métriques de performance du mode voiture
|
||||
Étant donné que 50 000 utilisateurs ont utilisé l'audio-guide en mode voiture
|
||||
Quand les métriques d'usage sont collectées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur cible |
|
||||
| Taux de déclenchement automatique | > 90% |
|
||||
| Taux de séquences manquées | < 15% |
|
||||
| Temps moyen entre déclenchements | 8 minutes |
|
||||
| Précision du calcul ETA | ±3 minutes |
|
||||
| Utilisation de CarPlay/Android Auto | 65% |
|
||||
| Utilisation de commandes vocales | 45% |
|
||||
Et les métriques sont exportées vers le système de monitoring
|
||||
239
features/api/audio-guides/detection-mode-deplacement.feature
Normal file
239
features/api/audio-guides/detection-mode-deplacement.feature
Normal file
@@ -0,0 +1,239 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @geolocation @mvp
|
||||
Fonctionnalité: Détection automatique du mode de déplacement
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux que l'application détecte automatiquement mon mode de déplacement
|
||||
Afin d'adapter l'expérience audio-guide (voiture, piéton, vélo, transports)
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système utilise les capteurs suivants pour la détection:
|
||||
| Capteur | Utilisation |
|
||||
| GPS (vitesse) | Vitesse de déplacement |
|
||||
| Accéléromètre | Détection de la marche |
|
||||
| Gyroscope | Détection de mouvements |
|
||||
| Bluetooth | Connexion CarPlay/Android Auto |
|
||||
| Activité (CoreMotion) | walking, running, cycling, automotive |
|
||||
|
||||
Scénario: Détection automatique du mode voiture
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en déplacement
|
||||
Quand le système détecte les indicateurs suivants:
|
||||
| Indicateur | Valeur |
|
||||
| Vitesse GPS | 45 km/h |
|
||||
| Accélération longitudinale | Typique d'une voiture|
|
||||
| Bluetooth connecté | CarPlay |
|
||||
| Activity Recognition | automotive |
|
||||
| Stabilité du mouvement | Haute |
|
||||
Alors le mode de déplacement "voiture" est sélectionné avec confiance: 95%
|
||||
Et l'interface passe en mode voiture:
|
||||
| Caractéristique | État |
|
||||
| Notifications visuelles | Minimales |
|
||||
| Notifications audio | Prioritaires |
|
||||
| Affichage des distances | Mètres + temps ETA |
|
||||
| Auto-play au point d'intérêt | Activé |
|
||||
Et un événement "TRAVEL_MODE_DETECTED_CAR" est enregistré
|
||||
Et la métrique "travel_mode.detected.car" est incrémentée
|
||||
|
||||
Scénario: Détection automatique du mode piéton
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en déplacement
|
||||
Quand le système détecte les indicateurs suivants:
|
||||
| Indicateur | Valeur |
|
||||
| Vitesse GPS | 4 km/h |
|
||||
| Accéléromètre | Pattern de marche |
|
||||
| Fréquence de pas | 110 pas/min |
|
||||
| Activity Recognition | walking |
|
||||
| Bluetooth connecté | Non |
|
||||
Alors le mode de déplacement "piéton" est sélectionné avec confiance: 92%
|
||||
Et l'interface passe en mode piéton:
|
||||
| Caractéristique | État |
|
||||
| Notifications visuelles | Complètes |
|
||||
| Navigation libre | Activée |
|
||||
| Affichage carte | Complet |
|
||||
| Auto-play publicité | Autorisé |
|
||||
Et un événement "TRAVEL_MODE_DETECTED_WALKING" est enregistré
|
||||
Et la métrique "travel_mode.detected.walking" est incrémentée
|
||||
|
||||
Scénario: Détection automatique du mode vélo
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" en déplacement
|
||||
Quand le système détecte les indicateurs suivants:
|
||||
| Indicateur | Valeur |
|
||||
| Vitesse GPS | 18 km/h |
|
||||
| Accéléromètre | Vibrations régulières|
|
||||
| Pattern de mouvement | Cyclique |
|
||||
| Activity Recognition | cycling |
|
||||
| Variations de vitesse | Moyennes |
|
||||
Alors le mode de déplacement "vélo" est sélectionné avec confiance: 88%
|
||||
Et l'interface passe en mode vélo:
|
||||
| Caractéristique | État |
|
||||
| Notifications visuelles | Limitées |
|
||||
| Notifications audio | Prioritaires |
|
||||
| Affichage des distances | Mètres |
|
||||
| Auto-play au point d'intérêt | Optionnel |
|
||||
Et un événement "TRAVEL_MODE_DETECTED_CYCLING" est enregistré
|
||||
Et la métrique "travel_mode.detected.cycling" est incrémentée
|
||||
|
||||
Scénario: Détection automatique du mode transports en commun
|
||||
Étant donné un utilisateur "david@roadwave.fr" en déplacement
|
||||
Quand le système détecte les indicateurs suivants:
|
||||
| Indicateur | Valeur |
|
||||
| Vitesse GPS | 35 km/h avec arrêts |
|
||||
| Pattern d'arrêts | Régulier (stations) |
|
||||
| Accéléromètre | Stationnaire par moments|
|
||||
| Précision GPS | Variable (tunnels) |
|
||||
| Activity Recognition | automotive + stationary |
|
||||
Alors le mode de déplacement "transports" est sélectionné avec confiance: 80%
|
||||
Et l'interface passe en mode transports:
|
||||
| Caractéristique | État |
|
||||
| Notifications visuelles | Complètes |
|
||||
| Auto-play aux stations | Activé |
|
||||
| Affichage carte | Complet |
|
||||
| Prise en compte des tunnels | Activée |
|
||||
Et un événement "TRAVEL_MODE_DETECTED_TRANSIT" est enregistré
|
||||
Et la métrique "travel_mode.detected.transit" est incrémentée
|
||||
|
||||
Scénario: Changement dynamique de mode détecté (voiture → piéton)
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en mode voiture
|
||||
Et il roule à 50 km/h
|
||||
Quand l'utilisateur se gare et sort de la voiture:
|
||||
| Temps | Vitesse | Activity | Bluetooth |
|
||||
| T+0s | 50 km/h | automotive | CarPlay |
|
||||
| T+30s | 0 km/h | stationary | CarPlay |
|
||||
| T+60s | 0 km/h | stationary | Déconnecté|
|
||||
| T+90s | 4 km/h | walking | Non |
|
||||
Alors le mode bascule automatiquement de "voiture" à "piéton"
|
||||
Et une notification discrète s'affiche: "Mode piéton activé"
|
||||
Et l'interface s'adapte instantanément au mode piéton
|
||||
Et un événement "TRAVEL_MODE_CHANGED" est enregistré avec transition: "car_to_walking"
|
||||
Et la métrique "travel_mode.transition.car_to_walking" est incrémentée
|
||||
|
||||
Scénario: Changement dynamique de mode détecté (piéton → vélo)
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en mode piéton
|
||||
Et il marche à 4 km/h
|
||||
Quand l'utilisateur monte sur un vélo:
|
||||
| Temps | Vitesse | Activity | Pattern |
|
||||
| T+0s | 4 km/h | walking | Marche |
|
||||
| T+10s | 8 km/h | cycling | Cyclique |
|
||||
| T+20s | 15 km/h | cycling | Cyclique |
|
||||
| T+30s | 18 km/h | cycling | Cyclique stable|
|
||||
Alors le mode bascule automatiquement de "piéton" à "vélo"
|
||||
Et une notification s'affiche: "Mode vélo activé"
|
||||
Et les paramètres audio sont ajustés pour réduire les notifications visuelles
|
||||
Et un événement "TRAVEL_MODE_CHANGED" est enregistré avec transition: "walking_to_cycling"
|
||||
Et la métrique "travel_mode.transition.walking_to_cycling" est incrémentée
|
||||
|
||||
Scénario: Détection ambiguë avec faible confiance
|
||||
Étant donné un utilisateur "grace@roadwave.fr" en déplacement
|
||||
Quand le système détecte des indicateurs contradictoires:
|
||||
| Indicateur | Valeur |
|
||||
| Vitesse GPS | 12 km/h |
|
||||
| Activity Recognition | unknown |
|
||||
| Accéléromètre | Pattern irrégulier |
|
||||
| Confiance de détection | 45% |
|
||||
Alors le mode actuel est conservé (pas de changement)
|
||||
Et une icône d'interrogation s'affiche discrètement
|
||||
Et l'utilisateur peut forcer manuellement le mode via un menu rapide
|
||||
Et un événement "TRAVEL_MODE_UNCERTAIN" est enregistré
|
||||
Et la métrique "travel_mode.uncertain" est incrémentée
|
||||
|
||||
Scénario: Forçage manuel du mode de déplacement
|
||||
Étant donné un utilisateur "henry@roadwave.fr" en mode auto-détecté "piéton"
|
||||
Mais il est en réalité en voiture (passager)
|
||||
Quand l'utilisateur ouvre le menu rapide et sélectionne "Mode voiture"
|
||||
Alors le mode "voiture" est forcé manuellement
|
||||
Et l'auto-détection est temporairement désactivée pour 30 minutes
|
||||
Et un événement "TRAVEL_MODE_FORCED_MANUAL" est enregistré avec ancienMode: "walking", nouveauMode: "car"
|
||||
Et la métrique "travel_mode.manual_override" est incrémentée
|
||||
Et après 30 minutes, l'auto-détection se réactive automatiquement
|
||||
|
||||
Scénario: Mode stationnaire détecté (arrêt prolongé)
|
||||
Étant donné un utilisateur "iris@roadwave.fr" en mode voiture
|
||||
Et il est arrêté à un feu rouge depuis 2 minutes
|
||||
Quand le système détecte:
|
||||
| Indicateur | Valeur |
|
||||
| Vitesse GPS | 0 km/h |
|
||||
| Activity Recognition | stationary |
|
||||
| Durée d'immobilité | 120 secondes |
|
||||
| Bluetooth connecté | CarPlay |
|
||||
Alors le mode reste "voiture" (pas de changement)
|
||||
Mais un flag "stationary" est activé
|
||||
Et l'audio en cours continue de jouer normalement
|
||||
Et aucun nouveau contenu n'est déclenché automatiquement
|
||||
Et un événement "TRAVEL_MODE_STATIONARY" est enregistré
|
||||
Et la métrique "travel_mode.stationary" est incrémentée
|
||||
|
||||
Scénario: Reprise du mouvement après mode stationnaire
|
||||
Étant donné un utilisateur "jack@roadwave.fr" en mode "voiture stationary"
|
||||
Et il est arrêté depuis 3 minutes
|
||||
Quand le système détecte:
|
||||
| Temps | Vitesse | Activity |
|
||||
| T+0s | 0 km/h | stationary |
|
||||
| T+5s | 10 km/h | automotive |
|
||||
| T+10s | 30 km/h | automotive |
|
||||
Alors le flag "stationary" est désactivé
|
||||
Et le mode "voiture" normal est restauré
|
||||
Et la logique de déclenchement automatique des audio-guides est réactivée
|
||||
Et un événement "TRAVEL_MODE_RESUMED" est enregistré
|
||||
Et la métrique "travel_mode.resumed" est incrémentée
|
||||
|
||||
Scénario: Gestion des permissions de localisation et capteurs
|
||||
Étant donné un utilisateur "kate@roadwave.fr" qui lance l'application
|
||||
Quand les permissions suivantes sont refusées:
|
||||
| Permission | État |
|
||||
| Localisation GPS | Refusée |
|
||||
| Motion & Fitness | Refusée |
|
||||
Alors l'auto-détection du mode est désactivée
|
||||
Et un message s'affiche: "Pour bénéficier de l'expérience optimale, activez les permissions de localisation et mouvement"
|
||||
Et un bouton "Activer les permissions" redirige vers les Réglages
|
||||
Et l'utilisateur doit sélectionner manuellement son mode de déplacement
|
||||
Et un événement "TRAVEL_MODE_PERMISSIONS_DENIED" est enregistré
|
||||
Et la métrique "travel_mode.permissions_denied" est incrémentée
|
||||
|
||||
Scénario: Optimisation de la batterie avec détection adaptative
|
||||
Étant donné un utilisateur "luke@roadwave.fr" avec batterie < 20%
|
||||
Quand le mode économie d'énergie est activé
|
||||
Alors la fréquence de détection du mode est réduite:
|
||||
| Mode normal | Mode économie d'énergie |
|
||||
| Toutes les 5s | Toutes les 30s |
|
||||
Et l'utilisation du GPS est optimisée (requêtes moins fréquentes)
|
||||
Et l'accéléromètre et gyroscope sont consultés moins souvent
|
||||
Et la précision de détection peut être légèrement réduite
|
||||
Et un événement "TRAVEL_MODE_BATTERY_SAVER" est enregistré
|
||||
Et la métrique "travel_mode.battery_saver.enabled" est incrémentée
|
||||
|
||||
Scénario: Historique des modes de déplacement pour statistiques
|
||||
Étant donné un utilisateur "mary@roadwave.fr" qui utilise l'application depuis 1 mois
|
||||
Quand l'utilisateur accède à "Mon compte > Statistiques > Modes de déplacement"
|
||||
Alors l'utilisateur voit un graphique avec répartition:
|
||||
| Mode | Temps total | Pourcentage |
|
||||
| Voiture | 15h 30min | 45% |
|
||||
| Piéton | 12h 10min | 35% |
|
||||
| Vélo | 5h 20min | 15% |
|
||||
| Transports | 1h 40min | 5% |
|
||||
Et des insights sont affichés: "Vous utilisez principalement RoadWave en voiture"
|
||||
Et les données sont conservées de manière agrégée pour respecter le RGPD
|
||||
|
||||
Scénario: Métriques de performance de la détection
|
||||
Étant donné que le système traite 100 000 détections de mode par heure
|
||||
Quand les métriques de performance sont collectées
|
||||
Alors les indicateurs suivants sont respectés:
|
||||
| Métrique | Valeur cible |
|
||||
| Temps de détection du mode | < 100ms |
|
||||
| Précision de détection (voiture) | > 95% |
|
||||
| Précision de détection (piéton) | > 90% |
|
||||
| Précision de détection (vélo) | > 85% |
|
||||
| Taux de transitions incorrectes | < 5% |
|
||||
| Consommation batterie par détection | < 0.01% |
|
||||
Et les métriques sont exportées vers le système de monitoring
|
||||
Et des alertes sont déclenchées si la précision < 80%
|
||||
|
||||
Scénario: A/B testing des algorithmes de détection
|
||||
Étant donné que le système teste 2 algorithmes de détection:
|
||||
| Algorithme | Description |
|
||||
| A | Basé sur CoreMotion uniquement |
|
||||
| B | Combinaison capteurs + ML |
|
||||
Quand un utilisateur "nathan@roadwave.fr" est assigné au groupe B
|
||||
Alors l'algorithme B est utilisé pour la détection
|
||||
Et les métriques de précision sont tracées séparément par algorithme
|
||||
Et les événements incluent le tag "algorithm_version: B"
|
||||
Et après analyse, l'algorithme le plus performant est déployé à 100%
|
||||
191
features/api/audio-guides/gestion-point-manque.feature
Normal file
191
features/api/audio-guides/gestion-point-manque.feature
Normal file
@@ -0,0 +1,191 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @navigation @mvp
|
||||
Fonctionnalité: Gestion des points d'intérêt manqués
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux pouvoir gérer les points d'intérêt que j'ai manqués
|
||||
Afin de compléter mon expérience audio-guide même après avoir dépassé certains points
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système de gestion des points manqués respecte:
|
||||
| Paramètre | Valeur |
|
||||
| Distance max pour considérer "manqué" | 1 km |
|
||||
| Temps max pour considérer "manqué" | 10 minutes |
|
||||
| Possibilité de retour arrière | Oui |
|
||||
| Lecture différée autorisée | Oui |
|
||||
|
||||
Scénario: Détection automatique d'un point manqué en mode voiture
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode voiture à 90 km/h
|
||||
Et elle suit l'audio-guide "Route des Châteaux de la Loire"
|
||||
Et le prochain point d'intérêt est le Château de Chaumont
|
||||
Quand elle dépasse le château sans entrer dans son rayon de déclenchement (400m)
|
||||
Et elle s'éloigne à plus de 1 km du point
|
||||
Alors le système marque le point comme "Manqué"
|
||||
Et une notification discrète s'affiche: "Point manqué : Château de Chaumont"
|
||||
Et le point apparaît dans la section "Points manqués" de la liste
|
||||
Et un événement "POI_MARKED_AS_MISSED" est enregistré avec raison: "out_of_range"
|
||||
Et la métrique "poi.missed.out_of_range" est incrémentée
|
||||
|
||||
Scénario: Affichage de la liste des points manqués
|
||||
Étant donné un utilisateur "bob@roadwave.fr" qui a manqué 3 points sur 10
|
||||
Quand il ouvre la liste des séquences
|
||||
Alors il voit une section dédiée "Points manqués (3)":
|
||||
| Point d'intérêt | Distance actuelle | Actions |
|
||||
| Château de Chaumont | 15 km en arrière | [Écouter] [Y retourner] |
|
||||
| Musée de Cluny | 8 km en arrière | [Écouter] [Y retourner] |
|
||||
| Rue Mouffetard | 2 km en arrière | [Écouter] [Y retourner] |
|
||||
Et un compteur global affiche: "7/10 points visités"
|
||||
Et un événement "MISSED_POIS_LIST_VIEWED" est enregistré
|
||||
Et la métrique "missed_pois.list_viewed" est incrémentée
|
||||
|
||||
Scénario: Écoute différée d'un point manqué sans retour physique
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" qui a manqué le Château de Chaumont
|
||||
Et il est maintenant à 20 km du château
|
||||
Quand il clique sur "Écouter" dans la liste des points manqués
|
||||
Alors l'audio du Château de Chaumont démarre immédiatement
|
||||
Et un bandeau indique: "Écoute différée - Vous n'êtes pas sur place"
|
||||
Et le point reste marqué comme "Manqué mais écouté"
|
||||
Et un événement "MISSED_POI_LISTENED_REMOTE" est enregistré
|
||||
Et la métrique "missed_poi.listened.remote" est incrémentée
|
||||
|
||||
Scénario: Navigation de retour vers un point manqué
|
||||
Étant donné un utilisateur "david@roadwave.fr" qui a manqué le Musée de Cluny
|
||||
Et il est à 5 km du musée
|
||||
Quand il clique sur "Y retourner" dans la liste des points manqués
|
||||
Alors l'application lance la navigation GPS vers le Musée de Cluny
|
||||
Et un itinéraire est calculé et affiché
|
||||
Et l'ETA est affiché: "12 min en voiture"
|
||||
Et un événement "NAVIGATION_TO_MISSED_POI_STARTED" est enregistré
|
||||
Et la métrique "missed_poi.navigation_started" est incrémentée
|
||||
|
||||
Scénario: Retour physique et déclenchement automatique d'un point manqué
|
||||
Étant donné un utilisateur "eve@roadwave.fr" qui a manqué le Château de Chaumont
|
||||
Et elle a cliqué sur "Y retourner"
|
||||
Quand elle arrive dans le rayon de déclenchement du château (400m)
|
||||
Alors l'audio du château démarre automatiquement
|
||||
Et le point passe du statut "Manqué" à "Visité"
|
||||
Et une notification de succès s'affiche: "✓ Point complété : Château de Chaumont"
|
||||
Et un événement "MISSED_POI_COMPLETED" est enregistré
|
||||
Et la métrique "missed_poi.completed" est incrémentée
|
||||
|
||||
Scénario: Proposition automatique de retour pour points manqués à proximité
|
||||
Étant donné un utilisateur "frank@roadwave.fr" qui a manqué la Rue Mouffetard
|
||||
Et il continue son parcours et arrive près d'un autre point
|
||||
Quand le système détecte qu'il est à 800m de la Rue Mouffetard
|
||||
Alors une notification proactive s'affiche: "Point manqué à proximité : Rue Mouffetard (800m). Y aller ?"
|
||||
Et deux boutons sont proposés: [Oui, y aller] [Non, continuer]
|
||||
Et un événement "MISSED_POI_PROXIMITY_SUGGESTION" est enregistré
|
||||
Et la métrique "missed_poi.proximity_suggestion" est incrémentée
|
||||
|
||||
Scénario: Ignorance volontaire d'un point manqué
|
||||
Étant donné un utilisateur "grace@roadwave.fr" qui a manqué le Musée de Cluny
|
||||
Et elle ne souhaite pas y retourner
|
||||
Quand elle fait glisser le point vers la gauche dans la liste
|
||||
Et clique sur "Ignorer définitivement"
|
||||
Alors le point est retiré de la liste des points manqués
|
||||
Et il passe au statut "Ignoré"
|
||||
Et il ne sera plus proposé dans les suggestions
|
||||
Et un événement "MISSED_POI_IGNORED" est enregistré
|
||||
Et la métrique "missed_poi.ignored" est incrémentée
|
||||
|
||||
Scénario: Réinitialisation d'un point ignoré
|
||||
Étant donné un utilisateur "henry@roadwave.fr" qui a ignoré le Musée de Cluny
|
||||
Quand il accède aux paramètres de l'audio-guide
|
||||
Et clique sur "Voir les points ignorés (1)"
|
||||
Alors il voit la liste: "Musée de Cluny - Ignoré"
|
||||
Quand il clique sur "Réactiver"
|
||||
Alors le point repasse en statut "Manqué"
|
||||
Et il réapparaît dans la liste des points manqués
|
||||
Et un événement "MISSED_POI_REACTIVATED" est enregistré
|
||||
Et la métrique "missed_poi.reactivated" est incrémentée
|
||||
|
||||
Scénario: Marquage automatique comme manqué après délai en mode piéton
|
||||
Étant donné un utilisateur "iris@roadwave.fr" en mode piéton
|
||||
Et elle est à 150m du Panthéon depuis 15 minutes (stationnaire)
|
||||
Et elle n'a pas déclenché le point d'intérêt
|
||||
Quand elle reprend sa marche et s'éloigne à plus de 500m
|
||||
Alors le point est marqué comme "Manqué"
|
||||
Et une notification s'affiche: "Point manqué : Panthéon. Voulez-vous y retourner ?"
|
||||
Et un événement "POI_MARKED_AS_MISSED" est enregistré avec raison: "timeout_stationary"
|
||||
Et la métrique "poi.missed.timeout" est incrémentée
|
||||
|
||||
Scénario: Statistiques des points manqués en fin de parcours
|
||||
Étant donné un utilisateur "jack@roadwave.fr" qui a terminé un audio-guide
|
||||
Et il a visité 7 points sur 10, manqué 2 points et ignoré 1 point
|
||||
Quand il consulte l'écran de fin de parcours
|
||||
Alors il voit les statistiques:
|
||||
| Métrique | Valeur |
|
||||
| Points visités | 7/10 (70%) |
|
||||
| Points manqués | 2 (Chaumont, Cluny) |
|
||||
| Points ignorés | 1 (Rue Mouffetard) |
|
||||
| Taux de complétion | 70% |
|
||||
| Badge obtenu | Explorateur Bronze |
|
||||
Et un bouton "Compléter les points manqués" est proposé
|
||||
Et un événement "AUDIO_GUIDE_STATS_VIEWED" est enregistré
|
||||
|
||||
Scénario: Reprise d'un audio-guide pour compléter les points manqués
|
||||
Étant donné un utilisateur "kate@roadwave.fr" qui a terminé un audio-guide avec 2 points manqués
|
||||
Quand elle clique sur "Compléter les points manqués"
|
||||
Alors l'audio-guide est réactivé en mode "Rattrapage"
|
||||
Et seuls les 2 points manqués sont actifs sur la carte
|
||||
Et les points déjà visités sont grisés
|
||||
Et la navigation se concentre uniquement sur les points manqués
|
||||
Et un événement "AUDIO_GUIDE_CATCH_UP_MODE" est enregistré
|
||||
Et la métrique "audio_guide.catch_up.started" est incrémentée
|
||||
|
||||
Scénario: Badge de complétion "Perfectionniste" pour 100% de complétion
|
||||
Étant donné un utilisateur "luke@roadwave.fr" qui a visité 10/10 points
|
||||
Et il a initialement manqué 2 points mais y est retourné
|
||||
Quand il termine l'audio-guide avec 100% de complétion
|
||||
Alors un badge spécial "Perfectionniste" est débloqué
|
||||
Et une animation de célébration est affichée
|
||||
Et un événement "BADGE_PERFECTIONIST_UNLOCKED" est enregistré
|
||||
Et la métrique "badges.perfectionist.unlocked" est incrémentée
|
||||
|
||||
Scénario: Notification push après 24h pour rappel des points manqués
|
||||
Étant donné un utilisateur "mary@roadwave.fr" qui a terminé un audio-guide hier
|
||||
Et elle a manqué 3 points sur 10
|
||||
Quand 24 heures se sont écoulées depuis la fin du parcours
|
||||
Alors une notification push est envoyée:
|
||||
"Vous avez manqué 3 points lors de votre visite du Quartier Latin. Voulez-vous les découvrir ?"
|
||||
Et un lien direct vers la liste des points manqués est inclus
|
||||
Et un événement "MISSED_POIS_REMINDER_SENT" est enregistré
|
||||
Et la métrique "missed_pois.reminder_sent" est incrémentée
|
||||
|
||||
Scénario: Mode "Rattrapage intelligent" avec optimisation de l'itinéraire
|
||||
Étant donné un utilisateur "nathan@roadwave.fr" avec 3 points manqués:
|
||||
| Point | Position actuelle | Distance |
|
||||
| Château de Chaumont | 48.8475, 2.3450 | 12 km |
|
||||
| Musée de Cluny | 48.8505, 2.3434 | 8 km |
|
||||
| Rue Mouffetard | 48.8429, 2.3498 | 5 km |
|
||||
Quand il clique sur "Itinéraire optimisé pour rattrapage"
|
||||
Alors le système calcule l'itinéraire le plus court pour visiter les 3 points:
|
||||
| Ordre | Point | Distance cumulée |
|
||||
| 1 | Rue Mouffetard | 5 km |
|
||||
| 2 | Musée de Cluny | 8.5 km |
|
||||
| 3 | Château de Chaumont | 20.5 km |
|
||||
Et l'ETA total est affiché: "1h 15min en voiture"
|
||||
Et un événement "OPTIMIZED_CATCH_UP_ROUTE_CALCULATED" est enregistré
|
||||
Et la métrique "missed_pois.optimized_route" est incrémentée
|
||||
|
||||
Scénario: Désactivation de la détection automatique des points manqués
|
||||
Étant donné un utilisateur "olive@roadwave.fr" qui préfère une expérience libre
|
||||
Quand elle active l'option "Désactiver la détection des points manqués"
|
||||
Alors les points ne sont jamais marqués comme "Manqués"
|
||||
Et aucune notification de point manqué n'est affichée
|
||||
Et l'utilisateur peut toujours écouter tous les points manuellement
|
||||
Et un événement "MISSED_POIS_DETECTION_DISABLED" est enregistré
|
||||
Et la métrique "missed_pois.detection_disabled" est incrémentée
|
||||
|
||||
Scénario: Métriques de performance de la gestion des points manqués
|
||||
Étant donné que 10 000 utilisateurs ont terminé des audio-guides
|
||||
Quand les métriques sont collectées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur moyenne |
|
||||
| Pourcentage de points manqués par parcours| 18% |
|
||||
| Taux de retour aux points manqués | 35% |
|
||||
| Taux d'écoute différée (sans retour) | 55% |
|
||||
| Taux d'ignorance définitive | 10% |
|
||||
| Taux de complétion après rattrapage | 92% |
|
||||
Et les métriques sont exportées vers le système de monitoring
|
||||
@@ -0,0 +1,91 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @cycling @transit @mvp
|
||||
Fonctionnalité: Modes vélo et transports en commun complets
|
||||
|
||||
En tant qu'utilisateur à vélo ou en transports
|
||||
Je veux une expérience adaptée à mon mode de déplacement
|
||||
Afin de profiter des audio-guides en toute sécurité
|
||||
|
||||
Contexte:
|
||||
Étant donné les caractéristiques des modes:
|
||||
| Mode | Vitesse moyenne | Notifications | Auto-play |
|
||||
| Vélo | 15-20 km/h | Audio priority| Optionnel |
|
||||
| Transports | 30-40 km/h | Visuelles OK | Aux arrêts|
|
||||
|
||||
Scénario: Mode vélo avec notifications audio prioritaires
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode vélo à 18 km/h
|
||||
Quand elle approche d'un point d'intérêt
|
||||
Alors une notification audio est jouée (sécurité)
|
||||
Et les notifications visuelles sont minimales
|
||||
Et l'auto-play est optionnel (configurable)
|
||||
Et un événement "CYCLING_MODE_POI_NOTIFICATION" est enregistré
|
||||
|
||||
Scénario: Mode transports avec détection des arrêts/stations
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en mode transports
|
||||
Quand le système détecte un arrêt prolongé (station)
|
||||
Alors l'audio-guide peut se déclencher à la station
|
||||
Et les informations visuelles sont complètes
|
||||
Et un événement "TRANSIT_STOP_DETECTED" est enregistré
|
||||
|
||||
Scénario: Adaptation du rayon de déclenchement en mode vélo
|
||||
Étant donné un créateur "charlie@roadwave.fr" avec rayon adaptatif activé
|
||||
Quand un utilisateur en mode vélo approche du POI
|
||||
Alors le rayon est augmenté de 50% (anticipation)
|
||||
Et le déclenchement se fait plus tôt
|
||||
Et un événement "CYCLING_RADIUS_ADAPTED" est enregistré
|
||||
|
||||
Scénario: Gestion des tunnels en mode transports
|
||||
Étant donné un utilisateur "david@roadwave.fr" en métro
|
||||
Quand il entre dans un tunnel (perte GPS)
|
||||
Alors la position est estimée selon la ligne de métro
|
||||
Et les séquences continuent de se jouer normalement
|
||||
Et un événement "TRANSIT_TUNNEL_MODE" est enregistré
|
||||
|
||||
Scénario: Sécurité en mode vélo - pause automatique si danger
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en mode vélo
|
||||
Quand une accélération brusque est détectée (freinage)
|
||||
Alors l'audio se met en pause automatiquement
|
||||
Et reprend quand la vitesse se stabilise
|
||||
Et un événement "CYCLING_SAFETY_PAUSE" est enregistré
|
||||
|
||||
Scénario: Mode transports avec synchronisation aux horaires
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en bus
|
||||
Quand le système détecte les arrêts réguliers
|
||||
Alors les séquences sont synchronisées aux stations
|
||||
Et l'ETA est calculé selon les arrêts
|
||||
Et un événement "TRANSIT_SCHEDULE_SYNC" est enregistré
|
||||
|
||||
Scénario: Statistiques spécifiques au mode vélo
|
||||
Étant donné un utilisateur "grace@roadwave.fr" qui termine un audio-guide à vélo
|
||||
Alors il voit des statistiques adaptées:
|
||||
| Métrique | Valeur |
|
||||
| Distance parcourue | 12.5 km |
|
||||
| Temps de trajet | 45 min |
|
||||
| Vitesse moyenne | 16.7 km/h |
|
||||
| Dénivelé positif | 120m |
|
||||
Et un événement "CYCLING_STATS_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Détection automatique changement vélo → transports
|
||||
Étant donné un utilisateur "henry@roadwave.fr" en mode vélo
|
||||
Quand il monte dans un bus avec son vélo
|
||||
Alors le mode bascule automatiquement en "transports"
|
||||
Et l'expérience s'adapte instantanément
|
||||
Et un événement "MODE_SWITCH_CYCLING_TO_TRANSIT" est enregistré
|
||||
|
||||
Scénario: Mode vélo électrique avec détection
|
||||
Étant donné un utilisateur "iris@roadwave.fr" sur un vélo électrique
|
||||
Quand la vitesse moyenne est > 25 km/h (VAE)
|
||||
Alors le système adapte les rayons de déclenchement
|
||||
Et l'ETA est calculé avec vitesse VAE
|
||||
Et un événement "EBIKE_MODE_DETECTED" est enregistré
|
||||
|
||||
Scénario: Métriques de performance modes vélo et transports
|
||||
Étant donné que 10 000 parcours ont été effectués en vélo/transports
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Vélo | Transports |
|
||||
| Taux d'utilisation | 15% | 10% |
|
||||
| Taux de complétion | 82% | 75% |
|
||||
| Vitesse moyenne | 17km/h| 35km/h |
|
||||
| Satisfaction utilisateur | 4.3/5 | 4.1/5 |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
221
features/api/audio-guides/pieton-pub-autoplay.feature
Normal file
221
features/api/audio-guides/pieton-pub-autoplay.feature
Normal file
@@ -0,0 +1,221 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @advertising @pedestrian @mvp
|
||||
Fonctionnalité: Auto-play publicités en mode piéton uniquement
|
||||
|
||||
En tant qu'utilisateur piéton
|
||||
Je peux recevoir des publicités audio en auto-play à proximité de commerces
|
||||
Afin que les commerçants puissent promouvoir leurs offres de manière contextualisée
|
||||
|
||||
Contexte:
|
||||
Étant donné que le système de publicité respecte les règles suivantes:
|
||||
| Règle | Valeur |
|
||||
| Auto-play autorisé uniquement en mode | Piéton |
|
||||
| Durée max d'une publicité | 30 secondes |
|
||||
| Fréquence max par commerce | 1 par jour |
|
||||
| Distance min entre 2 pubs différentes | 200 mètres |
|
||||
| Nombre max de pubs par heure | 3 |
|
||||
| Possibilité de skip après | 5 secondes |
|
||||
|
||||
Scénario: Déclenchement automatique d'une publicité en mode piéton
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode piéton
|
||||
Et elle marche dans la rue avec l'application active
|
||||
Quand elle passe à 30 mètres du café "Le Parisien" avec publicité active
|
||||
Alors la publicité audio "Café Le Parisien - 10% de réduction" démarre automatiquement
|
||||
Et une notification visuelle s'affiche:
|
||||
| Élément | Contenu |
|
||||
| Icône | Logo du café |
|
||||
| Titre | Publicité - Le Parisien |
|
||||
| Distance | À 30m de vous |
|
||||
| Action | [Passer] disponible après 5s |
|
||||
| Durée | 0:25 |
|
||||
Et l'audio en cours (si existant) est mis en pause
|
||||
Et un événement "AD_AUTOPLAY_TRIGGERED" est enregistré
|
||||
Et la métrique "ads.autoplay.triggered" est incrémentée
|
||||
|
||||
Scénario: Aucun auto-play en mode voiture
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en mode voiture
|
||||
Et il roule à 40 km/h avec l'application active
|
||||
Quand il passe à 30 mètres d'un commerce avec publicité active
|
||||
Alors aucune publicité n'est déclenchée automatiquement
|
||||
Et la publicité peut être affichée dans la liste "Publicités à proximité"
|
||||
Et l'utilisateur peut choisir manuellement de l'écouter
|
||||
Et un événement "AD_SKIPPED_CAR_MODE" est enregistré
|
||||
Et la métrique "ads.skipped.car_mode" est incrémentée
|
||||
|
||||
Scénario: Aucun auto-play en mode vélo
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" en mode vélo
|
||||
Et il roule à 15 km/h avec l'application active
|
||||
Quand il passe à 30 mètres d'un commerce avec publicité active
|
||||
Alors aucune publicité n'est déclenchée automatiquement
|
||||
Et la sécurité de l'utilisateur à vélo est préservée
|
||||
Et un événement "AD_SKIPPED_CYCLING_MODE" est enregistré
|
||||
Et la métrique "ads.skipped.cycling_mode" est incrémentée
|
||||
|
||||
Scénario: Skip d'une publicité après 5 secondes
|
||||
Étant donné un utilisateur "david@roadwave.fr" en mode piéton
|
||||
Et une publicité a démarré automatiquement il y a 6 secondes
|
||||
Quand l'utilisateur clique sur le bouton "Passer"
|
||||
Alors la publicité s'arrête immédiatement
|
||||
Et l'audio en cours précédent reprend (si existant)
|
||||
Et un événement "AD_SKIPPED_BY_USER" est enregistré avec temps_ecoute: 6s
|
||||
Et la métrique "ads.skipped.by_user" est incrémentée
|
||||
Et le commerçant est facturé pour 6 secondes d'écoute seulement
|
||||
|
||||
Scénario: Bouton "Passer" désactivé pendant les 5 premières secondes
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en mode piéton
|
||||
Et une publicité vient de démarrer
|
||||
Quand l'utilisateur clique sur le bouton "Passer" à T+2 secondes
|
||||
Alors le bouton est grisé et non cliquable
|
||||
Et un message s'affiche: "Disponible dans 3 secondes"
|
||||
Et un compteur à rebours est visible: 3... 2... 1...
|
||||
Alors à T+5 secondes, le bouton devient actif
|
||||
Et un événement "AD_SKIP_ATTEMPTED_TOO_EARLY" est enregistré
|
||||
Et la métrique "ads.skip.too_early" est incrémentée
|
||||
|
||||
Scénario: Publicité écoutée en entier
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en mode piéton
|
||||
Et une publicité de 25 secondes a démarré automatiquement
|
||||
Quand l'utilisateur écoute la publicité jusqu'à la fin sans cliquer sur "Passer"
|
||||
Alors la publicité se termine naturellement
|
||||
Et l'audio en cours précédent reprend automatiquement
|
||||
Et un événement "AD_COMPLETED" est enregistré avec temps_ecoute: 25s
|
||||
Et la métrique "ads.completed" est incrémentée
|
||||
Et le commerçant est facturé pour la publicité complète (tarif plein)
|
||||
|
||||
Scénario: Limitation à 3 publicités par heure
|
||||
Étant donné un utilisateur "grace@roadwave.fr" en mode piéton
|
||||
Et elle a déjà écouté 3 publicités dans la dernière heure:
|
||||
| Commerce | Temps écoulé |
|
||||
| Café Le Parisien | Il y a 10min |
|
||||
| Boulangerie Paul | Il y a 30min |
|
||||
| Restaurant Tokyo | Il y a 50min |
|
||||
Quand elle passe à 30 mètres d'un 4ème commerce avec publicité
|
||||
Alors aucune publicité n'est déclenchée automatiquement
|
||||
Et un compteur s'affiche discrètement: "Prochaine pub disponible dans 10 min"
|
||||
Et un événement "AD_RATE_LIMITED" est enregistré
|
||||
Et la métrique "ads.rate_limited" est incrémentée
|
||||
|
||||
Scénario: Limitation à 1 publicité par commerce par jour
|
||||
Étant donné un utilisateur "henry@roadwave.fr" en mode piéton
|
||||
Et il a déjà écouté la publicité du "Café Le Parisien" ce matin à 10h
|
||||
Quand il repasse devant le même café à 16h
|
||||
Alors aucune publicité n'est déclenchée automatiquement
|
||||
Et le café n'apparaît pas dans la liste "Publicités à proximité"
|
||||
Et un événement "AD_ALREADY_SHOWN_TODAY" est enregistré
|
||||
Et la métrique "ads.deduplication.same_day" est incrémentée
|
||||
|
||||
Scénario: Distance minimale de 200m entre 2 publicités différentes
|
||||
Étant donné un utilisateur "iris@roadwave.fr" en mode piéton
|
||||
Et elle vient d'écouter une publicité du "Café Le Parisien" il y a 1 minute
|
||||
Quand elle marche et passe à 50 mètres de la "Boulangerie Paul" (150m du café)
|
||||
Alors aucune publicité n'est déclenchée automatiquement
|
||||
Et un événement "AD_TOO_CLOSE_TO_PREVIOUS" est enregistré
|
||||
Et la métrique "ads.skipped.too_close" est incrémentée
|
||||
Quand elle continue et passe à 250 mètres de la "Librairie Gibert" (250m du café)
|
||||
Alors la publicité de la librairie peut être déclenchée
|
||||
|
||||
Scénario: Désactivation complète des publicités (utilisateur Premium)
|
||||
Étant donné un utilisateur "jack@roadwave.fr" Premium en mode piéton
|
||||
Et il a désactivé les publicités dans ses paramètres
|
||||
Quand il passe à 30 mètres de commerces avec publicités actives
|
||||
Alors aucune publicité n'est jamais déclenchée
|
||||
Et aucune publicité n'apparaît dans la liste "Publicités à proximité"
|
||||
Et un événement "AD_BLOCKED_PREMIUM" est enregistré
|
||||
Et la métrique "ads.blocked.premium" est incrémentée
|
||||
|
||||
Scénario: Mise en pause de l'audio en cours lors du déclenchement d'une pub
|
||||
Étant donné un utilisateur "kate@roadwave.fr" en mode piéton
|
||||
Et elle écoute un podcast "Histoire de Paris" à la position 12min 30s
|
||||
Quand une publicité se déclenche automatiquement
|
||||
Alors le podcast est mis en pause immédiatement
|
||||
Et la position de lecture est sauvegardée: 12min 30s
|
||||
Et la publicité démarre
|
||||
Quand la publicité se termine (skip ou écoute complète)
|
||||
Alors le podcast reprend automatiquement à la position 12min 30s
|
||||
Et un événement "AD_CONTENT_PAUSED_RESUMED" est enregistré
|
||||
Et la métrique "ads.content.paused_resumed" est incrémentée
|
||||
|
||||
Scénario: Ciblage géographique précis de la publicité
|
||||
Étant donné un commerçant "Le Parisien" avec publicité active
|
||||
Et il a configuré un rayon de déclenchement de 50 mètres
|
||||
Et un utilisateur "luke@roadwave.fr" en mode piéton
|
||||
Quand l'utilisateur est à 60 mètres du commerce
|
||||
Alors aucune publicité n'est déclenchée
|
||||
Quand l'utilisateur marche et arrive à 45 mètres du commerce
|
||||
Alors la publicité se déclenche automatiquement
|
||||
Et un événement "AD_GEO_TRIGGERED" est enregistré avec distance: 45m
|
||||
Et la métrique "ads.geo.triggered" est incrémentée
|
||||
|
||||
Scénario: Publicité contextuelle basée sur les intérêts de l'utilisateur
|
||||
Étant donné un utilisateur "mary@roadwave.fr" en mode piéton
|
||||
Et ses jauges d'intérêts sont:
|
||||
| Catégorie | Niveau |
|
||||
| Gastronomie | 85% |
|
||||
| Culture | 60% |
|
||||
| Sport | 20% |
|
||||
Et deux commerces ont des publicités actives à proximité:
|
||||
| Commerce | Catégorie | Distance |
|
||||
| Restaurant Le Gourmet | Gastronomie | 40m |
|
||||
| Salle de sport FitClub| Sport | 35m |
|
||||
Quand l'utilisateur passe à proximité des deux commerces
|
||||
Alors la publicité du restaurant est priorisée et déclenchée
|
||||
Et la publicité de la salle de sport est ignorée (faible intérêt)
|
||||
Et un événement "AD_INTEREST_MATCHED" est enregistré avec categorie: "gastronomie", score: 85
|
||||
Et la métrique "ads.interest_matching.applied" est incrémentée
|
||||
|
||||
Scénario: Affichage d'informations complémentaires pendant la publicité
|
||||
Étant donné un utilisateur "nathan@roadwave.fr" en mode piéton
|
||||
Et une publicité du "Café Le Parisien" est en cours de lecture
|
||||
Quand l'utilisateur consulte l'écran
|
||||
Alors il voit les informations suivantes:
|
||||
| Élément | Contenu |
|
||||
| Logo du commerce | [Image] |
|
||||
| Nom du commerce | Café Le Parisien |
|
||||
| Type d'établissement | Café-Brasserie |
|
||||
| Distance | À 30m de vous |
|
||||
| Itinéraire | [Bouton "Y aller"] |
|
||||
| Offre spéciale | 10% de réduction avec ce code: ROADWAVE10|
|
||||
| Horaires | Ouvert maintenant - Ferme à 22h |
|
||||
| Note | 4.5/5 (230 avis) |
|
||||
Et l'utilisateur peut cliquer sur "Y aller" pour lancer la navigation
|
||||
Et un événement "AD_INFO_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Tracking de la conversion (visite effective du commerce)
|
||||
Étant donné un utilisateur "olive@roadwave.fr" en mode piéton
|
||||
Et elle a écouté la publicité du "Café Le Parisien" il y a 5 minutes
|
||||
Quand elle clique sur "Y aller" et se rend au café
|
||||
Et entre dans un rayon de 10 mètres du café
|
||||
Alors un événement "AD_CONVERSION_VISIT" est enregistré
|
||||
Et la métrique "ads.conversions.visits" est incrémentée
|
||||
Et le commerçant voit cette conversion dans ses statistiques
|
||||
Et une notification discrète s'affiche: "Profitez de votre réduction avec le code ROADWAVE10"
|
||||
|
||||
Scénario: Métriques de performance des publicités pour les commerçants
|
||||
Étant donné un commerçant "Le Parisien" avec publicité active depuis 7 jours
|
||||
Quand le commerçant consulte ses statistiques
|
||||
Alors il voit les métriques suivantes:
|
||||
| Métrique | Valeur |
|
||||
| Nombre d'impressions (déclenchements)| 450 |
|
||||
| Taux d'écoute complète | 35% |
|
||||
| Taux de skip moyen | 65% |
|
||||
| Durée moyenne d'écoute | 12s |
|
||||
| Nombre de clics "Y aller" | 25 |
|
||||
| Nombre de visites confirmées | 18 |
|
||||
| Taux de conversion | 4% |
|
||||
| Coût total | 45€ |
|
||||
| Coût par visite | 2.50€ |
|
||||
Et les métriques sont mises à jour en temps réel
|
||||
|
||||
Scénario: A/B testing des publicités pour optimisation
|
||||
Étant donné un commerçant "Le Parisien" avec 2 versions de publicité:
|
||||
| Version | Description | Durée |
|
||||
| A | Voix masculine, tonalité formelle | 25s |
|
||||
| B | Voix féminine, tonalité décontractée | 25s |
|
||||
Quand le système diffuse aléatoirement les 2 versions (50/50)
|
||||
Alors les métriques sont collectées séparément:
|
||||
| Métrique | Version A | Version B |
|
||||
| Taux d'écoute complète | 32% | 42% |
|
||||
| Taux de conversion | 3.5% | 5.2% |
|
||||
Et le commerçant peut choisir de diffuser uniquement la version B
|
||||
Et un événement "AD_AB_TEST_COMPLETED" est enregistré
|
||||
111
features/api/audio-guides/publicites-complet.feature
Normal file
111
features/api/audio-guides/publicites-complet.feature
Normal file
@@ -0,0 +1,111 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @advertising @mvp
|
||||
Fonctionnalité: Système de publicités complet
|
||||
|
||||
En tant que plateforme
|
||||
Je veux gérer un système publicitaire équilibré et non intrusif
|
||||
Afin de monétiser la plateforme tout en préservant l'expérience utilisateur
|
||||
|
||||
Contexte:
|
||||
Étant donné les règles publicitaires:
|
||||
| Règle | Valeur |
|
||||
| Durée max publicité | 30s |
|
||||
| Fréquence max par heure | 3 |
|
||||
| Skip autorisé après | 5s |
|
||||
| Mode auto-play | Piéton only |
|
||||
| Premium sans pub | Oui |
|
||||
|
||||
Scénario: Insertion intelligente de publicité entre séquences
|
||||
Étant donné un utilisateur "alice@roadwave.fr" Free en mode piéton
|
||||
Quand elle termine l'écoute d'une séquence
|
||||
Et marche vers la suivante (temps de trajet: 5 min)
|
||||
Alors une publicité peut être insérée pendant le trajet
|
||||
Et elle ne coupe jamais une séquence en cours
|
||||
Et un événement "AD_INSERTED_BETWEEN_SEQUENCES" est enregistré
|
||||
|
||||
Scénario: Ciblage géographique et contextuel des publicités
|
||||
Étant donné un utilisateur "bob@roadwave.fr" près de restaurants
|
||||
Et ses intérêts incluent "Gastronomie" à 80%
|
||||
Quand une publicité doit être affichée
|
||||
Alors le système priorise les restaurants à proximité
|
||||
Et match les intérêts de l'utilisateur
|
||||
Et un événement "AD_TARGETED" est enregistré avec score_match: 95
|
||||
|
||||
Scénario: Format publicitaire audio + visuel
|
||||
Étant donné une publicité pour le "Café Le Parisien"
|
||||
Quand elle est diffusée
|
||||
Alors l'audio est joué (max 30s)
|
||||
Et une carte visuelle s'affiche avec:
|
||||
| Élément | Contenu |
|
||||
| Logo | Image du commerce |
|
||||
| Offre spéciale | -10% avec code ROAD10 |
|
||||
| Distance | À 50m |
|
||||
| Bouton CTA | [Y aller] [Sauvegarder]|
|
||||
Et un événement "AD_DISPLAYED_FULL" est enregistré
|
||||
|
||||
Scénario: Facturation au CPM et CPC pour annonceurs
|
||||
Étant donné un commerce "Le Parisien" avec budget pub
|
||||
Quand sa publicité est diffusée 1000 fois (impressions)
|
||||
Alors il est facturé selon le modèle CPM: 5€ pour 1000 impressions
|
||||
Quand 50 utilisateurs cliquent sur "Y aller"
|
||||
Alors il est facturé selon le CPC: 0.50€ par clic
|
||||
Et un événement "AD_BILLING_CALCULATED" est enregistré
|
||||
|
||||
Scénario: Dashboard annonceur avec statistiques détaillées
|
||||
Étant donné un annonceur "Restaurant Tokyo" connecté
|
||||
Quand il consulte son dashboard
|
||||
Alors il voit les métriques en temps réel:
|
||||
| Métrique | Valeur |
|
||||
| Impressions (7 jours) | 2 450 |
|
||||
| Taux d'écoute complète | 38% |
|
||||
| Clics "Y aller" | 125 |
|
||||
| Visites confirmées | 45 |
|
||||
| Taux de conversion | 1.8% |
|
||||
| Budget dépensé | 42.50€ |
|
||||
| Coût par visite | 0.94€ |
|
||||
Et un événement "AD_DASHBOARD_VIEWED" est enregistré
|
||||
|
||||
Scénario: A/B testing automatisé des créatives publicitaires
|
||||
Étant donné un annonceur avec 3 versions de publicité
|
||||
Quand le système diffuse les pubs
|
||||
Alors chaque version est diffusée à 33% du trafic
|
||||
Et les performances sont comparées après 1000 impressions
|
||||
Et la meilleure version est automatiquement privilégiée
|
||||
Et un événement "AD_AB_TEST_WINNER_SELECTED" est enregistré
|
||||
|
||||
Scénario: Limite de fréquence stricte pour éviter la saturation
|
||||
Étant donné un utilisateur "charlie@roadwave.fr"
|
||||
Et il a déjà entendu 3 pubs dans la dernière heure
|
||||
Quand le système tente d'insérer une 4ème pub
|
||||
Alors elle est bloquée
|
||||
Et l'utilisateur voit: "Prochaine pub dans 25 min"
|
||||
Et un événement "AD_FREQUENCY_CAP_REACHED" est enregistré
|
||||
|
||||
Scénario: Publicités Premium sponsorisées prioritaires
|
||||
Étant donné un annonceur "Musée du Louvre" avec campagne premium
|
||||
Quand un utilisateur passe à proximité
|
||||
Alors sa publicité est priorisée sur les autres
|
||||
Et elle a un format étendu (45s autorisées)
|
||||
Et un badge "Partenaire officiel" s'affiche
|
||||
Et un événement "AD_PREMIUM_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Sauvegarde d'offres publicitaires pour utilisation ultérieure
|
||||
Étant donné un utilisateur "david@roadwave.fr" qui entend une pub
|
||||
Quand il clique sur "Sauvegarder l'offre"
|
||||
Alors l'offre est ajoutée à "Mes offres sauvegardées"
|
||||
Et il peut la consulter plus tard
|
||||
Et la validité de l'offre est affichée: "Valable jusqu'au 31/03"
|
||||
Et un événement "AD_OFFER_SAVED" est enregistré
|
||||
|
||||
Scénario: Métriques de performance du système publicitaire
|
||||
Étant donné que 100 000 pubs ont été diffusées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Taux de skip moyen | 62% |
|
||||
| Taux d'écoute complète | 38% |
|
||||
| CTR (Click-Through Rate) | 5.2% |
|
||||
| Taux de conversion (visites) | 3.1% |
|
||||
| Revenu moyen par utilisateur | 2.40€/an |
|
||||
| Satisfaction utilisateurs | 3.8/5 |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
123
features/api/audio-guides/rayon-configurable-createur.feature
Normal file
123
features/api/audio-guides/rayon-configurable-createur.feature
Normal file
@@ -0,0 +1,123 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @content-creation @mvp
|
||||
Fonctionnalité: Rayon de déclenchement configurable par le créateur
|
||||
|
||||
En tant que créateur de contenu
|
||||
Je veux configurer le rayon de déclenchement de chaque point d'intérêt
|
||||
Afin d'adapter l'expérience selon le type de lieu et le contexte
|
||||
|
||||
Contexte:
|
||||
Étant donné que les rayons configurables respectent:
|
||||
| Paramètre | Valeur |
|
||||
| Rayon minimum | 10 mètres |
|
||||
| Rayon maximum | 500 mètres |
|
||||
| Rayon par défaut | 100 mètres |
|
||||
| Ajustement | Par pas de 10m |
|
||||
|
||||
Scénario: Configuration du rayon lors de la création d'une séquence
|
||||
Étant donné un créateur "alice@roadwave.fr" qui ajoute un point d'intérêt
|
||||
Quand elle place un marqueur pour "Cathédrale Notre-Dame"
|
||||
Alors un slider de rayon s'affiche avec:
|
||||
| Élément | Valeur |
|
||||
| Rayon actuel | 100m (défaut) |
|
||||
| Rayon minimum | 10m |
|
||||
| Rayon maximum | 500m |
|
||||
| Visualisation | Cercle sur la carte |
|
||||
Et elle peut ajuster le rayon à 150m
|
||||
Alors le cercle sur la carte s'agrandit à 150m de rayon
|
||||
Et un événement "POI_RADIUS_CONFIGURED" est enregistré avec rayon: 150
|
||||
Et la métrique "poi.radius.configured" est incrémentée
|
||||
|
||||
Scénario: Rayon petit pour monuments précis (10-50m)
|
||||
Étant donné un créateur "bob@roadwave.fr" qui crée un audio-guide urbain
|
||||
Quand il configure un point pour une statue spécifique
|
||||
Et définit le rayon à 20m
|
||||
Alors le déclenchement sera très précis (proximité immédiate)
|
||||
Et le système valide que le rayon est suffisant
|
||||
Et un événement "POI_RADIUS_SMALL" est enregistré
|
||||
Et la métrique "poi.radius.small" est incrémentée
|
||||
|
||||
Scénario: Rayon large pour zones étendues (200-500m)
|
||||
Étant donné un créateur "charlie@roadwave.fr" qui crée un audio-guide de parc
|
||||
Quand il configure un point pour "Jardin du Luxembourg"
|
||||
Et définit le rayon à 300m
|
||||
Alors le déclenchement sera anticipé (approche du parc)
|
||||
Et le système valide que le rayon n'est pas excessif
|
||||
Et un événement "POI_RADIUS_LARGE" est enregistré
|
||||
Et la métrique "poi.radius.large" est incrémentée
|
||||
|
||||
Scénario: Visualisation en temps réel du rayon sur la carte
|
||||
Étant donné un créateur "david@roadwave.fr" qui ajuste un rayon
|
||||
Quand il déplace le slider de 100m à 250m
|
||||
Alors le cercle sur la carte s'agrandit en temps réel
|
||||
Et la zone de déclenchement est colorée en semi-transparent
|
||||
Et le rayon en mètres est affiché sur la carte
|
||||
Et un événement "POI_RADIUS_VISUALIZED" est enregistré
|
||||
|
||||
Scénario: Suggestions de rayon basées sur le type de lieu
|
||||
Étant donné un créateur "eve@roadwave.fr" qui ajoute un POI
|
||||
Quand elle sélectionne le type "Monument"
|
||||
Alors le système suggère un rayon de 50m
|
||||
Quand elle sélectionne le type "Parc/Jardin"
|
||||
Alors le système suggère un rayon de 200m
|
||||
Quand elle sélectionne le type "Vue panoramique"
|
||||
Alors le système suggère un rayon de 100m
|
||||
Et un événement "POI_RADIUS_SUGGESTED" est enregistré
|
||||
|
||||
Scénario: Test de simulation du déclenchement
|
||||
Étant donné un créateur "frank@roadwave.fr" qui configure un rayon de 150m
|
||||
Quand il clique sur "Tester le déclenchement"
|
||||
Alors une simulation GPS démarre
|
||||
Et il peut voir à quelle distance le point se déclencherait
|
||||
Et ajuster le rayon si nécessaire
|
||||
Et un événement "POI_RADIUS_TESTED" est enregistré
|
||||
|
||||
Scénario: Modification du rayon après publication
|
||||
Étant donné un créateur "grace@roadwave.fr" avec audio-guide publié
|
||||
Et elle constate que le rayon de 50m est trop petit (retours utilisateurs)
|
||||
Quand elle modifie le rayon à 120m
|
||||
Alors la modification prend effet immédiatement
|
||||
Et tous les futurs déclenchements utilisent le nouveau rayon
|
||||
Et un événement "POI_RADIUS_UPDATED" est enregistré
|
||||
|
||||
Scénario: Détection de chevauchements entre rayons
|
||||
Étant donné un créateur "henry@roadwave.fr" avec 2 points proches
|
||||
Quand les cercles de rayon se chevauchent à plus de 50%
|
||||
Alors un avertissement s'affiche: "Attention: chevauchement détecté"
|
||||
Et une suggestion est proposée: "Réduire les rayons ou espacer les points"
|
||||
Et un événement "POI_RADIUS_OVERLAP_DETECTED" est enregistré
|
||||
|
||||
Scénario: Rayons adaptatifs selon le mode de déplacement
|
||||
Étant donné un créateur "iris@roadwave.fr" qui configure un point
|
||||
Quand elle active "Rayons adaptatifs"
|
||||
Alors le système configure automatiquement:
|
||||
| Mode | Rayon suggéré |
|
||||
| Piéton | 80m |
|
||||
| Vélo | 120m |
|
||||
| Voiture | 300m |
|
||||
Et les utilisateurs bénéficient du rayon optimal selon leur mode
|
||||
Et un événement "POI_RADIUS_ADAPTIVE" est enregistré
|
||||
|
||||
Scénario: Statistiques d'efficacité des rayons
|
||||
Étant donné un créateur "jack@roadwave.fr" avec audio-guide publié
|
||||
Quand il consulte les statistiques de ses POI
|
||||
Alors il voit pour chaque point:
|
||||
| Point | Rayon | Taux déclenchement | Taux manqué |
|
||||
| Notre-Dame | 100m | 95% | 5% |
|
||||
| Sainte-Chapelle| 50m | 78% | 22% |
|
||||
| Panthéon | 150m | 98% | 2% |
|
||||
Et des suggestions d'optimisation sont proposées
|
||||
Et un événement "POI_RADIUS_STATS_VIEWED" est enregistré
|
||||
|
||||
Scénario: Métriques de performance des rayons configurés
|
||||
Étant donné que 5000 POI ont été configurés
|
||||
Quand les métriques sont collectées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur moyenne |
|
||||
| Rayon moyen configuré | 125m |
|
||||
| Rayon le plus petit utilisé | 15m |
|
||||
| Rayon le plus grand utilisé | 450m |
|
||||
| Taux d'ajustement après tests | 35% |
|
||||
| Taux de déclenchement réussi | 88% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
103
features/api/audio-guides/reprise-progression-complet.feature
Normal file
103
features/api/audio-guides/reprise-progression-complet.feature
Normal file
@@ -0,0 +1,103 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @progression @mvp
|
||||
Fonctionnalité: Reprise de progression complète
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux reprendre un audio-guide là où je l'ai laissé
|
||||
Afin de continuer mon expérience sans perdre ma progression
|
||||
|
||||
Contexte:
|
||||
Étant donné que la sauvegarde de progression inclut:
|
||||
| Donnée | Persistance |
|
||||
| Séquences écoutées | Permanente |
|
||||
| Position dans l'audio | 7 jours |
|
||||
| Points manqués | Permanente |
|
||||
| Progression globale | Permanente |
|
||||
|
||||
Scénario: Sauvegarde automatique de la progression
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui écoute une séquence
|
||||
Quand elle ferme l'application à 3min 20s
|
||||
Alors la progression est sauvegardée automatiquement
|
||||
Et la position exacte dans l'audio est conservée
|
||||
Et un événement "PROGRESS_AUTO_SAVED" est enregistré
|
||||
|
||||
Scénario: Reprise après fermeture de l'application
|
||||
Étant donné un utilisateur "bob@roadwave.fr" qui rouvre l'application
|
||||
Et il avait un audio-guide en cours (5/10 séquences)
|
||||
Quand il accède à l'écran d'accueil
|
||||
Alors une carte "Reprendre votre visite" s'affiche:
|
||||
| Élément | Contenu |
|
||||
| Titre audio-guide | Visite du Quartier Latin |
|
||||
| Progression | 5/10 séquences (50%) |
|
||||
| Dernière position | Panthéon - 3min 20s |
|
||||
| Bouton | [Reprendre] |
|
||||
Et un événement "RESUME_CARD_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Reprise exacte de la position audio
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" qui reprend un audio-guide
|
||||
Et il était à 3min 20s dans la séquence "Panthéon"
|
||||
Quand il clique sur "Reprendre"
|
||||
Alors l'audio reprend exactement à 3min 20s
|
||||
Et aucune seconde n'est perdue
|
||||
Et un événement "AUDIO_POSITION_RESTORED" est enregistré
|
||||
|
||||
Scénario: Synchronisation multi-appareils de la progression
|
||||
Étant donné un utilisateur "david@roadwave.fr" qui écoute sur iPhone
|
||||
Et il a complété 3 séquences
|
||||
Quand il passe sur son iPad
|
||||
Alors la progression est synchronisée automatiquement
|
||||
Et il peut reprendre là où il s'était arrêté
|
||||
Et un événement "PROGRESS_SYNCED_CROSS_DEVICE" est enregistré
|
||||
|
||||
Scénario: Historique des audio-guides en cours
|
||||
Étant donné un utilisateur "eve@roadwave.fr" avec 3 audio-guides en cours
|
||||
Quand elle accède à "Mes audio-guides en cours"
|
||||
Alors elle voit la liste:
|
||||
| Audio-guide | Progression | Dernière activité |
|
||||
| Quartier Latin | 5/10 (50%) | Il y a 2 heures |
|
||||
| Châteaux de la Loire | 3/8 (37%) | Il y a 3 jours |
|
||||
| Montmartre | 1/6 (16%) | Il y a 1 semaine |
|
||||
Et elle peut reprendre n'importe lequel
|
||||
Et un événement "IN_PROGRESS_LIST_VIEWED" est enregistré
|
||||
|
||||
Scénario: Expiration de la position audio après 7 jours
|
||||
Étant donné un utilisateur "frank@roadwave.fr" avec audio-guide en pause
|
||||
Et 8 jours se sont écoulés depuis la dernière écoute
|
||||
Quand il reprend l'audio-guide
|
||||
Alors la progression globale est conservée (séquences écoutées)
|
||||
Mais la position exacte dans l'audio est réinitialisée
|
||||
Et un message s'affiche: "La séquence redémarre depuis le début"
|
||||
Et un événement "AUDIO_POSITION_EXPIRED" est enregistré
|
||||
|
||||
Scénario: Badge "Explorateur assidu" pour reprises régulières
|
||||
Étant donné un utilisateur "grace@roadwave.fr" qui reprend 10 audio-guides
|
||||
Quand il complète chacun d'eux après les avoir repris
|
||||
Alors un badge "Explorateur assidu" est débloqué
|
||||
Et un événement "BADGE_PERSISTENT_EXPLORER_UNLOCKED" est enregistré
|
||||
|
||||
Scénario: Notification push de rappel après 3 jours d'inactivité
|
||||
Étant donné un utilisateur "henry@roadwave.fr" avec audio-guide en pause
|
||||
Et 3 jours se sont écoulés sans activité
|
||||
Quand le système envoie des rappels
|
||||
Alors une notification push est envoyée:
|
||||
"Vous avez laissé 'Visite du Quartier Latin' en suspens (5/10). Reprendre ?"
|
||||
Et un événement "RESUME_REMINDER_SENT" est enregistré
|
||||
|
||||
Scénario: Mode hors ligne avec sauvegarde locale
|
||||
Étant donné un utilisateur "iris@roadwave.fr" en mode hors ligne
|
||||
Quand elle écoute un audio-guide sans connexion
|
||||
Alors la progression est sauvegardée localement
|
||||
Et synchronisée automatiquement lors de la reconnexion
|
||||
Et un événement "PROGRESS_SYNCED_AFTER_OFFLINE" est enregistré
|
||||
|
||||
Scénario: Métriques de reprise de progression
|
||||
Étant donné que 10 000 audio-guides ont été mis en pause
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Taux de reprise dans les 24h | 42% |
|
||||
| Taux de reprise dans les 7j | 68% |
|
||||
| Taux d'abandon définitif | 32% |
|
||||
| Temps moyen avant reprise | 2.5 jours|
|
||||
| Taux de complétion après reprise| 78% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
@@ -0,0 +1,75 @@
|
||||
# language: fr
|
||||
|
||||
@api @audio-guides @sync @mvp
|
||||
Fonctionnalité: Sauvegarde et synchronisation de progression
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux que ma progression soit sauvegardée et synchronisée
|
||||
Afin d'accéder à mon historique sur tous mes appareils
|
||||
|
||||
Scénario: Sauvegarde en temps réel dans le cloud
|
||||
Étant donné un utilisateur "alice@roadwave.fr" connecté
|
||||
Quand elle complète une séquence
|
||||
Alors la progression est sauvegardée dans le cloud immédiatement
|
||||
Et un indicateur "Synchronisé" s'affiche
|
||||
Et un événement "PROGRESS_CLOUD_SAVED" est enregistré
|
||||
|
||||
Scénario: Synchronisation automatique au changement d'appareil
|
||||
Étant donné un utilisateur "bob@roadwave.fr" sur iPhone
|
||||
Quand il se connecte sur iPad
|
||||
Alors la progression est téléchargée automatiquement
|
||||
Et synchronisée en arrière-plan (< 2s)
|
||||
Et un événement "PROGRESS_SYNCED_DEVICE_SWITCH" est enregistré
|
||||
|
||||
Scénario: Résolution de conflits de synchronisation
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" avec 2 appareils
|
||||
Et il écoute hors ligne sur les deux simultanément
|
||||
Quand les deux se reconnectent avec progressions différentes
|
||||
Alors le système fusionne intelligemment les données
|
||||
Et conserve la progression la plus avancée
|
||||
Et un événement "SYNC_CONFLICT_RESOLVED" est enregistré
|
||||
|
||||
Scénario: Indicateur de statut de synchronisation
|
||||
Étant donné un utilisateur "david@roadwave.fr"
|
||||
Alors il voit l'icône de statut sync:
|
||||
| État | Icône | Couleur |
|
||||
| Synchronisé | ✓ | Vert |
|
||||
| En cours de sync | ↻ | Orange |
|
||||
| Non synchronisé | ⚠ | Rouge |
|
||||
Et un événement "SYNC_STATUS_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Sauvegarde locale en mode hors ligne
|
||||
Étant donné un utilisateur "eve@roadwave.fr" sans connexion
|
||||
Quand elle écoute un audio-guide hors ligne
|
||||
Alors toutes les données sont sauvegardées localement
|
||||
Et marquées "En attente de synchronisation"
|
||||
Et synchronisées automatiquement lors de la reconnexion
|
||||
Et un événement "OFFLINE_PROGRESS_QUEUED" est enregistré
|
||||
|
||||
Scénario: Export de l'historique de progression
|
||||
Étant donné un utilisateur "frank@roadwave.fr"
|
||||
Quand il demande un export de ses données (RGPD)
|
||||
Alors il reçoit un fichier JSON avec:
|
||||
| Donnée | Format |
|
||||
| Audio-guides écoutés | Liste |
|
||||
| Séquences par guide | Détail |
|
||||
| Timestamps | ISO 8601 |
|
||||
| Positions GPS visitées | Lat/Lon |
|
||||
Et un événement "PROGRESS_EXPORTED" est enregistré
|
||||
|
||||
Scénario: Suppression de progression sur demande
|
||||
Étant donné un utilisateur "grace@roadwave.fr"
|
||||
Quand elle supprime un audio-guide de son historique
|
||||
Alors toutes les données associées sont supprimées
|
||||
Et la synchronisation propage la suppression
|
||||
Et un événement "PROGRESS_DELETED" est enregistré
|
||||
|
||||
Scénario: Métriques de fiabilité de la synchronisation
|
||||
Étant donné que 100 000 synchronisations ont eu lieu
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur cible |
|
||||
| Taux de succès de sync | > 99.5% |
|
||||
| Temps moyen de synchronisation| < 2s |
|
||||
| Taux de conflits | < 0.5% |
|
||||
| Taux de résolution automatique| > 95% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
Reference in New Issue
Block a user