feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024
Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture. ## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU) - Créer structure features/{api,ui,e2e} - Déplacer 83 features en 3 catégories via git mv (historique préservé) - features/api/ : 53 features (tests API backend) - features/ui/ : 22 features (tests UI mobile) - features/e2e/ : 8 features (tests end-to-end) Domaines déplacés : - API : authentication, recommendation, rgpd-compliance, content-creation, moderation, monetisation, premium, radio-live, publicites - UI : audio-guides, navigation, interest-gauges, mode-offline, partage, profil, recherche - E2E : abonnements, error-handling ## Phase 2 : Mise à jour Documentation ### ADR-007 - Tests BDD - Ajouter section "Convention de Catégorisation des Features" - Documenter règles api/ui/e2e avec exemples concrets - Spécifier step definitions (backend Go, mobile Dart) ### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU) - Créer ADR dédié pour stratégie CI/CD avec path filters - Architecture workflows séparés (backend.yml, mobile.yml, shared.yml) - Configuration path filters détaillée avec exemples YAML - Matrice de déclenchement et optimisations (~70% gain temps CI) - Plan d'implémentation (~2h, reporté jusqu'au développement) ### ADR-016 - Organisation Monorepo - Simplifier en retirant section CI/CD détaillée - Ajouter référence vers ADR-024 pour stratégie CI/CD ### INCONSISTENCIES-ANALYSIS.md - Point #10 (Tests BDD synchronisés) : ✅ RÉSOLU - Catégorisation features implémentée - ADR-007 mis à jour avec convention complète - Point #11 (70/30 Split paiements) : ✅ ANNULÉ (faux problème) - ADR-009 et Règle 18 parfaitement cohérents - Documentation exhaustive existante (formule, SQL, comparaisons) - Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ - Architecture CI/CD complète dans ADR-024 - Implémentation reportée (projet en phase documentation) - Métriques mises à jour : - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté) - ADR à jour : 100% (19/19 avec ADR-024) ## Phase 3 : Validation - Structure features validée (api/ui/e2e, aucun répertoire restant) - Historique Git préservé (git mv, renommages détectés) - 83 features total (API: 53, UI: 22, E2E: 8) Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
115
features/e2e/error-handling/aucun-contenu-disponible.feature
Normal file
115
features/e2e/error-handling/aucun-contenu-disponible.feature
Normal file
@@ -0,0 +1,115 @@
|
||||
# language: fr
|
||||
|
||||
@error-handling @no-content
|
||||
Fonctionnalité: Élargissement automatique de zone quand aucun contenu n'est disponible
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un utilisateur connecté
|
||||
Et que la géolocalisation est activée
|
||||
Et que je suis en mode écoute
|
||||
|
||||
# 12.1 - Élargissement progressif
|
||||
|
||||
Scénario: Aucun contenu dans rayon 50km - élargissement à 100km
|
||||
Étant donné que je suis situé à la position GPS 48.8566, 2.3522
|
||||
Et qu'aucun contenu n'existe dans un rayon de 50 km autour de ma position
|
||||
Mais qu'au moins 1 contenu existe dans un rayon de 100 km
|
||||
Quand le système recherche du contenu à me proposer
|
||||
Alors le système élargit automatiquement la zone de recherche à 100 km
|
||||
Et je reçois un message "Aucun contenu dans votre zone immédiate. Voici du contenu à proximité (100 km)"
|
||||
Et un contenu dans le rayon de 100 km m'est proposé
|
||||
|
||||
Scénario: Aucun contenu dans rayon 100km - élargissement au département
|
||||
Étant donné que je suis situé dans le département "75" (Paris)
|
||||
Et qu'aucun contenu n'existe dans un rayon de 100 km autour de ma position
|
||||
Mais qu'au moins 1 contenu existe avec la zone "département" pour "75"
|
||||
Quand le système recherche du contenu à me proposer
|
||||
Alors le système élargit automatiquement la zone de recherche au département
|
||||
Et je reçois un message "Aucun contenu local disponible. Voici du contenu dans votre département"
|
||||
Et un contenu départemental m'est proposé
|
||||
|
||||
Scénario: Aucun contenu départemental - élargissement à la région
|
||||
Étant donné que je suis situé dans la région "Île-de-France"
|
||||
Et qu'aucun contenu n'existe dans un rayon de 100 km autour de ma position
|
||||
Et qu'aucun contenu départemental n'existe pour mon département
|
||||
Mais qu'au moins 1 contenu existe avec la zone "région" pour "Île-de-France"
|
||||
Quand le système recherche du contenu à me proposer
|
||||
Alors le système élargit automatiquement la zone de recherche à la région
|
||||
Et je reçois un message "Aucun contenu local disponible. Voici du contenu dans votre région"
|
||||
Et un contenu régional m'est proposé
|
||||
|
||||
Scénario: Aucun contenu régional - basculement sur contenu national
|
||||
Étant donné que je suis situé en France
|
||||
Et qu'aucun contenu n'existe dans un rayon de 100 km autour de ma position
|
||||
Et qu'aucun contenu départemental n'existe pour mon département
|
||||
Et qu'aucun contenu régional n'existe pour ma région
|
||||
Quand le système recherche du contenu à me proposer
|
||||
Alors le système bascule automatiquement sur du contenu national
|
||||
Et je reçois un message "Aucun contenu local disponible. Voici du contenu national qui pourrait vous intéresser"
|
||||
Et un contenu national m'est proposé
|
||||
Et je ne reste jamais sans contenu disponible
|
||||
|
||||
Scénario: Élargissement progressif avec plusieurs étapes
|
||||
Étant donné que je suis situé dans une zone rurale isolée
|
||||
Et qu'aucun contenu n'existe dans un rayon de 50 km
|
||||
Et qu'aucun contenu n'existe dans un rayon de 100 km
|
||||
Et qu'aucun contenu départemental n'existe
|
||||
Et qu'aucun contenu régional n'existe
|
||||
Quand le système recherche du contenu à me proposer
|
||||
Alors le système essaie d'abord 50 km
|
||||
Puis essaie 100 km
|
||||
Puis essaie le département
|
||||
Puis essaie la région
|
||||
Puis bascule sur le contenu national
|
||||
Et tout ce processus se fait de manière transparente et automatique
|
||||
Et je reçois le message correspondant au dernier niveau trouvé
|
||||
|
||||
# Messages adaptatifs selon le niveau d'élargissement
|
||||
|
||||
Scénario: Message personnalisé selon la distance trouvée
|
||||
Étant donné que je suis situé à la position GPS 43.6047, 1.4442
|
||||
Et que <niveau_geo> contenu(s) est/sont trouvé(s)
|
||||
Quand le système me propose du contenu
|
||||
Alors je reçois le message "<message_attendu>"
|
||||
|
||||
Exemples:
|
||||
| niveau_geo | message_attendu |
|
||||
| 100 km | Aucun contenu dans votre zone immédiate. Voici du contenu à proximité (100 km) |
|
||||
| département | Aucun contenu local disponible. Voici du contenu dans votre département |
|
||||
| région | Aucun contenu local disponible. Voici du contenu dans votre région |
|
||||
| national | Aucun contenu local disponible. Voici du contenu national qui pourrait vous intéresser|
|
||||
|
||||
# Filet de sécurité - toujours du contenu disponible
|
||||
|
||||
Scénario: Le contenu national sert de filet de sécurité
|
||||
Étant donné que le système a épuisé toutes les zones géographiques locales
|
||||
Quand le système bascule sur du contenu national
|
||||
Alors je dois toujours avoir au moins 1 contenu disponible
|
||||
Et ce contenu peut être:
|
||||
| type_contenu |
|
||||
| Actualités Le Monde |
|
||||
| Podcasts génériques |
|
||||
| Contenu éducatif national |
|
||||
| Contenu culturel national |
|
||||
|
||||
# Pas de message d'erreur bloquant
|
||||
|
||||
Scénario: Pas d'écran d'erreur "Aucun contenu"
|
||||
Étant donné que je lance l'application
|
||||
Et qu'aucun contenu local n'est disponible dans ma zone
|
||||
Quand le système recherche du contenu
|
||||
Alors je ne dois jamais voir un message d'erreur "Aucun contenu disponible"
|
||||
Et je ne dois jamais voir un écran vide
|
||||
Et un contenu doit toujours m'être proposé, même si c'est du contenu national
|
||||
|
||||
# Comportement avec historique d'écoute
|
||||
|
||||
Scénario: Élargissement avec prise en compte des centres d'intérêt
|
||||
Étant donné que je suis situé dans une zone rurale
|
||||
Et qu'aucun contenu n'existe dans un rayon de 50 km
|
||||
Et que mes centres d'intérêt incluent "Automobile" à 80% et "Voyage" à 70%
|
||||
Et qu'un contenu national existe avec le tag "Automobile"
|
||||
Et qu'un contenu national existe avec le tag "Politique"
|
||||
Quand le système bascule sur du contenu national
|
||||
Alors le contenu national proposé prend en compte mes centres d'intérêt
|
||||
Et le contenu "Automobile" a un score supérieur au contenu "Politique"
|
||||
@@ -0,0 +1,116 @@
|
||||
# language: fr
|
||||
|
||||
@error-handling @content-removal
|
||||
Fonctionnalité: Gestion d'un contenu supprimé pendant l'écoute
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un utilisateur connecté
|
||||
Et que je suis en mode écoute
|
||||
Et qu'un contenu "C123" est en cours de lecture
|
||||
|
||||
# 12.2 - Pas d'interruption brutale
|
||||
|
||||
Scénario: Contenu supprimé pendant lecture - fin de lecture sans interruption
|
||||
Étant donné que j'écoute le contenu "C123" depuis 30 secondes
|
||||
Et que la durée totale du contenu est de 120 secondes
|
||||
Quand le contenu est supprimé par la modération côté backend
|
||||
Alors la lecture du contenu continue sans interruption
|
||||
Et je peux écouter le contenu jusqu'à la fin
|
||||
Et aucune interruption brutale ne se produit
|
||||
|
||||
Scénario: Passage automatique après fin du contenu supprimé
|
||||
Étant donné que le contenu "C123" a été supprimé pendant ma lecture
|
||||
Et que j'ai écouté le contenu jusqu'à la fin
|
||||
Quand le contenu se termine
|
||||
Alors le système attend 2 secondes
|
||||
Et passe automatiquement au contenu suivant
|
||||
Et je reçois une notification toast discrète "Contenu précédent retiré (violation règles)"
|
||||
|
||||
Scénario: Bouton Précédent désactivé après suppression
|
||||
Étant donné que le contenu "C123" a été supprimé pendant ma lecture
|
||||
Et que je suis passé au contenu suivant "C456"
|
||||
Quand j'essaie d'appuyer sur le bouton "Précédent"
|
||||
Alors le bouton "Précédent" ne me ramène pas au contenu supprimé
|
||||
Et je reçois un message "Ce contenu n'est plus disponible"
|
||||
Et la lecture du contenu actuel "C456" continue
|
||||
|
||||
Scénario: Tentative de retour manuel au contenu supprimé
|
||||
Étant donné que je suis sur le contenu "C456"
|
||||
Et que le contenu précédent "C123" a été supprimé
|
||||
Quand j'appuie sur le bouton "Précédent" pour revenir au contenu supprimé
|
||||
Alors je reçois un message "Ce contenu n'est plus disponible"
|
||||
Et la lecture reste sur le contenu actuel "C456"
|
||||
Et aucune action n'est effectuée
|
||||
|
||||
# Sécurité routière - pas d'alerte intrusive
|
||||
|
||||
Scénario: Notification discrète pendant la conduite
|
||||
Étant donné que je conduis à une vitesse de 60 km/h
|
||||
Et que le contenu "C123" est supprimé pendant ma lecture
|
||||
Quand le contenu se termine
|
||||
Alors la notification "Contenu précédent retiré (violation règles)" s'affiche en toast discret
|
||||
Et la notification disparaît automatiquement après 5 secondes
|
||||
Et aucune popup modale n'interrompt ma conduite
|
||||
Et le contenu suivant démarre automatiquement après 2 secondes
|
||||
|
||||
Scénario: Message informatif mais non alarmiste
|
||||
Étant donné que le contenu "C123" a été supprimé
|
||||
Et que je passe au contenu suivant
|
||||
Quand la notification s'affiche
|
||||
Alors le message doit être informatif: "Contenu précédent retiré (violation règles)"
|
||||
Et le ton ne doit pas être alarmiste
|
||||
Et le message doit être bref et compréhensible
|
||||
Et aucun détail technique n'est affiché pendant la conduite
|
||||
|
||||
# Empêche la réécoute du contenu modéré
|
||||
|
||||
Scénario: Contenu supprimé retiré de l'historique
|
||||
Étant donné que le contenu "C123" a été supprimé
|
||||
Quand je consulte mon historique d'écoute
|
||||
Alors le contenu "C123" n'apparaît plus dans mon historique
|
||||
Et je ne peux pas relancer la lecture de ce contenu
|
||||
Et l'historique affiche "[Contenu retiré]" à la place du titre
|
||||
|
||||
Scénario: Contenu supprimé non accessible via lien direct
|
||||
Étant donné que le contenu "C123" a été supprimé
|
||||
Et que j'ai un lien de partage "roadwave.fr/share/c/C123"
|
||||
Quand je clique sur le lien de partage
|
||||
Alors je reçois un message "Ce contenu a été retiré pour violation des règles de la communauté"
|
||||
Et je suis redirigé vers l'accueil de l'application
|
||||
Et aucune lecture n'est possible
|
||||
|
||||
# Gestion de plusieurs contenus supprimés consécutivement
|
||||
|
||||
Scénario: Plusieurs contenus supprimés dans l'historique récent
|
||||
Étant donné que j'ai écouté les contenus suivants:
|
||||
| id | statut |
|
||||
| C123 | supprimé |
|
||||
| C456 | actif |
|
||||
| C789 | supprimé |
|
||||
Et que je suis actuellement sur le contenu "C456"
|
||||
Quand j'appuie plusieurs fois sur "Précédent"
|
||||
Alors je ne peux pas revenir aux contenus "C123" ou "C789"
|
||||
Et le système saute automatiquement les contenus supprimés
|
||||
Et je reviens au dernier contenu actif disponible avant "C456"
|
||||
|
||||
# Comportement à l'arrêt du véhicule
|
||||
|
||||
Scénario: Consultation détaillée du contenu supprimé à l'arrêt
|
||||
Étant donné que je suis à l'arrêt
|
||||
Et que le contenu "C123" a été supprimé pendant ma session
|
||||
Quand j'ouvre les détails de la notification de suppression
|
||||
Alors je peux voir les informations suivantes:
|
||||
| information |
|
||||
| Titre du contenu |
|
||||
| Créateur |
|
||||
| Raison de suppression |
|
||||
| Date de suppression |
|
||||
Et je peux signaler une erreur de modération si je pense qu'elle est injustifiée
|
||||
|
||||
Scénario: Pas d'impact sur les jauges d'intérêt lors de la suppression
|
||||
Étant donné que j'ai écouté le contenu "C123" pendant 80 secondes (66%)
|
||||
Et que mes jauges d'intérêt ont été mises à jour pendant l'écoute
|
||||
Quand le contenu est supprimé après mon écoute
|
||||
Alors les modifications de mes jauges d'intérêt sont conservées
|
||||
Et l'écoute déjà effectuée reste comptabilisée
|
||||
Et seules les futures écoutes de ce contenu sont bloquées
|
||||
210
features/e2e/error-handling/geolocalisation-desactivee.feature
Normal file
210
features/e2e/error-handling/geolocalisation-desactivee.feature
Normal file
@@ -0,0 +1,210 @@
|
||||
# language: fr
|
||||
|
||||
@error-handling @gps-disabled
|
||||
Fonctionnalité: Mode dégradé sans géolocalisation
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un utilisateur connecté
|
||||
Et que j'ai refusé ou désactivé l'accès à la géolocalisation
|
||||
|
||||
# 12.4 - Mode dégradé automatique
|
||||
|
||||
Scénario: Types de contenu disponibles sans géolocalisation
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Quand j'ouvre l'application
|
||||
Alors les types de contenu suivants sont disponibles:
|
||||
| type_contenu | disponible |
|
||||
| Contenu national | oui |
|
||||
| Contenu téléchargé (offline) | oui |
|
||||
| Contenus "Neutre" géographiquement | oui |
|
||||
| Contenu géolocalisé Ancré | non |
|
||||
| Contenu géolocalisé Contextuel | non |
|
||||
| Audio-guides | non |
|
||||
| Notifications push géo-déclenchées | non |
|
||||
|
||||
# Popup au premier lancement
|
||||
|
||||
Scénario: Popup d'information au premier lancement sans GPS
|
||||
Étant donné que c'est mon premier lancement de l'application
|
||||
Et que j'ai refusé l'accès à la géolocalisation
|
||||
Quand l'application détecte que le GPS est désactivé
|
||||
Alors une popup s'affiche avec le message:
|
||||
"""
|
||||
RoadWave fonctionne mieux avec la géolocalisation activée. Sans elle, seul le contenu national sera disponible.
|
||||
"""
|
||||
Et la popup contient les boutons suivants:
|
||||
| bouton | action |
|
||||
| Activer | Redirection vers paramètres OS |
|
||||
| Continuer sans | Ferme popup et lance en mode dégradé |
|
||||
Et une checkbox "Ne plus me demander" est disponible
|
||||
|
||||
Scénario: Popup non affichée si case "Ne plus me demander" cochée
|
||||
Étant donné que j'ai déjà vu la popup de géolocalisation
|
||||
Et que j'ai coché "Ne plus me demander"
|
||||
Quand je lance l'application avec le GPS désactivé
|
||||
Alors la popup de géolocalisation ne s'affiche pas
|
||||
Et l'application démarre directement en mode dégradé
|
||||
Et le banner permanent de rappel s'affiche
|
||||
|
||||
Scénario: Redirection vers paramètres OS lors du clic sur "Activer"
|
||||
Étant donné que la popup de géolocalisation est affichée
|
||||
Quand je clique sur "Activer"
|
||||
Alors je suis redirigé vers les paramètres de géolocalisation de mon OS
|
||||
Et sur iOS, j'arrive dans "Réglages > RoadWave > Localisation"
|
||||
Et sur Android, j'arrive dans "Paramètres > Applications > RoadWave > Autorisations > Position"
|
||||
|
||||
# Banner permanent en mode dégradé
|
||||
|
||||
Scénario: Banner de rappel permanent sans GPS
|
||||
Étant donné que j'ai cliqué sur "Continuer sans" géolocalisation
|
||||
Quand l'application s'affiche
|
||||
Alors un bandeau s'affiche en haut de l'écran
|
||||
Et le bandeau contient le texte: "Mode limité : géolocalisation désactivée. [Activer]"
|
||||
Et le bandeau a un fond de couleur avertissement (jaune/orange)
|
||||
Et le bandeau n'est pas intrusif mais reste visible
|
||||
Et le bandeau reste affiché sur toutes les pages de l'application
|
||||
|
||||
Scénario: Clic sur le bouton "Activer" du banner
|
||||
Étant donné que le banner "Mode limité" est affiché
|
||||
Quand je clique sur le lien "[Activer]" dans le banner
|
||||
Alors je suis redirigé vers les paramètres de géolocalisation de mon OS
|
||||
|
||||
Scénario: Disparition du banner après activation GPS
|
||||
Étant donné que le banner "Mode limité" est affiché
|
||||
Et que je reviens dans l'application après avoir activé le GPS dans les paramètres
|
||||
Quand l'application détecte que la géolocalisation est maintenant active
|
||||
Alors le banner disparaît automatiquement
|
||||
Et l'application bascule en mode normal avec contenu géolocalisé
|
||||
Et un toast de confirmation s'affiche: "Géolocalisation activée"
|
||||
|
||||
# Contenu disponible en mode dégradé
|
||||
|
||||
Scénario: Lecture de contenu national sans GPS
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Et que du contenu national existe (actualités Le Monde, podcasts génériques)
|
||||
Quand je lance la lecture
|
||||
Alors je peux écouter le contenu national sans restriction
|
||||
Et l'algorithme de recommandation se base uniquement sur:
|
||||
| critère |
|
||||
| Mes centres d'intérêt |
|
||||
| Mon historique d'écoute |
|
||||
| Popularité générale |
|
||||
Et la proximité géographique n'est pas prise en compte
|
||||
|
||||
Scénario: Lecture de contenu téléchargé sans GPS
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Et que j'ai téléchargé 30 contenus quand j'avais le GPS activé
|
||||
Quand j'accède à mes contenus téléchargés
|
||||
Alors je peux lire tous mes contenus téléchargés normalement
|
||||
Et les contenus géolocalisés téléchargés restent accessibles
|
||||
Et le filtre géographique n'est pas appliqué pour les contenus offline
|
||||
|
||||
Scénario: Contenu "Neutre" géographiquement disponible
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Et qu'un créateur a publié du contenu avec la classification géographique "Neutre"
|
||||
Quand je recherche du contenu
|
||||
Alors les contenus "Neutre" sont inclus dans les résultats
|
||||
Et ils sont mélangés avec le contenu national
|
||||
Et l'algorithme les priorise selon mes centres d'intérêt
|
||||
|
||||
# Restrictions de contenu sans GPS
|
||||
|
||||
Scénario: Audio-guides inaccessibles sans GPS
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Quand je recherche un audio-guide spécifique
|
||||
Alors les audio-guides apparaissent dans les résultats de recherche
|
||||
Mais un badge "GPS requis" est affiché sur chaque audio-guide
|
||||
Et quand je clique sur un audio-guide, un message s'affiche:
|
||||
"""
|
||||
Les audio-guides nécessitent la géolocalisation pour fonctionner. Voulez-vous activer le GPS ?
|
||||
"""
|
||||
Et je peux choisir "Activer" ou "Annuler"
|
||||
|
||||
Scénario: Notifications push géo-déclenchées désactivées
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Et que je suis abonné à un créateur qui diffuse du contenu géolocalisé
|
||||
Quand le créateur publie un nouveau contenu géolocalisé
|
||||
Alors je ne reçois pas de notification push géo-déclenchée
|
||||
Mais je reçois une notification push standard (non géo-déclenchée) si le créateur publie du contenu national
|
||||
Et la notification précise: "Nouveau contenu national de [Créateur]"
|
||||
|
||||
Scénario: Contenu géolocalisé non proposé dans le feed
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Quand le système génère mon feed de contenu
|
||||
Alors aucun contenu "Ancré" ou "Contextuel" n'est inclus
|
||||
Et seuls les contenus "Neutre" et "National" sont proposés
|
||||
Et mon feed contient au minimum 20 contenus disponibles
|
||||
|
||||
# RGPD: Respect du consentement libre
|
||||
|
||||
Scénario: Application fonctionnelle sans GPS (pas de blocage)
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Quand j'utilise l'application
|
||||
Alors je ne suis jamais bloqué par un écran "GPS requis"
|
||||
Et toutes les fonctionnalités non-géolocalisées restent accessibles:
|
||||
| fonctionnalité |
|
||||
| Écoute contenu national |
|
||||
| Gestion profil |
|
||||
| Abonnements créateurs |
|
||||
| Recherche textuelle |
|
||||
| Historique d'écoute |
|
||||
| Paramètres |
|
||||
| Mode offline |
|
||||
Et je peux créer et publier du contenu national
|
||||
|
||||
Scénario: Respect du choix utilisateur de ne pas activer GPS
|
||||
Étant donné que j'ai coché "Ne plus me demander" pour la géolocalisation
|
||||
Quand j'utilise l'application pendant plusieurs semaines
|
||||
Alors la popup de demande GPS ne s'affiche plus jamais automatiquement
|
||||
Et seul le banner permanent reste affiché
|
||||
Et l'application ne force jamais l'activation du GPS
|
||||
|
||||
# Réactivation GPS et bascule en mode normal
|
||||
|
||||
Scénario: Bascule automatique en mode normal après activation GPS
|
||||
Étant donné que j'utilise l'application en mode dégradé depuis 1 semaine
|
||||
Et que je décide d'activer la géolocalisation
|
||||
Quand l'application détecte que le GPS est maintenant actif
|
||||
Alors le mode dégradé est désactivé automatiquement
|
||||
Et le banner "Mode limité" disparaît
|
||||
Et le contenu géolocalisé devient disponible immédiatement
|
||||
Et mon feed se rafraîchit avec du contenu local pertinent
|
||||
Et un toast de confirmation s'affiche: "Géolocalisation activée - Contenu local disponible"
|
||||
|
||||
Scénario: Demande de permission GPS lors de l'utilisation d'une fonctionnalité géo
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Quand j'essaie d'accéder à une fonctionnalité nécessitant le GPS (ex: audio-guide)
|
||||
Alors une popup contextuelle s'affiche:
|
||||
"""
|
||||
Cette fonctionnalité nécessite la géolocalisation. Voulez-vous l'activer ?
|
||||
"""
|
||||
Et je peux accepter ou refuser
|
||||
Et si j'accepte, je suis redirigé vers les paramètres OS
|
||||
Et si je refuse, je reste en mode dégradé sans message d'erreur répétitif
|
||||
|
||||
# Incitation à activer GPS sans être intrusif
|
||||
|
||||
Scénario: Statistiques de contenu local disponible non affiché
|
||||
Étant donné que la géolocalisation est désactivée
|
||||
Quand je navigue dans l'application
|
||||
Alors le banner peut afficher occasionnellement:
|
||||
"""
|
||||
Mode limité : géolocalisation désactivée. Plus de 500 contenus locaux disponibles près de vous. [Activer]
|
||||
"""
|
||||
Et ce message incitatif change tous les 3 jours
|
||||
Et il reste non intrusif (pas de popup, juste le banner)
|
||||
|
||||
Scénario: Onboarding différent pour utilisateurs sans GPS
|
||||
Étant donné que c'est ma première utilisation de RoadWave
|
||||
Et que j'ai refusé la géolocalisation
|
||||
Quand l'onboarding se termine
|
||||
Alors un écran explicatif s'affiche:
|
||||
"""
|
||||
Vous utilisez RoadWave sans géolocalisation. Voici ce qui est disponible :
|
||||
- Contenu national (actualités, podcasts)
|
||||
- Contenus téléchargés
|
||||
- Tous les créateurs et abonnements
|
||||
|
||||
Pour profiter pleinement de RoadWave (contenu local, audio-guides), activez la géolocalisation à tout moment.
|
||||
"""
|
||||
Et je peux continuer avec un bouton "Compris"
|
||||
179
features/e2e/error-handling/perte-reseau.feature
Normal file
179
features/e2e/error-handling/perte-reseau.feature
Normal file
@@ -0,0 +1,179 @@
|
||||
# language: fr
|
||||
|
||||
@error-handling @network-loss
|
||||
Fonctionnalité: Gestion de la perte de réseau et buffering adaptatif
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis un utilisateur connecté
|
||||
Et que je suis en mode écoute
|
||||
Et qu'un contenu est en cours de lecture
|
||||
|
||||
# 12.3 - Buffer adaptatif selon type de réseau (cf. TECHNICAL.md et ADR-002)
|
||||
|
||||
Plan du Scénario: Paramètres de buffer selon le type de réseau
|
||||
Étant donné que je suis connecté en "<type_reseau>"
|
||||
Quand le système initialise le buffer audio
|
||||
Alors le buffer minimum est de <buffer_min> secondes
|
||||
Et le buffer cible est de <buffer_cible> secondes
|
||||
Et le buffer maximum est de <buffer_max> secondes
|
||||
|
||||
Exemples:
|
||||
| type_reseau | buffer_min | buffer_cible | buffer_max |
|
||||
| WiFi | 5 | 30 | 120 |
|
||||
| 4G | 10 | 45 | 120 |
|
||||
| 5G | 10 | 45 | 120 |
|
||||
| 3G | 30 | 90 | 300 |
|
||||
|
||||
# Phase 1: Connexion instable
|
||||
|
||||
Scénario: Connexion instable avec latence élevée - aucun message immédiat
|
||||
Étant donné que je suis connecté en 4G
|
||||
Et que le buffer contient 45 secondes de contenu
|
||||
Quand la latence réseau dépasse 500ms
|
||||
Alors aucun message n'est affiché immédiatement
|
||||
Et la lecture continue normalement sur le buffer
|
||||
Et le système tente de continuer le téléchargement en arrière-plan
|
||||
|
||||
Scénario: Connexion instable pendant plus de 10 secondes - toast discret
|
||||
Étant donné que je suis connecté en 4G
|
||||
Et que la latence réseau dépasse 500ms depuis 10 secondes
|
||||
Quand le système détecte la latence prolongée
|
||||
Alors un toast discret s'affiche: "Connexion instable"
|
||||
Et le toast disparaît automatiquement après 3 secondes
|
||||
Et la lecture continue normalement
|
||||
|
||||
# Phase 2: Perte totale réseau
|
||||
|
||||
Scénario: Perte totale de réseau - lecture sur buffer
|
||||
Étant donné que je suis connecté en WiFi
|
||||
Et que le buffer contient 30 secondes de contenu
|
||||
Quand je perds totalement la connexion réseau
|
||||
Alors la lecture continue sur le buffer disponible
|
||||
Et un toast s'affiche: "Hors ligne, lecture sur buffer (30s restantes)"
|
||||
Et un compte à rebours du temps de buffer restant est visible
|
||||
|
||||
Scénario: Buffer qui s'épuise pendant la perte réseau
|
||||
Étant donné que je suis hors ligne
|
||||
Et que le buffer contient 30 secondes de contenu
|
||||
Quand le contenu continue de jouer
|
||||
Alors le compte à rebours diminue en temps réel
|
||||
Et le toast affiche "Hors ligne, lecture sur buffer (15s restantes)" après 15 secondes
|
||||
Et le toast affiche "Hors ligne, lecture sur buffer (5s restantes)" après 25 secondes
|
||||
|
||||
# Phase 3: Buffer épuisé sans reconnexion
|
||||
|
||||
Scénario: Pause automatique après épuisement du buffer
|
||||
Étant donné que je suis hors ligne depuis 30 secondes
|
||||
Et que le buffer est complètement épuisé
|
||||
Quand il n'y a plus de contenu audio à lire
|
||||
Alors la lecture se met en pause automatiquement
|
||||
Et un overlay s'affiche: "Connexion perdue. Reconnexion en cours..."
|
||||
Et le système tente de se reconnecter automatiquement
|
||||
|
||||
Scénario: Tentatives de reconnexion automatique
|
||||
Étant donné que la lecture est en pause suite à l'épuisement du buffer
|
||||
Quand le système tente de se reconnecter
|
||||
Alors une tentative de reconnexion est effectuée toutes les 5 secondes
|
||||
Et un maximum de 6 tentatives sont effectuées (30 secondes au total)
|
||||
Et l'overlay affiche "Tentative de reconnexion... (X/6)"
|
||||
|
||||
# Phase 4: Basculement mode offline après échec reconnexion
|
||||
|
||||
Scénario: Proposition du mode offline après 30 secondes d'échec
|
||||
Étant donné que 6 tentatives de reconnexion ont échoué
|
||||
Et que cela fait 30 secondes que je suis déconnecté
|
||||
Quand la 6ème tentative échoue
|
||||
Alors une popup s'affiche: "Voulez-vous continuer avec vos contenus téléchargés ?"
|
||||
Et la popup contient deux boutons:
|
||||
| bouton | action |
|
||||
| Réessayer | Nouvelle série de 6 tentatives |
|
||||
| Mode offline | Bascule sur contenus téléchargés |
|
||||
|
||||
Scénario: Basculement réussi vers le mode offline
|
||||
Étant donné que la popup de mode offline est affichée
|
||||
Et que j'ai téléchargé 20 contenus dans ma zone géographique
|
||||
Quand je clique sur "Mode offline"
|
||||
Alors le système bascule sur les contenus téléchargés
|
||||
Et un nouveau contenu téléchargé démarre automatiquement
|
||||
Et un bandeau permanent indique "Mode hors ligne - Contenus téléchargés"
|
||||
|
||||
Scénario: Aucun contenu téléchargé disponible
|
||||
Étant donné que la popup de mode offline est affichée
|
||||
Et que je n'ai aucun contenu téléchargé
|
||||
Quand je clique sur "Mode offline"
|
||||
Alors un message s'affiche: "Aucun contenu téléchargé disponible"
|
||||
Et je suis invité à me connecter en WiFi pour télécharger du contenu
|
||||
Et le bouton "Réessayer" reste la seule option
|
||||
|
||||
# Reconnexion réussie
|
||||
|
||||
Scénario: Reprise automatique après reconnexion
|
||||
Étant donné que la lecture est en pause depuis 15 secondes
|
||||
Et que j'étais à 02:35 du contenu en cours
|
||||
Quand la connexion réseau est rétablie
|
||||
Alors la lecture reprend automatiquement au point d'arrêt exact (02:35)
|
||||
Et un toast s'affiche: "Connexion rétablie"
|
||||
Et le toast disparaît après 3 secondes
|
||||
Et le buffer se remplit progressivement selon le type de réseau
|
||||
|
||||
Scénario: Reconnexion avec changement de type de réseau
|
||||
Étant donné que j'étais connecté en WiFi
|
||||
Et que j'ai perdu la connexion
|
||||
Quand je me reconnecte en 4G
|
||||
Alors le système ajuste automatiquement les paramètres de buffer
|
||||
Et le buffer minimum passe de 5s à 10s
|
||||
Et le buffer cible passe de 30s à 45s
|
||||
Et la lecture reprend normalement
|
||||
|
||||
# Cas spécifique: tunnel routier
|
||||
|
||||
Scénario: Passage dans un tunnel avec perte de signal
|
||||
Étant donné que je conduis à 90 km/h sur autoroute
|
||||
Et que je suis connecté en 4G avec un buffer de 45 secondes
|
||||
Quand j'entre dans un tunnel et perds le signal
|
||||
Alors la lecture continue sur le buffer pendant 45 secondes maximum
|
||||
Et aucune notification n'est affichée pendant les 10 premières secondes
|
||||
Et un toast discret s'affiche après 10 secondes: "Connexion instable"
|
||||
|
||||
Scénario: Sortie du tunnel avant épuisement du buffer
|
||||
Étant donné que je suis dans un tunnel depuis 30 secondes
|
||||
Et qu'il reste 15 secondes de buffer
|
||||
Quand je sors du tunnel et récupère le signal 4G
|
||||
Alors la lecture continue sans interruption
|
||||
Et le buffer se remplit à nouveau
|
||||
Et un toast s'affiche: "Connexion rétablie"
|
||||
|
||||
# Handoff réseau (changement de cellule mobile)
|
||||
|
||||
Scénario: Changement de cellule 4G pendant la lecture
|
||||
Étant donné que je conduis et change de cellule mobile toutes les 5-10 minutes
|
||||
Et que le buffer contient 45 secondes de contenu
|
||||
Quand un handoff de cellule se produit
|
||||
Alors la lecture continue sans interruption grâce au buffer
|
||||
Et la connexion à la nouvelle cellule se fait de manière transparente
|
||||
Et aucune notification n'est affichée si le handoff réussit en moins de 5 secondes
|
||||
|
||||
# Mode offline préventif avant perte réseau
|
||||
|
||||
Scénario: Téléchargement préventif en WiFi avant trajet
|
||||
Étant donné que je suis connecté en WiFi
|
||||
Et que j'ai activé le téléchargement automatique
|
||||
Quand le système détecte que je suis à l'arrêt en WiFi
|
||||
Alors le système me propose de télécharger du contenu pour mon trajet
|
||||
Et je peux sélectionner une zone géographique à télécharger
|
||||
Et le téléchargement se fait en arrière-plan
|
||||
|
||||
# Métriques et monitoring
|
||||
|
||||
Scénario: Tracking des événements de perte réseau pour amélioration
|
||||
Étant donné que je perds la connexion réseau
|
||||
Quand l'événement de perte est détecté
|
||||
Alors le système enregistre les métriques suivantes:
|
||||
| métrique |
|
||||
| Type de réseau avant perte |
|
||||
| Durée de la coupure |
|
||||
| Buffer disponible |
|
||||
| Position GPS approximative |
|
||||
| Heure de la journée |
|
||||
Et ces métriques sont anonymisées et envoyées en batch lors de la prochaine connexion WiFi
|
||||
Et les données servent à améliorer les paramètres de buffer
|
||||
Reference in New Issue
Block a user