189 lines
8.8 KiB
Gherkin
189 lines
8.8 KiB
Gherkin
# language: fr
|
|
Fonctionnalité: File d'attente et commande "Suivant"
|
|
En tant qu'auditeur en déplacement
|
|
Je veux que l'application pré-calcule intelligemment les prochains contenus
|
|
Afin d'avoir une navigation fluide sans latence
|
|
|
|
Contexte:
|
|
Étant donné que l'API RoadWave est disponible
|
|
Et qu'un utilisateur est connecté
|
|
Et que la géolocalisation est activée
|
|
|
|
Scénario: Pré-calcul initial de 5 contenus en cache
|
|
Étant donné que je viens de démarrer l'application
|
|
Et que je suis situé à Paris (48.8566, 2.3522)
|
|
Et que je suis en mode voiture (vitesse ≥ 5 km/h)
|
|
Quand l'application initialise la lecture
|
|
Alors une file d'attente de 5 contenus est pré-calculée
|
|
Et la file est stockée en cache Redis avec la clé "user:{user_id}:queue"
|
|
Et les métadonnées incluent ma position, le timestamp de calcul et le mode
|
|
Et le cache a un TTL de 15 minutes
|
|
|
|
Scénario: Commande "Suivant" sans latence
|
|
Étant donné qu'une file d'attente de 5 contenus est en cache
|
|
Et que j'écoute actuellement le contenu "A"
|
|
Quand j'appuie sur le bouton "Suivant"
|
|
Alors le contenu suivant démarre immédiatement (< 100ms)
|
|
Et le contenu est retiré de la file d'attente
|
|
Et il reste 4 contenus dans la file
|
|
|
|
Scénario: Recalcul automatique après déplacement >10km
|
|
Étant donné que la file a été calculée à Paris (48.8566, 2.3522)
|
|
Et que j'ai 5 contenus en cache
|
|
Quand je me déplace à Versailles (48.8049, 2.1204) soit 12km
|
|
Alors la file d'attente est invalidée automatiquement
|
|
Et une nouvelle file de 5 contenus est recalculée
|
|
Et elle est basée sur ma nouvelle position
|
|
|
|
Scénario: Recalcul automatique toutes les 10 minutes
|
|
Étant donné qu'une file a été calculée il y a 10 minutes
|
|
Et que ma position n'a pas changé
|
|
Quand le timer de rafraîchissement expire
|
|
Alors une nouvelle file de 5 contenus est recalculée
|
|
Et les anciens contenus non écoutés sont remplacés
|
|
Et les nouveaux contenus publiés depuis sont inclus
|
|
|
|
Scénario: Recalcul quand il reste moins de 3 contenus
|
|
Étant donné qu'il reste 3 contenus dans ma file d'attente
|
|
Quand j'appuie sur "Suivant"
|
|
Alors il reste 2 contenus
|
|
Et un recalcul asynchrone est déclenché en arrière-plan
|
|
Et 3 nouveaux contenus sont ajoutés à la file
|
|
Et la file contient maintenant 5 contenus
|
|
|
|
Scénario: Insertion prioritaire d'un contenu géolocalisé en mode voiture
|
|
Étant donné que j'ai une file de 5 contenus pré-calculée
|
|
Et que je suis en mode voiture
|
|
Et que je me déplace à 50 km/h vers un point avec contenu géolocalisé
|
|
Quand je suis à 98m du point (ETA = 7 secondes)
|
|
Alors une notification est envoyée (icône + compteur 7→1 + son)
|
|
Et je dois appuyer sur "Suivant" dans les 7 secondes pour valider
|
|
Quand j'appuie sur "Suivant"
|
|
Alors un décompte de 5 secondes démarre
|
|
Et après 5 secondes, le contenu géolocalisé s'insère et démarre
|
|
Et il remplace le contenu actuel dans la lecture
|
|
|
|
Scénario: Contenu géolocalisé ignoré est perdu (cooldown activé)
|
|
Étant donné qu'une notification géolocalisée est affichée (compteur 7→1)
|
|
Quand je ne clique pas sur "Suivant" pendant les 7 secondes
|
|
Alors la notification disparaît
|
|
Et le contenu géolocalisé est perdu (pas d'insertion dans la file)
|
|
Et un cooldown de 10 minutes est activé
|
|
Et aucune nouvelle notification géolocalisée ne sera envoyée pendant 10 minutes
|
|
|
|
Scénario: Validation d'une notification géolocalisée
|
|
Étant donné qu'une notification géolocalisée est affichée (compteur à 5)
|
|
Et que j'écoute un podcast
|
|
Quand j'appuie sur "Suivant"
|
|
Alors le compteur bascule à "5" (décompte final)
|
|
Et le podcast actuel continue de jouer
|
|
Et après 5 secondes, le contenu géolocalisé démarre
|
|
Et le podcast est mis en pause et sauvegardé dans l'historique
|
|
|
|
Scénario: Invalidation immédiate après modification des préférences
|
|
Étant donné que j'ai une file de 5 contenus en cache
|
|
Et que ma vitesse GPS est de 5 km/h (piéton)
|
|
Quand je modifie mes curseurs de préférences (géo/découverte/politique)
|
|
Alors la file d'attente est invalidée immédiatement
|
|
Et une nouvelle file est recalculée avec les nouvelles préférences
|
|
Et les anciens contenus en cache sont supprimés
|
|
|
|
Scénario: Blocage modification préférences en conduite (>10 km/h)
|
|
Étant donné que ma vitesse GPS est de 50 km/h (en voiture)
|
|
Quand j'essaie d'accéder aux réglages de préférences
|
|
Alors l'interface affiche "Paramètres verrouillés en conduite"
|
|
Et je ne peux pas modifier les curseurs géo/découverte/politique
|
|
Et un message "Arrêtez-vous pour modifier vos préférences" s'affiche
|
|
|
|
Scénario: Invalidation lors du démarrage d'un live suivi
|
|
Étant donné que je suis abonné au créateur "RadioVoyage"
|
|
Et que j'ai une file de 5 contenus en cache
|
|
Et que je suis dans la zone géographique du créateur
|
|
Quand le créateur "RadioVoyage" démarre une radio live
|
|
Alors je reçois une notification push
|
|
Et le contenu live s'insère en tête de la file d'attente
|
|
Et la file d'attente est recalculée
|
|
|
|
Scénario: Métadonnées de cache Redis
|
|
Étant donné qu'une file d'attente est calculée
|
|
Quand elle est stockée dans Redis
|
|
Alors la clé est "user:{user_id}:queue"
|
|
Et les métadonnées incluent:
|
|
| champ | valeur |
|
|
| last_lat | 48.8566 |
|
|
| last_lon | 2.3522 |
|
|
| computed_at | 2026-01-21T10:30:00Z |
|
|
| mode | voiture |
|
|
Et le TTL est de 15 minutes (900 secondes)
|
|
|
|
Scénario: Contenu géolocalisé remplace le contenu actuel (pas d'insertion en file)
|
|
Étant donné que j'écoute le contenu C2 de ma file [C1, C2, C3, C4, C5]
|
|
Et qu'une notification géolocalisée "Tour Eiffel" est déclenchée
|
|
Quand je valide la notification
|
|
Et que le décompte de 5s se termine
|
|
Alors le contenu "Tour Eiffel" remplace C2 et démarre
|
|
Et C2 est sauvegardé dans l'historique de navigation
|
|
Et la file reste [C3, C4, C5] (pas de contenu retiré)
|
|
Et quand "Tour Eiffel" se termine, C3 démarre
|
|
|
|
Scénario: Invalidation après déplacement exactement 10km
|
|
Étant donné que la file a été calculée à une position donnée
|
|
Quand je me déplace d'exactement 10.0 km
|
|
Alors la file d'attente n'est PAS invalidée (seuil strict >10km)
|
|
Et les contenus en cache restent valides
|
|
Quand je me déplace de 10.1 km supplémentaires (total 10.1km)
|
|
Alors la file d'attente est invalidée
|
|
Et une nouvelle file est calculée
|
|
|
|
Scénario: Rafraîchissement exactement après 10 minutes
|
|
Étant donné qu'une file a été calculée à 10:00:00
|
|
Quand l'heure actuelle est 10:10:00
|
|
Alors le timer de rafraîchissement expire
|
|
Et une nouvelle file de 5 contenus est recalculée
|
|
Et le timestamp "computed_at" est mis à jour
|
|
|
|
Scénario: Recalcul asynchrone non-bloquant
|
|
Étant donné qu'il reste 2 contenus dans la file
|
|
Et que j'appuie sur "Suivant"
|
|
Quand le recalcul asynchrone démarre
|
|
Alors la lecture du contenu actuel n'est pas interrompue
|
|
Et le recalcul se fait en arrière-plan
|
|
Et les nouveaux contenus sont ajoutés dès disponibles (< 500ms)
|
|
Et l'utilisateur ne perçoit aucune latence
|
|
|
|
Scénario: Notification basée sur ETA (pas distance fixe)
|
|
Étant donné qu'un contenu géolocalisé existe à un point GPS
|
|
Et que je roule à 130 km/h
|
|
Quand je suis à 252m du point (ETA = 7 secondes)
|
|
Alors une notification est envoyée
|
|
Quand je suis à 300m du point (ETA = 8 secondes)
|
|
Alors aucune notification n'est envoyée (ETA >7s)
|
|
|
|
Plan du Scénario: Différentes distances de déplacement et invalidation
|
|
Étant donné qu'une file a été calculée à une position donnée
|
|
Quand je me déplace de <distance> km
|
|
Alors la file est <action>
|
|
|
|
Exemples:
|
|
| distance | action |
|
|
| 5 | conservée |
|
|
| 9.9 | conservée |
|
|
| 10.0 | conservée |
|
|
| 10.1 | invalidée et recalculée |
|
|
| 15 | invalidée et recalculée |
|
|
| 50 | invalidée et recalculée |
|
|
|
|
Scénario: Quota de 6 contenus géolocalisés par heure
|
|
Étant donné que j'ai validé 6 notifications géolocalisées dans la dernière heure
|
|
Quand un 7ème contenu géolocalisé est détecté (ETA 7s)
|
|
Alors aucune notification n'est envoyée
|
|
Et le quota horaire est respecté
|
|
|
|
Scénario: Mode piéton - pas de notification avec compteur 7s
|
|
Étant donné que je suis en mode piéton (vitesse <5 km/h)
|
|
Et qu'un audio-guide géolocalisé existe à 150m
|
|
Quand je passe dans le rayon de 200m
|
|
Alors une notification push système est envoyée
|
|
Et aucun compteur 7s n'est affiché
|
|
Et je peux ouvrir l'app en tapant sur la notification
|