Initial commit
This commit is contained in:
310
features/audio-guides/progression-sauvegarde.feature
Normal file
310
features/audio-guides/progression-sauvegarde.feature
Normal file
@@ -0,0 +1,310 @@
|
||||
# language: fr
|
||||
|
||||
Fonctionnalité: Sauvegarde et reprise de progression audio-guide
|
||||
En tant qu'utilisateur
|
||||
Je veux que ma progression soit sauvegardée automatiquement
|
||||
Afin de pouvoir reprendre mon audio-guide là où je me suis arrêté
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'application RoadWave est démarrée
|
||||
Et que l'utilisateur "jean@example.com" est connecté
|
||||
|
||||
# 16.5 - Sauvegarde de progression
|
||||
|
||||
Scénario: Sauvegarde automatique toutes les 10 secondes
|
||||
Étant donné qu'un audio-guide "Visite du Louvre" est en cours
|
||||
Et que la séquence 3 est à la position 1:24
|
||||
Quand 10 secondes s'écoulent
|
||||
Alors la progression est sauvegardée automatiquement:
|
||||
| donnée | valeur |
|
||||
| audio_guide_id | louvre_123 |
|
||||
| sequence_actuelle | 3 |
|
||||
| position_audio | 1:24 |
|
||||
| timestamp | 2026-01-22 14:35:42 |
|
||||
| sequences_ecoutees | [1, 2] |
|
||||
|
||||
Scénario: Sauvegarde locale (SQLite) pour rapidité
|
||||
Étant donné qu'une sauvegarde est déclenchée
|
||||
Quand la progression est enregistrée
|
||||
Alors les données sont écrites en SQLite local
|
||||
Et l'écriture prend moins de 50ms
|
||||
Et l'application reste fluide
|
||||
|
||||
Scénario: Synchronisation cloud en arrière-plan
|
||||
Étant donné qu'une sauvegarde locale est effectuée
|
||||
Quand 30 secondes s'écoulent
|
||||
Alors la progression est synchronisée vers PostgreSQL cloud
|
||||
Et la synchronisation s'effectue en arrière-plan
|
||||
Et elle n'impacte pas les performances
|
||||
|
||||
Scénario: Sauvegarde immédiate lors de la fermeture
|
||||
Étant donné qu'un audio-guide est en cours à la séquence 4 position 2:15
|
||||
Quand l'utilisateur ferme l'application
|
||||
Alors la progression est sauvegardée immédiatement (local + cloud)
|
||||
Et les données sont écrites avant la fermeture complète
|
||||
|
||||
Scénario: Sauvegarde des séquences complétées
|
||||
Étant donné qu'un audio-guide de 12 séquences est en cours
|
||||
Et que les séquences 1, 2, 4, 5 ont été écoutées à >80%
|
||||
Quand la progression est sauvegardée
|
||||
Alors les séquences complétées sont enregistrées:
|
||||
"""json
|
||||
{
|
||||
"audio_guide_id": "louvre_123",
|
||||
"completed_sequences": [1, 2, 4, 5],
|
||||
"current_sequence": 6,
|
||||
"current_position": "0:42",
|
||||
"last_played_at": "2026-01-22T14:35:42Z"
|
||||
}
|
||||
"""
|
||||
|
||||
Scénario: Historique des écoutes pour statistiques
|
||||
Étant donné qu'un utilisateur a écouté 3 séquences d'un audio-guide
|
||||
Quand les données sont sauvegardées
|
||||
Alors l'historique d'écoute inclut:
|
||||
| sequence_id | started_at | completed_at | completion_rate |
|
||||
| 1 | 2026-01-22 14:10:00 | 2026-01-22 14:12:15 | 100% |
|
||||
| 2 | 2026-01-22 14:12:20 | 2026-01-22 14:14:08 | 100% |
|
||||
| 3 | 2026-01-22 14:14:15 | 2026-01-22 14:17:45 | 92% |
|
||||
|
||||
# 16.6 - Reprise de progression
|
||||
|
||||
Scénario: Popup de reprise au redémarrage
|
||||
Étant donné que l'utilisateur a quitté l'app à la séquence 6 position 2:34
|
||||
Quand il rouvre l'audio-guide "Visite du Louvre"
|
||||
Alors une popup s'affiche:
|
||||
"""
|
||||
Continuer où vous vous étiez arrêté ?
|
||||
|
||||
📍 Séquence 6/12 : "Vénus de Milo"
|
||||
⏱️ Position : 2:34 / 4:10
|
||||
|
||||
[▶️ Reprendre] [🔄 Recommencer]
|
||||
"""
|
||||
|
||||
Scénario: Action "Reprendre" - Position exacte restaurée
|
||||
Étant donné qu'une popup de reprise est affichée
|
||||
Quand l'utilisateur clique sur "▶️ Reprendre"
|
||||
Alors la séquence 6 "Vénus de Milo" se charge
|
||||
Et la position exacte 2:34 est restaurée
|
||||
Et la lecture démarre automatiquement après 1 seconde
|
||||
|
||||
Scénario: Action "Recommencer" - Réinitialisation complète
|
||||
Étant donné qu'une popup de reprise est affichée
|
||||
Quand l'utilisateur clique sur "🔄 Recommencer"
|
||||
Alors l'audio-guide redémarre depuis la séquence 1 position 0:00
|
||||
Et toutes les séquences sont marquées ⭕ "À écouter"
|
||||
Et l'historique d'écoute est réinitialisé pour cette session
|
||||
|
||||
Scénario: Reprise après 7 jours d'inactivité
|
||||
Étant donné qu'un utilisateur a arrêté un audio-guide le 15/01/2026
|
||||
Et qu'il le rouvre le 22/01/2026 (7 jours plus tard)
|
||||
Quand l'audio-guide se charge
|
||||
Alors la popup de reprise s'affiche normalement
|
||||
Et toutes les données de progression sont conservées
|
||||
|
||||
Scénario: Reprise sur un autre appareil (synchronisation cloud)
|
||||
Étant donné qu'un utilisateur écoute un audio-guide sur iPhone
|
||||
Et qu'il quitte à la séquence 4 position 1:20
|
||||
Quand il ouvre le même audio-guide sur iPad
|
||||
Alors la popup de reprise s'affiche avec la progression iPhone
|
||||
Et il peut reprendre exactement où il s'était arrêté
|
||||
|
||||
Scénario: Conflit de synchronisation (dernier appareil gagne)
|
||||
Étant donné qu'un utilisateur écoute sur iPhone à la séquence 3
|
||||
Et simultanément sur iPad à la séquence 7
|
||||
Quand les deux appareils synchronisent
|
||||
Alors la progression la plus récente (timestamp) est conservée
|
||||
Et l'appareil avec ancienne progression affiche une notification:
|
||||
"""
|
||||
ℹ️ Progression mise à jour
|
||||
Une écoute plus récente a été détectée.
|
||||
Séquence 7 restaurée.
|
||||
"""
|
||||
|
||||
Scénario: Mode hors-ligne - Sauvegarde locale uniquement
|
||||
Étant donné qu'un utilisateur écoute un audio-guide hors connexion
|
||||
Et qu'il atteint la séquence 5
|
||||
Quand la progression est sauvegardée
|
||||
Alors les données sont écrites localement (SQLite)
|
||||
Et une icône "☁️ Non synchronisé" s'affiche discrètement
|
||||
|
||||
Scénario: Synchronisation automatique à la reconnexion
|
||||
Étant donné que l'utilisateur a écouté hors ligne jusqu'à la séquence 8
|
||||
Et que 5 progressions locales ne sont pas synchronisées
|
||||
Quand la connexion réseau est rétablie
|
||||
Alors les 5 progressions sont synchronisées automatiquement
|
||||
Et un toast s'affiche brièvement: "✅ Progression synchronisée"
|
||||
|
||||
Scénario: Suppression de la progression (recommencer proprement)
|
||||
Étant donné qu'un utilisateur est à la séquence 10/12
|
||||
Quand il ouvre les paramètres de l'audio-guide
|
||||
Et qu'il clique sur "🔄 Réinitialiser progression"
|
||||
Alors une confirmation s'affiche:
|
||||
"""
|
||||
Réinitialiser cet audio-guide ?
|
||||
Toutes les séquences seront marquées comme non écoutées.
|
||||
[Annuler] [Réinitialiser]
|
||||
"""
|
||||
Et si confirmé, la progression est effacée
|
||||
|
||||
# 16.7 - Statistiques d'écoute
|
||||
|
||||
Scénario: Taux de complétion global de l'audio-guide
|
||||
Étant donné un audio-guide de 12 séquences
|
||||
Et que l'utilisateur a écouté complètement 8 séquences
|
||||
Et partiellement 1 séquence (45%)
|
||||
Quand les statistiques sont calculées
|
||||
Alors le taux de complétion affiché est "67%" (8/12)
|
||||
|
||||
Scénario: Badge "Audio-guide complété" à 100%
|
||||
Étant donné un audio-guide de 12 séquences
|
||||
Quand l'utilisateur écoute la 12ème séquence à 100%
|
||||
Alors un badge "✅ Audio-guide complété" s'affiche
|
||||
Et une notification de félicitations est envoyée
|
||||
Et le statut "Complété le 22/01/2026" est visible dans l'historique
|
||||
|
||||
Scénario: Temps total passé sur l'audio-guide
|
||||
Étant donné qu'un utilisateur a écouté un audio-guide sur 2 sessions:
|
||||
| session | durée |
|
||||
| 1 | 25 min |
|
||||
| 2 | 18 min |
|
||||
Quand les statistiques sont calculées
|
||||
Alors le temps total est "43 minutes"
|
||||
Et il est affiché dans l'historique personnel
|
||||
|
||||
Scénario: Liste des audio-guides "En cours" dans le profil
|
||||
Étant donné qu'un utilisateur a 3 audio-guides en cours:
|
||||
| audio_guide | progression |
|
||||
| Visite du Louvre | 6/12 |
|
||||
| Safari du Paugre | 3/8 |
|
||||
| Circuit Loire à Vélo | 12/15 |
|
||||
Quand il consulte son profil "Audio-guides"
|
||||
Alors la section "📍 En cours" affiche les 3 audio-guides
|
||||
Et chaque élément montre la progression sous forme de barre
|
||||
|
||||
Scénario: Liste des audio-guides "Complétés" dans le profil
|
||||
Étant donné qu'un utilisateur a complété 2 audio-guides:
|
||||
| audio_guide | date_completion |
|
||||
| Tour de Paris | 2026-01-15 |
|
||||
| Découverte de Lyon | 2026-01-20 |
|
||||
Quand il consulte son profil "Audio-guides"
|
||||
Alors la section "✅ Complétés" affiche les 2 audio-guides
|
||||
Et la date de complétion est visible
|
||||
|
||||
Scénario: Badge "Complétiste" pour 10 audio-guides complétés
|
||||
Étant donné qu'un utilisateur complète son 10ème audio-guide
|
||||
Quand la complétion est enregistrée
|
||||
Alors un badge "🏆 Complétiste" est débloqué
|
||||
Et il apparaît sur son profil
|
||||
Et une notification est envoyée:
|
||||
"""
|
||||
🎉 Badge débloqué : Complétiste
|
||||
Vous avez complété 10 audio-guides !
|
||||
"""
|
||||
|
||||
Plan du Scénario: Niveaux de badges selon nombre d'audio-guides complétés
|
||||
Étant donné qu'un utilisateur complète <nombre> audio-guides
|
||||
Quand le badge est attribué
|
||||
Alors il reçoit le badge "<badge>"
|
||||
|
||||
Exemples:
|
||||
| nombre | badge |
|
||||
| 1 | 🎧 Premier audio-guide |
|
||||
| 5 | 🗺️ Explorateur |
|
||||
| 10 | 🏆 Complétiste |
|
||||
| 25 | 🌟 Expert |
|
||||
| 50 | 💎 Maître audio-guideur |
|
||||
|
||||
# 16.8 - Métriques créateur
|
||||
|
||||
Scénario: Dashboard créateur - Statistiques par audio-guide
|
||||
Étant donné qu'un créateur a publié l'audio-guide "Visite du Louvre"
|
||||
Quand il consulte son dashboard
|
||||
Alors les métriques suivantes sont affichées:
|
||||
| métrique | valeur |
|
||||
| Écoutes totales | 1542 |
|
||||
| Écoutes complètes (>80%) | 892 |
|
||||
| Taux de complétion moyen | 58% |
|
||||
| Temps d'écoute total | 423h |
|
||||
| Séquence la plus écoutée | Séq. 3 |
|
||||
| Séquence la moins écoutée | Séq. 11 |
|
||||
|
||||
Scénario: Graphique de complétion par séquence
|
||||
Étant donné un audio-guide de 12 séquences
|
||||
Quand le créateur consulte les statistiques détaillées
|
||||
Alors un graphique en barres affiche:
|
||||
| séquence | taux_completion |
|
||||
| 1 | 100% |
|
||||
| 2 | 95% |
|
||||
| 3 | 89% |
|
||||
| ... | ... |
|
||||
| 12 | 58% |
|
||||
|
||||
Scénario: Détection des points d'abandon
|
||||
Étant donné qu'un audio-guide a un taux de complétion de 58%
|
||||
Et que 35% des utilisateurs abandonnent à la séquence 7
|
||||
Quand le créateur consulte les insights
|
||||
Alors un avertissement s'affiche:
|
||||
"""
|
||||
⚠️ Point d'abandon détecté
|
||||
35% des utilisateurs abandonnent à la séquence 7 "Aile Richelieu"
|
||||
Durée : 8 min
|
||||
Suggestion : Réduire la durée ou rendre plus captivant
|
||||
"""
|
||||
|
||||
Scénario: Heatmap géographique des écoutes
|
||||
Étant donné un audio-guide géolocalisé
|
||||
Quand le créateur consulte la heatmap
|
||||
Alors une carte affiche:
|
||||
| élément | description |
|
||||
| Densité d'écoutes | Zones rouge/orange/jaune selon écoutes |
|
||||
| Points GPS | Marqueurs sur chaque point |
|
||||
| Statistiques par point | Nombre d'écoutes par zone |
|
||||
|
||||
Scénario: Temps moyen par séquence
|
||||
Étant donné qu'un créateur analyse son audio-guide
|
||||
Quand il consulte les statistiques temporelles
|
||||
Alors il voit pour chaque séquence:
|
||||
| séquence | durée_audio | temps_ecoute_moyen | ecart |
|
||||
| 1 | 2:15 | 2:10 | -5s |
|
||||
| 2 | 1:48 | 1:30 | -18s |
|
||||
| 3 | 3:42 | 3:40 | -2s |
|
||||
|
||||
Scénario: Notification créateur pour milestone
|
||||
Étant donné qu'un audio-guide atteint 1000 écoutes
|
||||
Quand le seuil est franchi
|
||||
Alors une notification est envoyée au créateur:
|
||||
"""
|
||||
🎉 Félicitations !
|
||||
Votre audio-guide "Visite du Louvre" a atteint 1000 écoutes !
|
||||
Taux de complétion : 58%
|
||||
"""
|
||||
|
||||
# Cas d'erreur et limites
|
||||
|
||||
Scénario: Corruption de données de sauvegarde
|
||||
Étant donné qu'une sauvegarde locale (SQLite) est corrompue
|
||||
Quand l'application tente de charger la progression
|
||||
Alors une récupération depuis le cloud est tentée
|
||||
Et si réussie, les données cloud sont restaurées
|
||||
Et la base locale est reconstruite
|
||||
|
||||
Scénario: Échec de synchronisation cloud
|
||||
Étant donné que l'API cloud est indisponible
|
||||
Quand une tentative de synchronisation est effectuée
|
||||
Alors l'application continue avec sauvegarde locale uniquement
|
||||
Et un retry automatique est programmé dans 5 minutes
|
||||
Et l'icône "☁️ Non synchronisé" reste affichée
|
||||
|
||||
Scénario: Suppression accidentelle de progression (récupération)
|
||||
Étant donné qu'un utilisateur réinitialise un audio-guide par erreur
|
||||
Quand il contacte le support dans les 7 jours
|
||||
Alors l'équipe peut restaurer la progression depuis les backups
|
||||
Et les données sont récupérables (backup quotidien conservé 30 jours)
|
||||
|
||||
Scénario: Nettoyage automatique des vieilles progressions
|
||||
Étant donné qu'une progression n'a pas été mise à jour depuis 6 mois
|
||||
Quand le nettoyage automatique s'exécute
|
||||
Alors la progression est archivée (mais pas supprimée)
|
||||
Et l'utilisateur peut la restaurer via l'historique
|
||||
Reference in New Issue
Block a user