feat(gherkin): ajouter features contenus géolocalisés mode voiture

Ajout et enrichissement des fichiers Gherkin pour les contenus
géolocalisés en mode voiture selon règles métier section 17:

API Backend (notifications-geolocalisees.feature):
- Edge cases haute vitesse (130 km/h, 180 km/h)
- Gestion multiples points géolocalisés proches (800m)
- Cooldown réduit après validations multiples
- Mode stationnement (vitesse < 1 km/h pendant 2 min)

UI Mobile (contenus-geolocalises-voiture.feature) - nouveau fichier:
- Notification visuelle minimaliste (icône + compteur, pas de texte)
- Validation "Suivant" et décompte 5 secondes
- Transitions audio fluides (fade in/out)
- Conformité CarPlay/Android Auto (sonore uniquement)
- Navigation avec contenus géolocalisés
- Annulation décompte et gestion historique

UI Navigation (commande-precedent.feature):
- Comportement "Précédent" avec contenus géolocalisés
- Historique mixte buffer et géolocalisés
- Règle 10s pour replay/retour
- Notification ignorée/annulée n'entre pas dans historique
This commit is contained in:
jpgiannetti
2026-02-02 22:53:13 +01:00
parent a19a901ed4
commit 7d3b32856e
3 changed files with 497 additions and 0 deletions

View File

@@ -175,3 +175,92 @@ Fonctionnalité: Commande "Précédent"
| 5:00 |
| 7:23 |
| 9:50 |
# Comportement avec contenus géolocalisés
Scénario: Précédent après avoir écouté un contenu géolocalisé ≥10s
Étant donné que j'écoute un contenu buffer "C1"
Et qu'une notification géolocalisée "Tour Eiffel" apparaît
Quand j'accepte la notification (décompte 5s)
Et que le contenu géolocalisé démarre
Et que je l'écoute pendant 42 secondes
Quand j'appuie sur "Suivant" (skip)
Alors le contenu buffer suivant "C2" démarre
Et le contenu géolocalisé entre dans l'historique:
"""json
{
"id": "geo_tour_eiffel",
"position_seconds": 42,
"type": "geo_anchored"
}
"""
Quand j'appuie sur "Précédent"
Alors le contenu géolocalisé reprend à 42 secondes
Car j'ai écouté 10 secondes
Scénario: Précédent après avoir écouté un contenu géolocalisé <10s
Étant donné que j'ai accepté un contenu géolocalisé "Château"
Et que je l'ai écouté pendant 5 secondes uniquement
Quand j'appuie sur "Suivant" (skip)
Alors le contenu buffer suivant démarre
Quand j'appuie sur "Précédent"
Alors je reviens au contenu AVANT le géolocalisé
Et le contenu géolocalisé n'est PAS rejoué
Car j'ai écouté < 10 secondes
Scénario: Notification géolocalisée ignorée n'entre PAS dans historique
Étant donné que j'écoute un contenu "A"
Et qu'une notification géolocalisée apparaît (compteur 71)
Quand je n'appuie PAS sur "Suivant" (notification ignorée)
Alors le contenu "A" continue normalement
Et le contenu géolocalisé n'entre PAS dans l'historique
Quand j'appuie sur "Précédent"
Alors je reviens au contenu précédent "A-1"
Et le contenu géolocalisé ignoré n'apparaît jamais
Scénario: Annulation décompte géolocalisé n'entre PAS dans historique
Étant donné qu'une notification géolocalisée est acceptée
Et que le décompte "5" démarre (543...)
Quand j'appuie sur "Suivant" pendant le décompte (annulation)
Alors le décompte est annulé
Et le contenu buffer suivant démarre
Et le contenu géolocalisé n'entre PAS dans l'historique
Quand j'appuie sur "Précédent"
Alors je reviens au contenu avant le décompte
Et le contenu géolocalisé annulé n'apparaît jamais
Scénario: Historique mixte contenus buffer et géolocalisés
Étant donné que j'ai écouté dans l'ordre:
| contenu | type | position_seconds |
| Buffer 1 | contextuel | 180 |
| Géo Tour Eiffel | geo_anchored | 42 |
| Buffer 2 | neutre | 90 |
| Buffer 3 | contextuel | 30 |
Et que j'écoute maintenant "Buffer 4" depuis 2 secondes
Quand j'appuie sur "Précédent" (1ère fois)
Alors je reviens à "Buffer 3" à 30 secondes
Quand j'appuie sur "Précédent" (2ème fois, <10s)
Alors je reviens à "Buffer 2" à 90 secondes
Quand j'appuie sur "Précédent" (3ème fois, <10s)
Alors je reviens à "Géo Tour Eiffel" à 42 secondes
Quand j'appuie sur "Précédent" (4ème fois, <10s)
Alors je reviens à "Buffer 1" à 180 secondes
Scénario: Contenu géolocalisé dans limite FIFO 10 contenus
Étant donné que j'ai un historique de 10 contenus incluant 3 géolocalisés:
| position | contenu | type |
| 1 | Buffer 1 | contextuel |
| 2 | Géo A | geo_anchored |
| 3 | Buffer 2 | neutre |
| 4 | Géo B | geo_anchored |
| 5-9 | Buffer 3-7 | contextuel |
| 10 | Géo C | geo_anchored |
Quand j'ajoute un 11ème contenu "Buffer 8"
Alors "Buffer 1" (le plus ancien) est supprimé
Et l'historique contient:
| position | contenu |
| 1 | Géo A |
| 2 | Buffer 2 |
| ... | ... |
| 10 | Buffer 8 |
Et les contenus géolocalisés suivent la même règle FIFO

