# 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 km Alors la file est 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