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:
jpgiannetti
2026-02-01 11:31:41 +01:00
parent 841028d1b2
commit 37c62206ad
88 changed files with 625 additions and 67 deletions

View File

@@ -0,0 +1,255 @@
# language: fr
Fonctionnalité: Lecture en boucle et enchaînement automatique
En tant qu'auditeur
Je veux que les contenus s'enchaînent automatiquement avec un délai paramétrable
Afin d'avoir une expérience fluide sans interruption
Contexte:
Étant donné que l'API RoadWave est disponible
Et qu'un utilisateur est connecté
Scénario: Passage automatique après 2 secondes (mode standard)
Étant donné que j'écoute un contenu "A" en mode standard
Quand la lecture se termine naturellement
Alors un timer de 2 secondes démarre
Et un overlay s'affiche: "Contenu suivant dans 2s..."
Et une barre de décompte visuelle s'affiche
Quand le timer atteint 0
Alors le contenu "B" démarre automatiquement
Et l'overlay disparaît
Scénario: Passage automatique après 1 seconde (mode Kids)
Étant donné que je suis en mode Kids
Et que j'écoute un contenu pour enfants
Quand la lecture se termine
Alors un timer de 1 seconde démarre
Et le message "Contenu suivant dans 1s..." s'affiche
Quand le timer expire
Alors le contenu suivant démarre automatiquement
Car l'attention des enfants est plus courte
Scénario: Passage immédiat après une radio live (0 seconde)
Étant donné que j'écoute une radio live
Quand le créateur arrête la diffusion
Alors le passage au contenu suivant est immédiat (0s de délai)
Et aucun overlay de décompte n'est affiché
Et la transition est fluide
Scénario: Annulation du passage automatique
Étant donné qu'un contenu se termine
Et que le timer de 2 secondes démarre
Quand je clique sur "Rester sur ce contenu" pendant le décompte
Alors le timer est annulé
Et le contenu actuel reste en pause à la fin
Et le contenu suivant n'est pas lancé
Scénario: Insertion de publicité pendant le délai de transition
Étant donné que j'ai écouté 4 contenus sans publicité
Et que le 5ème contenu se termine
Quand le délai de 2 secondes démarre
Alors une publicité s'insère dans la file d'attente
Et le message devient "Publicité (15s)"
Et la publicité démarre après les 2 secondes
Et elle ne coupe jamais un contenu en cours
Scénario: Fréquence de publicité paramétrable admin
Étant donné que la fréquence pub est configurée à "1/5 contenus"
Quand j'écoute 10 contenus
Alors 2 publicités sont insérées (après les contenus 5 et 10)
Étant donné que l'admin change la fréquence à "1/3 contenus"
Quand j'écoute 9 contenus
Alors 3 publicités sont insérées (après les contenus 3, 6 et 9)
Scénario: Publicité skippable après 5 secondes par défaut
Étant donné qu'une publicité de 30 secondes démarre
Et que le délai minimal de visionnage est configuré à 5 secondes
Quand j'écoute pendant 3 secondes
Alors le bouton "Passer" n'est pas encore visible
Quand j'atteins 5 secondes d'écoute
Alors le bouton "Passer" apparaît
Et je peux cliquer pour passer au contenu suivant
Scénario: Délai minimal de publicité paramétrable admin
Étant donné qu'une publicité démarre
Et que l'admin a configuré le délai à 10 secondes
Quand j'écoute pendant 9 secondes
Alors le bouton "Passer" n'est pas visible
Quand j'atteins 10 secondes
Alors le bouton "Passer" apparaît
Et je peux skipper la publicité
Scénario: Like et abonnement autorisés sur une publicité
Étant donné qu'une publicité est en lecture
Quand je clique sur le bouton cœur (véhicule arrêté)
Alors la publicité reçoit un like (+2% jauges tags pub)
Quand je clique sur "S'abonner" au créateur de la pub
Alors je suis abonné (+5% jauges tags créateur)
Et le créateur de pub bénéficie de l'engagement
Scénario: Métriques d'engagement publicité trackées
Étant donné qu'une publicité de 30s est diffusée à 100 auditeurs
Quand 40 auditeurs écoutent entièrement (30s)
Et que 50 auditeurs skippent après 10s
Et que 10 auditeurs skippent avant 5s
Alors les métriques sont:
| Métrique | Valeur |
| Taux d'écoute complète | 40% |
| Taux de skip après seuil | 50% |
| Taux de skip immédiat | 10% |
| Durée moyenne d'écoute | 18s |
Scénario: Message "Aucun contenu disponible" si file vide
Étant donné que la file d'attente est vide
Et qu'aucun contenu n'est disponible dans ma zone
Quand le contenu actuel se termine
Alors un message s'affiche: "Aucun contenu disponible dans cette zone"
Et une proposition apparaît: "Élargir la zone de recherche ?"
Et un bouton "Élargir" est disponible
Et la lecture se met en pause automatiquement
Scénario: Élargissement automatique de la zone de recherche
Étant donné que le message "Aucun contenu disponible" s'affiche
Quand je clique sur "Élargir la zone"
Alors l'algorithme relance une recherche avec rayon +50km
Et une notification "Recherche élargie à 50km" s'affiche
Et la file d'attente est recalculée
Et la lecture reprend automatiquement
Scénario: Refus d'élargissement laisse en pause
Étant donné que le message "Aucun contenu disponible" s'affiche
Quand je clique sur "Annuler"
Alors la lecture reste en pause
Et l'interface affiche "En attente de contenu"
Et je peux manuellement naviguer ou chercher du contenu
Scénario: Retry avec backoff exponentiel en cas d'échec réseau
Étant donné que le contenu suivant échoue au chargement
Quand la première tentative échoue
Alors le système retente après 1 seconde (backoff 1s)
Quand la 2ème tentative échoue
Alors le système retente après 2 secondes (backoff 2s)
Quand la 3ème tentative échoue
Alors le système retente après 4 secondes (backoff 4s)
Et après 3 échecs totaux, le système bascule en mode offline
Scénario: Basculement mode offline après 3 échecs réseau
Étant donné que j'ai eu 3 échecs de chargement consécutifs
Quand le 3ème échec se produit
Alors un message "Connexion instable, basculement mode offline" s'affiche
Et la lecture continue avec les contenus téléchargés uniquement
Et les contenus en ligne sont temporairement désactivés
Quand la connexion revient
Alors le mode en ligne est automatiquement rétabli
Scénario: Overlay de décompte avec barre visuelle
Étant donné qu'un contenu se termine
Quand le timer de 2 secondes démarre
Alors un overlay semi-transparent s'affiche en bas de l'écran
Et le texte "Contenu suivant dans 2s..." est visible
Et une barre de progression décroît de 100% à 0% en 2 secondes
Et la couleur de la barre passe de vert à orange
Et l'overlay disparaît automatiquement après le décompte
Scénario: Bouton "Rester sur ce contenu" pendant décompte
Étant donné que le décompte de 2 secondes est actif
Quand l'overlay s'affiche
Alors un bouton "Rester sur ce contenu" est visible
Et il est cliquable pendant les 2 secondes
Quand je clique dessus
Alors le timer est annulé immédiatement
Et l'overlay disparaît
Et le contenu actuel reste affiché en pause
Scénario: Pas d'interruption d'un contenu en cours
Étant donné que j'écoute un contenu de 10 minutes
Et que je suis à 5 minutes de lecture
Quand une publicité devrait s'insérer (fréquence 1/5)
Alors la publicité n'interrompt jamais le contenu en cours
Et elle attend la fin du contenu actuel
Et elle s'insère pendant le délai de transition (2s)
Scénario: Publicités uniquement pour utilisateurs gratuits
Étant donné que je suis un utilisateur gratuit
Quand j'écoute 5 contenus
Alors une publicité est insérée après le 5ème contenu
Étant donné que je passe en compte Premium
Quand j'écoute 100 contenus
Alors aucune publicité n'est insérée
Et l'enchaînement est direct (2s de transition seulement)
Scénario: Message clair pour l'utilisateur lors de la publicité
Étant donné qu'une publicité va démarrer
Quand le délai de transition démarre
Alors le message affiché est: "Publicité (15s)"
Et la durée totale de la pub est indiquée
Et l'utilisateur sait qu'il s'agit d'une pub
Et la transparence est maximale
Scénario: Transition fluide entre contenus sans coupure
Étant donné qu'un contenu se termine
Et que le suivant est pré-chargé en cache
Quand le timer de 2s expire
Alors la transition audio utilise un crossfade de 0.3s
Et il n'y a aucun blanc ou coupure
Et l'expérience est fluide
Scénario: Gestion des erreurs de chargement avec retry
Étant donné que le contenu suivant échoue au chargement
Quand la 1ère tentative échoue
Alors une notification "Chargement..." s'affiche
Et le système retente automatiquement
Quand la 2ème tentative réussit
Alors la lecture démarre normalement
Et aucune action utilisateur n'est requise
Scénario: Mode offline après échecs multiples
Étant donné que j'ai 50 contenus téléchargés en mode offline
Et que j'ai eu 3 échecs réseau consécutifs
Quand le mode offline s'active
Alors seuls les contenus téléchargés sont disponibles
Et un badge "Mode offline" s'affiche en haut de l'écran
Et la lecture continue sans interruption
Scénario: Compteur de contenus avant prochaine publicité
Étant donné que la fréquence pub est 1/5 contenus
Et que j'ai écouté 3 contenus depuis la dernière pub
Quand je consulte l'interface
Alors un indicateur discret affiche "2 contenus avant pub"
Et l'utilisateur sait quand attendre la prochaine publicité
Plan du Scénario: Délai de transition selon mode
Étant donné que je suis en mode <mode>
Quand un contenu se termine
Alors le délai de transition est <delai> secondes
Et le message affiché est <message>
Exemples:
| mode | delai | message |
| Standard | 2 | "Contenu suivant dans 2s..." |
| Kids | 1 | "Contenu suivant dans 1s..." |
| Live | 0 | (aucun message) |
Plan du Scénario: Fréquence d'insertion des publicités
Étant donné que la fréquence pub est configurée à <frequence>
Quand j'écoute <contenus> contenus
Alors <pubs> publicités sont insérées
Exemples:
| frequence | contenus | pubs |
| 1/3 | 6 | 2 |
| 1/3 | 9 | 3 |
| 1/5 | 10 | 2 |
| 1/5 | 15 | 3 |
| 1/7 | 14 | 2 |
| 1/7 | 21 | 3 |
Plan du Scénario: Backoff exponentiel retry
Étant donné que le chargement échoue
Quand je suis à la tentative <tentative>
Alors le délai de retry est <delai> secondes
Exemples:
| tentative | delai |
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |