Files
roadwave/features/ui/audio-guides/integration-fonctionnalites.feature
jpgiannetti 37c62206ad 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>
2026-02-01 11:31:41 +01:00

350 lines
15 KiB
Gherkin
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# language: fr
Fonctionnalité: Intégration audio-guides avec autres fonctionnalités
En tant qu'utilisateur
Je veux utiliser les audio-guides avec toutes les fonctionnalités de l'app
Afin d'avoir une expérience complète et cohérente
Contexte:
Étant donné que l'application RoadWave est démarrée
Et que l'utilisateur "jean@example.com" est connecté
# 16.14 - Téléchargement offline
Scénario: Téléchargement complet d'un audio-guide
Étant donné un audio-guide "Visite du Louvre" avec 12 séquences
Quand l'utilisateur clique sur " Télécharger pour écouter hors ligne"
Alors toutes les 12 séquences sont téléchargées
Et les métadonnées (titres, descriptions, GPS) sont sauvegardées
Et les images (cover, miniatures) sont mises en cache
Scénario: Affichage de la progression du téléchargement
Étant donné qu'un téléchargement d'audio-guide est en cours
Quand l'utilisateur consulte l'état
Alors la progression s'affiche:
"""
Téléchargement en cours...
Séquence 7/12 245 MB / 380 MB
64%
"""
Scénario: Téléchargement uniquement en WiFi (par défaut)
Étant donné que l'option "Télécharger uniquement en WiFi" est activée
Quand l'utilisateur lance un téléchargement sur réseau mobile
Alors un avertissement s'affiche:
"""
Téléchargement nécessite WiFi
Cet audio-guide pèse 380 MB.
[Attendre WiFi] [Télécharger quand même]
"""
Scénario: Gestion de l'espace de stockage
Étant donné que l'appareil a 500 MB d'espace libre
Et qu'un audio-guide pèse 380 MB
Quand l'utilisateur lance le téléchargement
Alors un avertissement s'affiche:
"""
Espace de stockage limité
Après téléchargement : 120 MB restants
[Continuer] [Gérer stockage] [Annuler]
"""
Scénario: Liste des audio-guides téléchargés
Étant donné que l'utilisateur a téléchargé 3 audio-guides
Quand il accède à "Bibliothèque > Téléchargés"
Alors il voit:
| audio_guide | taille | date_telechargement |
| Visite du Louvre | 380 MB | 2026-01-20 |
| Safari du Paugre | 245 MB | 2026-01-18 |
| Circuit Loire à Vélo | 520 MB | 2026-01-15 |
Scénario: Lecture hors connexion complète
Étant donné qu'un audio-guide est téléchargé
Et que l'utilisateur active le mode avion
Quand il lance l'audio-guide
Alors toutes les séquences sont lisibles
Et les métadonnées sont accessibles
Et les images s'affichent normalement
Et la progression est sauvegardée localement
Scénario: GPS fonctionne en mode avion (mode voiture)
Étant donné qu'un audio-guide voiture est téléchargé
Et que le mode avion est activé (avec GPS actif)
Quand l'utilisateur se déplace
Alors les déclenchements GPS fonctionnent normalement
Et la distance/ETA sont calculés
Parce que le GPS ne nécessite pas de connexion internet
Scénario: Suppression d'audio-guide téléchargé
Étant donné qu'un audio-guide téléchargé pèse 380 MB
Quand l'utilisateur clique sur "🗑 Supprimer téléchargement"
Alors une confirmation s'affiche
Et si confirmé, les 380 MB sont libérés
Et l'audio-guide reste accessible en streaming
Scénario: Mise à jour automatique si nouvelle version
Étant donné qu'un audio-guide téléchargé a été mis à jour par le créateur
Quand l'utilisateur se connecte en WiFi
Alors une notification s'affiche:
"""
🔄 Mise à jour disponible
"Visite du Louvre" - Nouvelle version
[Mettre à jour] [Plus tard]
"""
# 16.15 - Playlists et collections
Scénario: Ajout d'audio-guide à une playlist
Étant donné que l'utilisateur consulte un audio-guide
Quand il clique sur " Ajouter à une playlist"
Alors ses playlists s'affichent:
| playlist |
| 🗺 Voyages en France |
| 🏛 Musées parisiens |
| + Créer nouvelle playlist |
Scénario: Comportement audio-guide dans une playlist
Étant donné une playlist contenant 2 audio-guides et 1 podcast
Quand la lecture atteint un audio-guide
Alors l'audio-guide démarre à la séquence 1 (ou progression sauvegardée)
Et les séquences se jouent normalement
Quand l'audio-guide se termine (dernière séquence)
Alors le contenu suivant de la playlist démarre
Scénario: Audio-guide marqué comme "Favori"
Étant donné qu'un utilisateur aime un audio-guide
Quand il clique sur " Ajouter aux favoris"
Alors l'audio-guide est ajouté à la section "Favoris"
Et il est facilement accessible depuis le menu principal
Scénario: Collections thématiques d'audio-guides
Étant donné que RoadWave propose des collections éditoriales
Quand l'utilisateur accède à "Collections"
Alors il voit des collections comme:
| collection | nombre_audio_guides |
| 🏛 Musées de France | 12 |
| 🦁 Parcs animaliers | 8 |
| 🚴 Circuits vélo | 15 |
| 🚗 Routes touristiques | 10 |
# 16.16 - Partage d'audio-guide
Scénario: Bouton partager sur page audio-guide
Étant donné qu'un utilisateur consulte un audio-guide
Quand il clique sur " Partager"
Alors le menu de partage natif s'ouvre
Et le lien généré est "https://roadwave.fr/share/ag/louvre_123"
Scénario: Page web de partage pour audio-guide
Étant donné qu'un lien d'audio-guide partagé est ouvert sur le web
Quand la page se charge
Alors elle affiche:
| élément | exemple |
| Cover image 16:9 | Photo du Louvre |
| Titre | "Visite du Louvre" |
| Créateur | "@art_guide " |
| Badge type | "🎧 Audio-guide 12 séquences" |
| Durée totale | "45 minutes" |
| Mode | "🚶 Piéton" |
| Description | Texte complet |
| Preview séquence 1 | Player HTML5 (séquence intro) |
| Carte avec points GPS | Leaflet avec 12 markers |
| CTA téléchargement | Boutons App Store / Google Play |
Scénario: Deep link vers audio-guide spécifique
Étant donné que l'app est installée
Et qu'un lien "https://roadwave.fr/share/ag/louvre_123" est cliqué
Quand le système détecte l'app
Alors l'app s'ouvre directement sur l'audio-guide
Et l'utilisateur peut démarrer immédiatement
Scénario: Partage avec séquence spécifique
Étant donné qu'un utilisateur est sur la séquence 5 "La Joconde"
Quand il partage l'audio-guide
Alors le lien généré est "https://roadwave.fr/share/ag/louvre_123?seq=5"
Et le destinataire est dirigé vers la séquence 5 directement
# 16.17 - Notations et commentaires
Scénario: Note globale de l'audio-guide
Étant donné qu'un utilisateur termine un audio-guide
Quand la dernière séquence se termine
Alors une popup de notation s'affiche:
"""
Comment avez-vous trouvé cet audio-guide ?
[Ajouter un commentaire (optionnel)]
"""
Scénario: Note moyenne affichée sur la page
Étant donné qu'un audio-guide a reçu 150 notes
Et que la moyenne est 4.3/5
Quand la page est affichée
Alors la note " 4.3 (150 avis)" est visible
Scénario: Commentaires triés par pertinence
Étant donné qu'un audio-guide a 50 commentaires
Quand l'utilisateur consulte les avis
Alors les commentaires sont triés par défaut selon:
| critère | poids |
| Note élevée | 30% |
| Récent | 30% |
| Likes reçus | 40% |
Scénario: Réponse du créateur aux commentaires
Étant donné qu'un utilisateur laisse un commentaire négatif
Quand le créateur consulte son dashboard
Alors il peut répondre au commentaire
Et sa réponse apparaît en dessous avec badge "Créateur"
# 16.18 - Recommandations intelligentes
Scénario: Audio-guides similaires recommandés
Étant donné qu'un utilisateur termine "Visite du Louvre"
Quand il consulte les recommandations
Alors l'algorithme suggère des audio-guides basés sur:
| critère | exemple |
| Tags similaires | #Art #Histoire #Musée |
| Créateur identique | Autres audio-guides de @art_guide |
| Localisation proche | Autres musées parisiens |
| Mode de déplacement | Autres audio-guides piéton |
Scénario: Suggestion géographique contextuelle
Étant donné qu'un utilisateur est à Paris (GPS détecté)
Quand il ouvre l'onglet "Audio-guides"
Alors les audio-guides parisiens sont mis en avant
Et un filtre "🗺 Autour de moi" est pré-appliqué
Scénario: Badge "Populaire dans votre région"
Étant donné qu'un audio-guide a >100 écoutes dans la région Île-de-France
Et que l'utilisateur est en Île-de-France
Quand l'audio-guide est affiché
Alors un badge "🔥 Populaire près de chez vous" est visible
# 16.19 - Optimisations techniques
Scénario: Préchargement de la séquence suivante
Étant donné que la séquence 3 est en cours à 2:30/3:42
Quand il reste 60 secondes de lecture
Alors la séquence 4 est préchargée en arrière-plan
Et la transition est instantanée (0 latence)
Scénario: Buffer adaptatif selon connexion
Étant donné qu'un utilisateur est sur réseau 4G
Quand la séquence démarre
Alors 30 secondes d'audio sont bufferisées initialement
Et le buffering continue en arrière-plan
Plan du Scénario: Buffer selon qualité réseau
Étant donné qu'un utilisateur est sur réseau <reseau>
Quand une séquence démarre
Alors <buffer_secondes> secondes sont bufferisées
Exemples:
| reseau | buffer_secondes |
| WiFi | 60 |
| 5G | 45 |
| 4G | 30 |
| 3G | 20 |
Scénario: Compression audio adaptative
Étant donné qu'un utilisateur est sur connexion lente (3G)
Quand une séquence est streamée
Alors le CDN sert la version 64 kbps (au lieu de 128 kbps)
Et la qualité reste acceptable pour la voix
Scénario: Cache intelligent des séquences jouées
Étant donné qu'un utilisateur a écouté les séquences 1-5
Quand il clique sur "Précédent" pour réécouter la séquence 4
Alors la séquence 4 est chargée depuis le cache local
Et le chargement est instantané (pas de stream)
Scénario: Nettoyage automatique du cache
Étant donné que le cache audio occupe 500 MB
Et que la limite configurée est 300 MB
Quand le nettoyage automatique s'exécute
Alors les séquences les plus anciennes (non téléchargées) sont supprimées
Et le cache revient à 280 MB
# 16.20 - Analytics et tracking
Scénario: Tracking des événements clés
Étant donné qu'un utilisateur écoute un audio-guide
Quand il interagit avec l'application
Alors les événements suivants sont trackés:
| événement | données |
| audio_guide_started | audio_guide_id, mode, user_id |
| sequence_completed | sequence_id, completion_rate, duration |
| audio_guide_completed | audio_guide_id, total_time, sequences_count|
| point_gps_triggered | point_id, distance, auto_or_manual |
| point_gps_missed | point_id, distance, action_taken |
| paywall_displayed | audio_guide_id, sequence_number |
| premium_conversion | source: audio_guide_paywall |
Scénario: Heatmap des abandons par séquence
Étant donné qu'un audio-guide a été écouté 1000 fois
Quand le créateur consulte la heatmap
Alors il voit pour chaque séquence:
| sequence | starts | completions | abandon_rate |
| 1 | 1000 | 950 | 5% |
| 2 | 950 | 920 | 3% |
| 3 | 920 | 850 | 8% |
| ... | ... | ... | ... |
| 12 | 650 | 580 | 11% |
Scénario: Attribution GPS auto vs manuel
Étant donné un audio-guide voiture avec 8 points GPS
Quand les statistiques sont calculées
Alors le créateur voit:
| mode_declenchement | nombre |
| GPS automatique | 542 |
| Manuel | 123 |
| Point manqué | 89 |
# Cas d'erreur et edge cases
Scénario: Audio-guide avec une seule séquence (edge case)
Étant donné un audio-guide avec seulement 1 séquence
Quand il est publié
Alors un avertissement s'affiche:
"""
Un audio-guide doit contenir au minimum 2 séquences
Ajoutez au moins 1 séquence supplémentaire avant publication
"""
Scénario: Séquence manquante ou corrompue
Étant donné qu'une séquence 5 a un fichier audio corrompu
Quand l'utilisateur tente de la lire
Alors un message d'erreur s'affiche
Et un bouton " Passer à la suivante" est disponible
Et le créateur reçoit une notification de l'erreur
Scénario: GPS désactivé puis réactivé en cours de route
Étant donné un audio-guide voiture en cours
Et que l'utilisateur désactive le GPS
Quand il le réactive 10 minutes plus tard
Alors le déclenchement automatique reprend
Et les points GPS manqués entre-temps ne déclenchent pas de popup
Scénario: Modification d'audio-guide avec utilisateurs en cours
Étant donné qu'un audio-guide a 50 utilisateurs en cours d'écoute
Quand le créateur modifie une séquence
Alors les utilisateurs actuels conservent l'ancienne version
Et les nouveaux utilisateurs obtiennent la nouvelle version
Et un message informe les utilisateurs lors de la prochaine ouverture
Scénario: Suppression d'audio-guide par le créateur
Étant donné qu'un audio-guide a 20 utilisateurs avec progression
Quand le créateur supprime l'audio-guide
Alors une confirmation stricte est demandée
Et si confirmé, les progressions utilisateurs sont archivées (30 jours)
Et l'audio-guide devient inaccessible
Scénario: Signalement d'audio-guide pour contenu inapproprié
Étant donné qu'un utilisateur signale un audio-guide
Quand le signalement est modéré
Et jugé valide
Alors l'audio-guide est dépublié temporairement
Et le créateur reçoit une notification d'explication
Et il peut corriger puis republier