View File

@@ -0,0 +1,309 @@
# language: fr
Fonctionnalité: UI - Contenus géolocalisés en mode voiture
En tant qu'utilisateur en mode voiture
Je veux recevoir des notifications visuelles minimalistes pour contenus géolocalisés
Afin d'écouter du contenu pertinent sans distraction dangereuse
Contexte:
Étant donné que l'application RoadWave est ouverte (premier plan)
Et que l'utilisateur est connecté
Et qu'il est en mode voiture (vitesse 5 km/h)
# Affichage notification minimaliste
Scénario: Notification visuelle minimaliste 7 secondes avant arrivée
Étant donné que j'écoute un podcast "Voyage en France"
Et qu'un contenu géolocalisé "Tour Eiffel" existe à 98m
Quand l'API déclenche la notification (ETA 7s)
Alors un son bref (bip 0.5s) est joué
Et une icône 🏛 apparaît en bas de l'écran
Et un compteur "7" s'affiche en grand (72pt, bold, blanc)
Et AUCUN texte n'est affiché (pas de titre, pas de description)
Et le podcast actuel continue de jouer normalement
Scénario: Compteur décrémente visuellement pendant 7 secondes
Étant donné qu'une notification est affichée avec compteur "7"
Quand 1 seconde s'écoule
Alors le compteur affiche "6"
Quand 1 seconde s'écoule
Alors le compteur affiche "5"
Et ainsi de suite jusqu'à "1"
Quand le compteur atteint "0"
Alors la notification disparaît automatiquement
Et le contenu géolocalisé est perdu (non accepté)
Scénario: Icône correspond au tag du contenu géolocalisé
Étant donné que des contenus géolocalisés existent avec différents tags
Quand une notification est affichée
Alors l'icône correspond au tag principal:
| Tag | Icône | Couleur |
| Culture générale | 🏛 | Bleu |
| Histoire | 📜 | Marron |
| Voyage | | Vert |
| Famille | 👨👩👧 | Orange |
| Musique | 🎵 | Rose |
| Sport | | Rouge |
| Technologie | 💻 | Gris |
| Automobile | 🚗 | Noir |
| Politique | 🏛 | Bleu foncé |
| Économie | 📈 | Vert foncé |
| Cryptomonnaie | | Or |
| Santé | 🏥 | Rouge clair |
| Amour | | Rose vif |
Scénario: Notification n'affiche AUCUN texte (sécurité routière)
Étant donné qu'une notification géolocalisée apparaît
Quand je consulte l'interface
Alors je ne vois AUCUN texte à lire:
Pas de titre du contenu
Pas de description
Pas de nom du créateur
Pas de durée
Pas de bouton "Annuler" ou "Plus tard"
Et je vois uniquement:
Une icône (emoji selon tag)
Un compteur chiffré (71)
Et c'est tout (minimalisme absolu)
# Validation "Suivant" et décompte
Scénario: User appuie sur "Suivant" pendant notification
Étant donné qu'une notification affiche "5" (5 secondes restantes)
Quand j'appuie sur le bouton "Suivant" (physique ou tactile)
Alors la notification disparaît avec fade out (0.3s)
Et un nouveau compteur "5" apparaît (décompte 5 secondes)
Et le podcast actuel continue de jouer normalement
Et aucune baisse de volume n'est appliquée
Scénario: Décompte 5 secondes avec contenu actuel qui continue
Étant donné que j'ai cliqué "Suivant" pendant la notification
Et que le décompte "5" démarre
Quand les 5 secondes s'écoulent (54321)
Alors le podcast actuel joue pendant tout le décompte
Et le volume reste à 100% (pas de duck)
Quand le compteur atteint "0"
Alors le podcast actuel fait fade out (0.3s)
Et le contenu géolocalisé fait fade in (0.3s)
Et la transition est fluide sans silence
Scénario: Interface pendant décompte affiche texte contextuel
Étant donné que le décompte "3" est affiché
Quand je consulte l'écran
Alors je vois:
- Le compteur "3" en grand (72pt, centré)
- Le texte "Contenu géolocalisé arrive" en petit en dessous
- Le player actuel en haut (titre, barre de progression, contrôles)
Et l'interface est claire et non distrayante
# Contenu actuel se termine pendant décompte
Scénario: Contenu actuel se termine pendant décompte (buffer démarre)
Étant donné que j'écoute un podcast de 10 minutes
Et qu'il reste 2 secondes de lecture
Quand j'accepte un contenu géolocalisé (décompte 5s démarre)
Et que le podcast se termine après 2 secondes
Alors le contenu suivant du buffer démarre immédiatement
Et le décompte continue (321)
Quand le décompte atteint 0
Alors le contenu buffer fait fade out
Et le contenu géolocalisé fait fade in
Et il n'y a jamais de silence
# Annulation décompte
Scénario: User appuie à nouveau sur "Suivant" pendant décompte (annulation)
Étant donné que le décompte "3" est affiché
Quand j'appuie à nouveau sur "Suivant"
Alors le décompte est annulé immédiatement
Et le contenu suivant du buffer démarre
Et le contenu géolocalisé est perdu
Et il n'entre PAS dans l'historique de navigation
# Navigation avec contenus géolocalisés
Scénario: Contenu géolocalisé accepté entre dans l'historique
Étant donné que j'ai accepté un contenu géolocalisé
Et que je l'ai écouté pendant 42 secondes
Quand j'appuie sur "Suivant" (skip)
Alors le contenu buffer suivant démarre
Et le contenu géolocalisé est ajouté à l'historique:
"""json
{
"id": "geo_tour_eiffel",
"position_seconds": 42,
"listened_at": "2026-02-02T10:30:00Z",
"type": "geo_anchored"
}
"""
Scénario: Commande "Précédent" après skip contenu géolocalisé (≥10s écoutés)
Étant donné que j'ai écouté un contenu géolocalisé pendant 42 secondes
Et que j'ai skippé vers le contenu suivant
Quand j'appuie sur "Précédent"
Alors le contenu géolocalisé reprend à 42 secondes
Car j'ai écouté 10 secondes (règle standard)
Et la position exacte est restaurée
Scénario: Commande "Précédent" après skip rapide (<10s écoutés)
Étant donné que j'ai écouté un contenu géolocalisé pendant 5 secondes
Et que j'ai skippé vers le contenu suivant
Quand j'appuie sur "Précédent"
Alors le contenu AVANT le géolocalisé reprend
Car j'ai écouté < 10 secondes (règle standard)
Et le contenu géolocalisé est considéré comme non écouté
Scénario: Notification ignorée n'entre PAS dans l'historique
Étant donné qu'une notification "Tour Eiffel" s'affiche
Et que je n'appuie PAS sur "Suivant" pendant 7 secondes
Quand la notification disparaît
Et que j'appuie sur "Précédent"
Alors je reviens au contenu AVANT la notification
Et le contenu géolocalisé ignoré n'apparaît pas dans l'historique
# Conformité CarPlay / Android Auto
Scénario: Mode CarPlay désactive overlay visuel (sonore uniquement)
Étant donné que l'app est connectée à CarPlay
Et qu'un contenu géolocalisé est détecté (ETA 7s)
Quand la notification est déclenchée
Alors UNIQUEMENT un son bref (bip) est joué
Et AUCUN overlay visuel n'est affiché:
❌ Pas d'icône
❌ Pas de compteur visuel
❌ Pas de texte
Et je peux toujours appuyer sur bouton "Suivant" physique
Et le décompte 5s démarre après validation
Scénario: Mode Android Auto désactive overlay visuel (sonore uniquement)
Étant donné que l'app est connectée à Android Auto
Et qu'un contenu géolocalisé est détecté (ETA 7s)
Quand la notification est déclenchée
Alors UNIQUEMENT une notification sonore système est jouée
Et AUCUN overlay visuel n'est affiché
Et je peux appuyer sur "Suivant" pour valider
Et le comportement est identique à CarPlay
Scénario: Détection automatique CarPlay active mode sonore uniquement
Étant donné que je démarre l'app normalement (mode standard)
Quand je connecte mon téléphone à CarPlay
Alors le mode CarPlay est détecté automatiquement
Et les notifications géolocalisées passent en mode sonore uniquement
Quand je déconnecte CarPlay
Alors le mode standard reprend
Et les notifications affichent à nouveau icône + compteur
# Son de notification
Scénario: Son de notification configurable dans réglages
Étant donné que je vais dans Réglages > Notifications géolocalisées
Quand je consulte les options sonores
Alors je peux choisir:
| Option | Description |
| Bip système | Son système court (0.5s) |
| Son RoadWave personnalisé | "Ding" doux RoadWave |
| Muet | Visuel uniquement (pas de son) |
Et le volume suit le volume système notifications (pas media)
Scénario: Pas de vibration en mode voiture
Étant donné qu'une notification géolocalisée est déclenchée
Quand le son est joué
Alors AUCUNE vibration n'est déclenchée
Car le téléphone est sur support voiture
Et la vibration est inutile
# Feedback visuel
Scénario: Transition fluide après validation notification
Étant donné qu'une notification affiche "7"
Quand j'appuie sur "Suivant"
Alors la transition visuelle est fluide:
1. Fade out icône + compteur "7" (0.3s)
2. Fade in nouveau compteur "5" (0.3s)
3. Décompte 54321
4. Fade out player actuel + fade in géolocalisé (0.3s)
Et aucune transition brusque ou clignotement
Scénario: Compteur visuel grande taille pour lisibilité
Étant donné qu'une notification ou décompte est affiché
Quand je consulte l'interface
Alors le compteur respecte:
- Police: 72pt minimum
- Weight: Bold
- Couleur: Blanc (ou contraste élevé)
- Background: Noir semi-transparent (50% opacity)
- Position: Centré horizontalement, bas de l'écran
Et le chiffre est lisible en vision périphérique sans quitter la route
# Quota et cooldown (side-effects UI)
Scénario: Notification quota atteint n'affiche rien (silencieuse)
Étant donné que j'ai reçu 6 notifications géolocalisées dans l'heure
Et que je passe devant un 7ème contenu géolocalisé
Quand l'API refuse la notification (quota 429)
Alors AUCUNE notification n'est affichée côté UI
Et AUCUN son n'est joué
Et le contenu continue normalement
Et je ne suis pas interrompu
Scénario: Notification cooldown actif n'affiche rien (silencieuse)
Étant donné qu'une notification précédente a été ignorée
Et qu'un cooldown de 10 minutes est actif
Quand je passe devant un contenu géolocalisé
Alors AUCUNE notification n'est affichée
Et le refus est silencieux (pas de message d'erreur)
# Edge cases
Scénario: Haute vitesse (130 km/h) - notification 252m avant
Étant donné que je roule à 130 km/h sur autoroute
Et qu'un contenu géolocalisé existe sur mon trajet
Quand l'API détecte ETA 7s (distance 252m)
Alors la notification s'affiche avec compteur "7"
Quand j'accepte (décompte 5s)
Alors le contenu géolocalisé démarre 72m AVANT le point
Et le timing est correct même à haute vitesse
Scénario: App doit être au premier plan (mode voiture)
Étant donné que je suis en mode voiture
Et que l'app est en arrière-plan (minimisée)
Quand je passe devant un contenu géolocalisé
Alors AUCUNE notification n'est envoyée
Car l'app doit être ouverte pour mode voiture
Et la sécurité routière exige l'app visible
Scénario: Notification disparaît si user change de contexte
Étant donné qu'une notification affiche "4"
Quand je minimise l'application
Alors la notification est annulée immédiatement
Et le contenu géolocalisé est perdu
Car l'app n'est plus au premier plan
Plan du Scénario: Décompte visuel selon temps restant
Étant donné qu'une notification est affichée
Et que <temps> secondes se sont écoulées
Quand je consulte l'écran
Alors le compteur affiche <chiffre>
Exemples:
| temps | chiffre |
| 0 | 7 |
| 1 | 6 |
| 2 | 5 |
| 3 | 4 |
| 4 | 3 |
| 5 | 2 |
| 6 | 1 |
| 7 | (disparu) |
Plan du Scénario: Mode CarPlay/Android Auto selon connexion
Étant donné que l'app est <mode_initial>
Quand je <action>
Alors le mode devient <mode_final>
Et les notifications sont <type_notif>
Exemples:
| mode_initial | action | mode_final | type_notif |
| standard | connecte CarPlay | CarPlay | sonore uniquement |
| standard | connecte Android Auto | Android Auto | sonore uniquement |
| CarPlay | déconnecte CarPlay | standard | sonore + visuel |
| Android Auto | déconnecte Android Auto | standard | sonore + visuel |