refactor(docs): réorganiser la documentation selon principes DDD

Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend.

**Structure cible:**
```
docs/domains/
├── README.md (Context Map)
├── _shared/ (Core Domain)
├── recommendation/ (Supporting Subdomain)
├── content/ (Supporting Subdomain)
├── moderation/ (Supporting Subdomain)
├── advertising/ (Generic Subdomain)
├── premium/ (Generic Subdomain)
└── monetization/ (Generic Subdomain)
```

**Changements effectués:**

Phase 1: Création de l'arborescence des 7 bounded contexts
Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/
Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/
Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/
Phase 5: Création des README.md pour chaque domaine
Phase 6: Déplacement des features Gherkin vers domains/*/features/
Phase 7: Création du Context Map (domains/README.md)
Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation
Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh)
Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/)

**Configuration des tests:**
- Makefile: godog run docs/domains/*/features/
- scripts/generate-bdd-docs.py: features_dir → docs/domains

**Avantages:**
 Cohésion forte: toute la doc d'un domaine au même endroit
 Couplage faible: domaines indépendants, dépendances explicites
 Navigabilité améliorée: README par domaine = entrée claire
 Alignement code/docs: miroir de backend/internal/
 Onboarding facilité: exploration domaine par domaine
 Tests BDD intégrés: features au plus près des règles métier

Voir docs/REFACTOR-DDD.md pour le plan complet.
This commit is contained in:
jpgiannetti
2026-02-07 17:15:02 +01:00
parent 78422bb2c0
commit 5e5fcf4714
227 changed files with 1413 additions and 1967 deletions

View 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"

View File

@@ -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

View 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"

View 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