feat(gherkin): compléter couverture règles métier avec 47 features manquantes
Ajout de 47 features Gherkin (~650 scénarios) pour couvrir 100% des règles métier : - Authentification (5) : validation mot de passe, tentatives connexion, multi-device, 2FA, récupération - Audio-guides (12) : détection mode, création, navigation piéton/voiture, ETA, gestion points, progression - Navigation (5) : notifications minimalistes, décompte 5s, stationnement, historique, basculement auto - Création contenu (3) : image auto, restrictions modification, suppression - Radio live (2) : enregistrement auto, interdictions modération - Droits auteur (6) : fair use 30s, détection musique, signalements, sanctions, appels - Modération (9) : badges Bronze/Argent/Or, score fiabilité, utilisateur confiance, audit, anti-abus - Premium (2) : webhooks Mangopay, tarification multi-canal - Profil/Partage/Recherche (5) : badge vérifié, stats arrondies, partage premium, filtres avancés, carte Tous les scénarios incluent edge cases, métriques de performance et conformité RGPD. Couverture fonctionnelle MVP maintenant complète.
This commit is contained in:
234
features/api/navigation/auto-switching-modes.feature
Normal file
234
features/api/navigation/auto-switching-modes.feature
Normal file
@@ -0,0 +1,234 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @mode-detection @mvp
|
||||
Fonctionnalité: Basculement automatique entre modes voiture et piéton
|
||||
|
||||
En tant que système de navigation
|
||||
Je veux détecter automatiquement le mode de déplacement de l'utilisateur
|
||||
Et basculer entre mode voiture et mode piéton selon la vitesse GPS
|
||||
Afin d'optimiser l'expérience utilisateur sans action manuelle
|
||||
|
||||
Contexte:
|
||||
Étant donné un utilisateur authentifié avec l'application active
|
||||
Et la géolocalisation est activée et autorisée
|
||||
Et les permissions de géolocalisation en arrière-plan sont accordées
|
||||
|
||||
# ============================================================================
|
||||
# DÉTECTION INITIALE DU MODE AU DÉMARRAGE
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Démarrage application à vitesse piéton (0-4 km/h)
|
||||
Étant donné l'utilisateur ouvre l'application
|
||||
Et les 3 premières lectures GPS montrent des vitesses de [0, 2, 3] km/h
|
||||
Quand le système détermine le mode initial
|
||||
Alors le mode "piéton" doit être activé par défaut
|
||||
Et les notifications push géolocalisées doivent être activées
|
||||
Et un rayon de détection de 200m doit être appliqué
|
||||
|
||||
Scénario: Démarrage application en mouvement (≥5 km/h)
|
||||
Étant donné l'utilisateur ouvre l'application
|
||||
Et les 3 premières lectures GPS montrent des vitesses de [30, 35, 32] km/h
|
||||
Quand le système détermine le mode initial
|
||||
Alors le mode "voiture" doit être activé par défaut
|
||||
Et les notifications in-app avec compteur 7s doivent être activées
|
||||
Et l'ETA doit être calculé pour les contenus géolocalisés
|
||||
|
||||
Scénario: Démarrage avec GPS instable - mode par défaut
|
||||
Étant donné l'utilisateur ouvre l'application
|
||||
Et les lectures GPS sont erratiques : [0, 45, 2, 60, 1] km/h
|
||||
Quand le système ne peut pas déterminer le mode avec confiance
|
||||
Alors le mode "piéton" doit être activé par défaut (mode le plus sûr)
|
||||
Et une modal doit demander à l'utilisateur de confirmer son mode
|
||||
Et le choix utilisateur doit être mémorisé pour la session
|
||||
|
||||
# ============================================================================
|
||||
# BASCULEMENT VOITURE → PIÉTON (vitesse <5 km/h soutenue)
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Arrêt prolongé déclenche basculement piéton
|
||||
Étant donné l'utilisateur est en mode voiture
|
||||
Et la vitesse moyenne sur 2 minutes est de 2 km/h (embouteillage ou arrêt)
|
||||
Quand le système détecte cette condition pendant 2 minutes consécutives
|
||||
Alors le mode doit basculer automatiquement vers "piéton"
|
||||
Et une notification toast doit informer : "Mode piéton activé"
|
||||
Et les notifications push géolocalisées doivent être activées
|
||||
Et le cooldown voiture actif doit être annulé
|
||||
|
||||
Scénario: Stationnement confirmé (vitesse = 0 pendant 2 minutes)
|
||||
Étant donné l'utilisateur est en mode voiture
|
||||
Et la vitesse GPS est de 0 km/h pendant 2 minutes consécutives
|
||||
Et la précision GPS est <20m (pas de perte signal)
|
||||
Quand le système détecte l'arrêt prolongé
|
||||
Alors le mode doit basculer vers "piéton"
|
||||
Et une notification doit proposer : "Voulez-vous activer le mode piéton ?"
|
||||
Et si l'utilisateur ne répond pas, le basculement doit être automatique après 30 secondes
|
||||
|
||||
Scénario: Embouteillage prolongé (vitesse <5 km/h mais en mouvement)
|
||||
Étant donné l'utilisateur est en mode voiture à 35 km/h
|
||||
Et la vitesse chute à 3 km/h et oscille entre 0-4 km/h
|
||||
Et cette condition dure 3 minutes
|
||||
Quand le système détecte un mouvement résiduel (pas totalement arrêté)
|
||||
Alors le mode "voiture" doit être maintenu temporairement
|
||||
Mais le calcul ETA doit passer en mode "vitesse lente"
|
||||
Et après 5 minutes <5 km/h, le mode piéton doit être proposé
|
||||
|
||||
Scénario: Feu rouge ou arrêt temporaire ne déclenche PAS de basculement
|
||||
Étant donné l'utilisateur est en mode voiture à 50 km/h
|
||||
Et la vitesse chute à 0 km/h pendant 45 secondes (feu rouge)
|
||||
Quand le système évalue les conditions
|
||||
Alors le mode "voiture" doit être maintenu
|
||||
Car la durée <2 minutes (seuil de basculement)
|
||||
Et aucune notification ne doit être affichée
|
||||
|
||||
# ============================================================================
|
||||
# BASCULEMENT PIÉTON → VOITURE (vitesse ≥5 km/h soutenue)
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Démarrage voiture déclenche basculement automatique
|
||||
Étant donné l'utilisateur est en mode piéton
|
||||
Et la vitesse passe de 0 km/h à 15 km/h en 10 secondes
|
||||
Et la vitesse reste ≥10 km/h pendant 30 secondes
|
||||
Quand le système détecte une accélération soutenue
|
||||
Alors le mode doit basculer automatiquement vers "voiture"
|
||||
Et une notification toast doit informer : "Mode voiture activé"
|
||||
Et les notifications in-app avec ETA doivent être activées
|
||||
Et les notifications push piéton doivent être désactivées
|
||||
|
||||
Scénario: Course à pied ou vélo lent ne déclenche PAS de basculement voiture
|
||||
Étant donné l'utilisateur est en mode piéton
|
||||
Et la vitesse monte à 8 km/h et oscille entre 6-10 km/h
|
||||
Quand le système évalue les conditions
|
||||
Alors le mode "piéton" doit être maintenu
|
||||
Car la vitesse reste <15 km/h (seuil de confiance pour voiture)
|
||||
Et l'utilisateur peut basculer manuellement si nécessaire
|
||||
|
||||
Scénario: Trajet en bus ou vélo rapide (15-25 km/h)
|
||||
Étant donné l'utilisateur est en mode piéton
|
||||
Et la vitesse passe à 20 km/h et reste stable
|
||||
Quand le système détecte une vitesse ≥15 km/h pendant 1 minute
|
||||
Alors une notification doit proposer : "Passer en mode véhicule ?"
|
||||
Et si l'utilisateur accepte, basculer en mode "voiture"
|
||||
Et si l'utilisateur refuse, mémoriser le choix pour 30 minutes
|
||||
|
||||
Scénario: Sortie de transport en commun
|
||||
Étant donné l'utilisateur est en mode piéton
|
||||
Et la vitesse était de 0 km/h (dans le bus)
|
||||
Et la vitesse monte soudainement à 40 km/h (bus démarre)
|
||||
Puis retombe à 2 km/h après 5 minutes (descente du bus)
|
||||
Quand le système détecte ce pattern
|
||||
Alors le mode "piéton" doit être maintenu
|
||||
Et aucun basculement automatique ne doit être déclenché
|
||||
Car les transports en commun sont ambigus
|
||||
|
||||
# ============================================================================
|
||||
# BASCULEMENT AVEC AUDIO-GUIDE EN COURS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Basculement voiture → piéton pendant audio-guide voiture
|
||||
Étant donné l'utilisateur écoute un audio-guide en mode voiture
|
||||
Et l'utilisateur se gare (vitesse = 0 km/h pendant 2 minutes)
|
||||
Quand le système bascule en mode piéton
|
||||
Alors l'audio-guide doit continuer en mode piéton
|
||||
Et les séquences restantes doivent s'adapter au mode piéton :
|
||||
| voiture | piéton |
|
||||
| Déclenchement automatique GPS | Navigation manuelle |
|
||||
| Distance affichée en mètres | Distance masquée |
|
||||
| Flèche direction | Pas de flèche |
|
||||
Et une notification doit informer : "Audio-guide adapté au mode piéton"
|
||||
|
||||
Scénario: Basculement piéton → voiture pendant audio-guide piéton
|
||||
Étant donné l'utilisateur écoute un audio-guide en mode piéton
|
||||
Et l'audio-guide est configuré pour "piéton uniquement"
|
||||
Et l'utilisateur monte en voiture (vitesse passe à 30 km/h)
|
||||
Quand le système bascule en mode voiture
|
||||
Alors l'audio-guide doit être mis en pause automatiquement
|
||||
Et une notification doit proposer : "Mettre l'audio-guide en pause ?"
|
||||
Et si confirmé, sauvegarder la progression pour reprise ultérieure
|
||||
|
||||
# ============================================================================
|
||||
# GESTION DES TRANSITIONS ET EDGE CASES
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Basculement rapide voiture → piéton → voiture (indécision)
|
||||
Étant donné l'utilisateur est en mode voiture
|
||||
Et la vitesse oscille : 40 km/h → 0 km/h (1 min) → 35 km/h → 0 km/h (1 min)
|
||||
Quand le système détecte une instabilité de mode
|
||||
Alors le mode "voiture" doit être maintenu par défaut
|
||||
Et un délai de stabilisation de 3 minutes doit être appliqué
|
||||
Et aucune notification de basculement ne doit être envoyée
|
||||
|
||||
Scénario: Tunnel ou perte GPS ne déclenche PAS de basculement
|
||||
Étant donné l'utilisateur est en mode voiture à 90 km/h
|
||||
Et le signal GPS est perdu pendant 2 minutes (tunnel)
|
||||
Quand le système détecte l'absence de signal GPS
|
||||
Alors le mode "voiture" doit être maintenu
|
||||
Et la dernière vitesse connue doit être utilisée
|
||||
Et aucun basculement ne doit être déclenché
|
||||
|
||||
Scénario: Utilisateur force le mode manuellement
|
||||
Étant donné l'utilisateur est en mode voiture automatique
|
||||
Et l'utilisateur bascule manuellement en mode piéton via l'interface
|
||||
Quand le basculement manuel est effectué
|
||||
Alors le mode manuel doit être prioritaire pendant 30 minutes
|
||||
Et les basculements automatiques doivent être désactivés pendant cette période
|
||||
Et un flag "manual_override" doit être loggé
|
||||
|
||||
Scénario: Reprise après override manuel
|
||||
Étant donné l'utilisateur a forcé le mode piéton il y a 35 minutes
|
||||
Et la vitesse actuelle est de 60 km/h depuis 5 minutes
|
||||
Quand la période d'override (30 min) expire
|
||||
Alors le système doit reprendre la détection automatique
|
||||
Et basculer en mode voiture car vitesse ≥5 km/h
|
||||
Et notifier l'utilisateur du basculement
|
||||
|
||||
# ============================================================================
|
||||
# IMPACT SUR LES AUTRES FONCTIONNALITÉS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Basculement annule le cooldown notification voiture
|
||||
Étant donné l'utilisateur est en mode voiture
|
||||
Et un cooldown de 10 minutes est actif (notification ignorée)
|
||||
Quand le mode bascule vers piéton
|
||||
Alors le cooldown doit être immédiatement annulé
|
||||
Et les notifications piéton doivent être activées
|
||||
Car les mécanismes de notification sont différents entre modes
|
||||
|
||||
Scénario: Basculement adapte le rayon de détection géolocalisée
|
||||
Étant donné l'utilisateur est en mode voiture
|
||||
Et le rayon de détection pour contenus géolocalisés est adaptatif (basé sur vitesse)
|
||||
Quand le mode bascule vers piéton
|
||||
Alors le rayon de détection doit être fixé à 200m
|
||||
Et les contenus hors rayon doivent être retirés de la file d'attente
|
||||
Et une nouvelle recherche géospatiale doit être effectuée
|
||||
|
||||
Scénario: Quota notifications indépendant du mode
|
||||
Étant donné l'utilisateur a reçu 4 notifications en mode voiture (quota 4/6)
|
||||
Quand le mode bascule vers piéton
|
||||
Alors le compteur de quota doit être conservé (toujours 4/6)
|
||||
Car le quota de 6/heure s'applique globalement (tous modes confondus)
|
||||
|
||||
# ============================================================================
|
||||
# MÉTRIQUES & ANALYTICS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Logging des basculements de mode pour analytics
|
||||
Étant donné l'utilisateur bascule de voiture à piéton
|
||||
Quand le basculement est effectué
|
||||
Alors un événement analytics doit être loggé :
|
||||
| event_type | mode_switch |
|
||||
| from_mode | car |
|
||||
| to_mode | pedestrian |
|
||||
| trigger | speed_threshold |
|
||||
| speed_kmh | 1.5 |
|
||||
| duration_previous_mode | 1800 |
|
||||
| manual_override | false |
|
||||
| timestamp | 2026-02-03 14:30:00 |
|
||||
Et ces métriques doivent alimenter le dashboard de monitoring
|
||||
|
||||
Scénario: Détection pattern utilisateur (majoritairement piéton vs voiture)
|
||||
Étant donné l'utilisateur utilise l'application depuis 30 jours
|
||||
Et 80% du temps d'écoute est en mode piéton
|
||||
Quand le système analyse le comportement
|
||||
Alors un flag "primary_mode: pedestrian" doit être défini
|
||||
Et le mode par défaut au démarrage doit être "piéton"
|
||||
Et l'algorithme de recommandation doit favoriser les audio-guides piétons
|
||||
56
features/api/navigation/decompte-5s-transition.feature
Normal file
56
features/api/navigation/decompte-5s-transition.feature
Normal file
@@ -0,0 +1,56 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @transitions @mvp
|
||||
Fonctionnalité: Décompte 5 secondes pour transitions séquences
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux un décompte avant le début d'une nouvelle séquence
|
||||
Afin de me préparer mentalement à l'écoute du nouveau contenu
|
||||
|
||||
Scénario: Décompte visuel et audio avant nouvelle séquence
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui termine une séquence
|
||||
Quand la suivante est sur le point de démarrer
|
||||
Alors un décompte de 5 secondes est affiché: "5... 4... 3... 2... 1..."
|
||||
Et un son subtil accompagne chaque seconde
|
||||
Et un événement "TRANSITION_COUNTDOWN_STARTED" est enregistré
|
||||
|
||||
Scénario: Possibilité de skip le décompte
|
||||
Étant donné un utilisateur "bob@roadwave.fr" pendant un décompte
|
||||
Quand il appuie sur "Passer"
|
||||
Alors la séquence suivante démarre immédiatement
|
||||
Et le décompte est interrompu
|
||||
Et un événement "TRANSITION_COUNTDOWN_SKIPPED" est enregistré
|
||||
|
||||
Scénario: Annulation du décompte si utilisateur s'éloigne
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" avec décompte en cours
|
||||
Quand il s'éloigne du point d'intérêt pendant le décompte
|
||||
Alors le décompte est annulé
|
||||
Et la séquence ne démarre pas
|
||||
Et un événement "TRANSITION_COUNTDOWN_CANCELLED" est enregistré
|
||||
|
||||
Scénario: Prévisualisation du prochain point pendant le décompte
|
||||
Étant donné un utilisateur "david@roadwave.fr" pendant un décompte
|
||||
Alors il voit une carte de prévisualisation:
|
||||
| Élément | Contenu |
|
||||
| Nom de la séquence| Panthéon |
|
||||
| Durée | 8 min 30s |
|
||||
| Distance | Vous y êtes |
|
||||
| Image | Photo du Panthéon |
|
||||
Et un événement "TRANSITION_PREVIEW_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Désactivation du décompte dans les paramètres
|
||||
Étant donné un utilisateur "eve@roadwave.fr"
|
||||
Quand elle désactive "Décompte de transition" dans les paramètres
|
||||
Alors les séquences démarrent immédiatement
|
||||
Sans décompte de 5 secondes
|
||||
Et un événement "TRANSITION_COUNTDOWN_DISABLED" est enregistré
|
||||
|
||||
Scénario: Métriques d'utilisation du décompte
|
||||
Étant donné que 10 000 transitions ont eu lieu
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| Taux de skip du décompte | 25% |
|
||||
| Taux de complétion du décompte| 70% |
|
||||
| Taux d'annulation | 5% |
|
||||
| Satisfaction utilisateur | 4.2/5 |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
163
features/api/navigation/eta-calculation.feature
Normal file
163
features/api/navigation/eta-calculation.feature
Normal file
@@ -0,0 +1,163 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @geolocation @mvp
|
||||
Fonctionnalité: Calcul ETA et notification contenus géolocalisés
|
||||
|
||||
En tant que système de recommandation
|
||||
Je veux calculer le temps d'arrivée estimé (ETA) pour les contenus géolocalisés
|
||||
Afin de déclencher la notification au bon moment (7 secondes avant)
|
||||
|
||||
Contexte:
|
||||
Étant donné un utilisateur authentifié en mode voiture
|
||||
Et la géolocalisation est activée et autorisée
|
||||
|
||||
# ============================================================================
|
||||
# CALCUL ETA VITESSE NORMALE (≥5 km/h)
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Calcul ETA avec vitesse constante 50 km/h
|
||||
Étant donné un contenu géolocalisé situé à 300m de l'utilisateur
|
||||
Et l'utilisateur se déplace à 50 km/h en direction du point
|
||||
Quand le système calcule l'ETA
|
||||
Alors l'ETA estimé doit être d'environ 21 secondes
|
||||
Et la notification doit être déclenchée dans 14 secondes (21s - 7s)
|
||||
|
||||
Scénario: Recalcul ETA en temps réel avec variation de vitesse
|
||||
Étant donné un contenu géolocalisé situé à 500m
|
||||
Et l'utilisateur se déplace initialement à 70 km/h
|
||||
Et l'ETA initial est de 25 secondes
|
||||
Quand l'utilisateur ralentit à 30 km/h
|
||||
Alors l'ETA doit être recalculé à 60 secondes
|
||||
Et le délai de notification doit être ajusté en conséquence
|
||||
|
||||
Scénario: Notification déclenchée exactement 7 secondes avant l'arrivée
|
||||
Étant donné un contenu géolocalisé situé à 150m
|
||||
Et l'utilisateur se déplace à 60 km/h
|
||||
Et l'ETA calculé est de 9 secondes
|
||||
Quand l'ETA atteint 7 secondes
|
||||
Alors une notification push doit être envoyée
|
||||
Et la notification doit contenir un compteur visuel de 7 à 1
|
||||
Et un son de notification doit être joué
|
||||
|
||||
Scénario: Pas de notification si l'utilisateur dévie de la trajectoire
|
||||
Étant donné un contenu géolocalisé situé à 200m au nord
|
||||
Et l'utilisateur se déplace à 50 km/h en direction du contenu
|
||||
Et l'ETA est de 14 secondes
|
||||
Quand l'utilisateur change de direction vers l'est
|
||||
Et la distance au contenu commence à augmenter
|
||||
Alors la notification ne doit pas être déclenchée
|
||||
Et l'ETA doit être invalidé
|
||||
|
||||
# ============================================================================
|
||||
# CAS VITESSE LENTE (<5 km/h)
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Notification immédiate si vitesse <5 km/h et distance <50m
|
||||
Étant donné un contenu géolocalisé situé à 30m
|
||||
Et l'utilisateur se déplace à 3 km/h (piéton ou embouteillage)
|
||||
Quand le système détecte la vitesse <5 km/h
|
||||
Alors la notification doit être déclenchée immédiatement
|
||||
Et le message doit indiquer "Contenu disponible à proximité"
|
||||
|
||||
Scénario: Pas de notification si vitesse <5 km/h mais distance >50m
|
||||
Étant donné un contenu géolocalisé situé à 80m
|
||||
Et l'utilisateur se déplace à 4 km/h
|
||||
Quand le système évalue les conditions de notification
|
||||
Alors aucune notification ne doit être envoyée
|
||||
Et le système doit attendre que la distance soit <50m ou vitesse ≥5 km/h
|
||||
|
||||
Scénario: Basculement vitesse normale → lente avec recalcul
|
||||
Étant donné un contenu géolocalisé situé à 100m
|
||||
Et l'utilisateur se déplace à 40 km/h (ETA = 9s, notification dans 2s)
|
||||
Quand l'utilisateur ralentit brutalement à 2 km/h (embouteillage)
|
||||
Et la vitesse reste <5 km/h pendant 5 secondes
|
||||
Et la distance est maintenant 85m
|
||||
Alors le mode de calcul ETA doit basculer en "vitesse lente"
|
||||
Et la notification immédiate ne doit pas être envoyée (distance >50m)
|
||||
|
||||
Scénario: Notification immédiate en approche lente continue
|
||||
Étant donné un contenu géolocalisé situé à 60m
|
||||
Et l'utilisateur se déplace à 3 km/h
|
||||
Quand l'utilisateur atteint 45m du point (distance <50m)
|
||||
Alors la notification doit être déclenchée immédiatement
|
||||
Et le compteur visuel doit afficher "À proximité"
|
||||
|
||||
# ============================================================================
|
||||
# GESTION TRAJECTOIRES COMPLEXES
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Route sinueuse avec distance GPS ≠ distance réelle
|
||||
Étant donné un contenu géolocalisé situé à 250m à vol d'oiseau
|
||||
Mais la route sinueuse fait 400m de trajet réel
|
||||
Et l'utilisateur se déplace à 50 km/h
|
||||
Quand le système calcule l'ETA
|
||||
Alors l'ETA doit utiliser la distance GPS (250m) par défaut
|
||||
Et l'ETA estimé doit être d'environ 18 secondes
|
||||
Et une marge d'erreur de ±3 secondes doit être tolérée
|
||||
|
||||
Scénario: Contenu sur autoroute parallèle non accessible
|
||||
Étant donné un contenu géolocalisé sur une autoroute parallèle à 100m
|
||||
Et l'utilisateur roule sur une route secondaire sans accès direct
|
||||
Et la distance GPS est de 100m mais l'accès réel est à 2 km
|
||||
Quand le système détecte que l'utilisateur s'éloigne après 10 secondes
|
||||
Alors la notification ne doit pas être déclenchée
|
||||
Et le contenu doit être retiré de la file d'attente
|
||||
|
||||
# ============================================================================
|
||||
# EDGE CASES & ERREURS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: GPS imprécis (précision >50m)
|
||||
Étant donné un contenu géolocalisé situé à 150m
|
||||
Et la précision GPS actuelle est de 65m
|
||||
Quand le système calcule l'ETA
|
||||
Alors l'ETA doit être calculé avec une marge d'erreur élevée
|
||||
Et la notification doit être différée de 2 secondes supplémentaires
|
||||
Et un flag "low_accuracy" doit être ajouté aux métriques
|
||||
|
||||
Scénario: Vitesse nulle (stationnement) avec contenu proche
|
||||
Étant donné un contenu géolocalisé situé à 25m
|
||||
Et l'utilisateur est à l'arrêt (vitesse = 0 km/h) depuis 10 secondes
|
||||
Quand le système évalue les conditions
|
||||
Alors aucune notification ne doit être envoyée automatiquement
|
||||
Et le contenu doit être affiché dans la file d'attente manuelle
|
||||
Et l'utilisateur peut le sélectionner manuellement
|
||||
|
||||
Scénario: Perte signal GPS pendant le calcul ETA
|
||||
Étant donné un contenu géolocalisé avec ETA de 12 secondes
|
||||
Et une notification prévue dans 5 secondes
|
||||
Quand le signal GPS est perdu (tunnel)
|
||||
Alors le calcul ETA doit être gelé à la dernière valeur connue
|
||||
Et la notification doit être déclenchée selon l'ETA gelé
|
||||
Et un fallback de 10 secondes max doit être appliqué
|
||||
|
||||
Scénario: Vitesse erratique (GPS instable)
|
||||
Étant donné un contenu géolocalisé situé à 200m
|
||||
Et les lectures GPS montrent : 50 km/h → 5 km/h → 60 km/h → 10 km/h en 10 secondes
|
||||
Quand le système détecte une instabilité GPS
|
||||
Alors l'ETA doit être calculé avec une moyenne mobile sur 5 secondes
|
||||
Et la notification ne doit être déclenchée qu'avec une confiance >70%
|
||||
|
||||
# ============================================================================
|
||||
# MÉTRIQUES & LOGS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Logging des calculs ETA pour analytics
|
||||
Étant donné un contenu géolocalisé avec notification déclenchée
|
||||
Quand la notification est envoyée
|
||||
Alors un événement analytics doit être loggé avec :
|
||||
| distance_meters | 180 |
|
||||
| speed_kmh | 55 |
|
||||
| eta_seconds | 11.7 |
|
||||
| notification_offset | 7 |
|
||||
| gps_accuracy_meters | 12 |
|
||||
| calculation_method | standard_eta |
|
||||
Et la timestamp de notification doit être enregistrée
|
||||
|
||||
Scénario: Comparaison ETA prédit vs ETA réel
|
||||
Étant donné un contenu géolocalisé avec ETA prédit de 15 secondes
|
||||
Et une notification déclenchée à 8 secondes avant
|
||||
Quand l'utilisateur atteint réellement le point
|
||||
Alors l'ETA réel doit être calculé et comparé
|
||||
Et l'écart doit être loggé pour amélioration de l'algorithme
|
||||
Et si l'écart >5 secondes, un flag "prediction_error" doit être levé
|
||||
58
features/api/navigation/historique-geo-contenu.feature
Normal file
58
features/api/navigation/historique-geo-contenu.feature
Normal file
@@ -0,0 +1,58 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @history @mvp
|
||||
Fonctionnalité: Historique géolocalisé des contenus écoutés
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux consulter l'historique de mes écoutes avec localisation
|
||||
Afin de me souvenir de mes découvertes et parcours
|
||||
|
||||
Scénario: Enregistrement automatique de l'historique
|
||||
Étant donné un utilisateur "alice@roadwave.fr" qui écoute un contenu
|
||||
Quand l'écoute est terminée
|
||||
Alors l'historique enregistre:
|
||||
| Donnée | Exemple |
|
||||
| Contenu | Audio-guide Quartier Latin |
|
||||
| Date/heure | 2026-02-03 14:30 |
|
||||
| Position GPS | 48.8534, 2.3488 |
|
||||
| Durée d'écoute | 42 min |
|
||||
Et un événement "HISTORY_ENTRY_CREATED" est enregistré
|
||||
|
||||
Scénario: Visualisation de l'historique sur une carte
|
||||
Étant donné un utilisateur "bob@roadwave.fr"
|
||||
Quand il accède à "Mon historique"
|
||||
Alors une carte affiche tous les points écoutés
|
||||
Et chaque marqueur est cliquable pour voir les détails
|
||||
Et un événement "HISTORY_MAP_VIEWED" est enregistré
|
||||
|
||||
Scénario: Filtrage de l'historique par période
|
||||
Étant donné un utilisateur "charlie@roadwave.fr"
|
||||
Quand il filtre par "Ce mois-ci"
|
||||
Alors seuls les contenus du mois courant sont affichés
|
||||
Et un compteur indique: "23 contenus écoutés ce mois"
|
||||
Et un événement "HISTORY_FILTERED" est enregistré
|
||||
|
||||
Scénario: Export de l'historique pour souvenirs
|
||||
Étant donné un utilisateur "david@roadwave.fr"
|
||||
Quand il exporte son historique
|
||||
Alors il reçoit un fichier GPX avec tous ses parcours
|
||||
Et peut l'importer dans d'autres applications
|
||||
Et un événement "HISTORY_EXPORTED" est enregistré
|
||||
|
||||
Scénario: Suppression d'entrées d'historique
|
||||
Étant donné un utilisateur "eve@roadwave.fr"
|
||||
Quand elle supprime une entrée
|
||||
Alors elle est retirée de l'historique
|
||||
Et ne compte plus dans les statistiques
|
||||
Et un événement "HISTORY_ENTRY_DELETED" est enregistré
|
||||
|
||||
Scénario: Statistiques annuelles basées sur l'historique
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en fin d'année
|
||||
Alors il voit son "Rétrospective RoadWave 2026":
|
||||
| Métrique | Valeur |
|
||||
| Contenus écoutés | 142 |
|
||||
| Distance parcourue | 523 km |
|
||||
| Villes visitées | 18 |
|
||||
| Pays visités | 3 |
|
||||
| Top catégorie | Tourisme |
|
||||
Et un événement "YEARLY_RETROSPECTIVE_VIEWED" est enregistré
|
||||
52
features/api/navigation/mode-stationnement.feature
Normal file
52
features/api/navigation/mode-stationnement.feature
Normal file
@@ -0,0 +1,52 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @parking @mvp
|
||||
Fonctionnalité: Mode stationnement et pause automatique
|
||||
|
||||
En tant qu'utilisateur conducteur
|
||||
Je veux que l'application détecte quand je me gare
|
||||
Afin d'adapter l'expérience et proposer la suite à pied
|
||||
|
||||
Scénario: Détection automatique du stationnement
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode voiture
|
||||
Quand la vitesse passe à 0 km/h pendant plus de 2 minutes
|
||||
Et le Bluetooth CarPlay se déconnecte
|
||||
Alors le mode "Stationnement" est activé
|
||||
Et un événement "PARKING_MODE_DETECTED" est enregistré
|
||||
|
||||
Scénario: Proposition de basculement en mode piéton
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en mode stationnement
|
||||
Quand il sort de la voiture (détecté par capteurs)
|
||||
Alors une notification propose: "Continuer à pied ?"
|
||||
Et deux options: [Mode piéton] [Rester en voiture]
|
||||
Et un événement "PEDESTRIAN_MODE_SUGGESTED" est enregistré
|
||||
|
||||
Scénario: Mémorisation de la position de stationnement
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" qui se gare
|
||||
Quand le mode stationnement est activé
|
||||
Alors la position GPS est sauvegardée
|
||||
Et un marqueur "Votre voiture" est placé sur la carte
|
||||
Et un événement "PARKING_LOCATION_SAVED" est enregistré
|
||||
|
||||
Scénario: Navigation retour vers la voiture
|
||||
Étant donné un utilisateur "david@roadwave.fr" qui a fini sa visite à pied
|
||||
Quand il clique sur "Retour à ma voiture"
|
||||
Alors un itinéraire piéton est calculé
|
||||
Et la distance est affichée: "650m - 8 min"
|
||||
Et un événement "NAVIGATION_TO_PARKING_STARTED" est enregistré
|
||||
|
||||
Scénario: Alerte d'expiration du stationnement payant
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en stationnement
|
||||
Et elle a configuré une durée de stationnement: 2 heures
|
||||
Quand il reste 10 minutes
|
||||
Alors une notification push est envoyée: "Stationnement expire dans 10 min"
|
||||
Et un événement "PARKING_EXPIRY_WARNING" est enregistré
|
||||
|
||||
Scénario: Statistiques de stationnement
|
||||
Étant donné un utilisateur "frank@roadwave.fr"
|
||||
Alors il peut voir dans ses stats:
|
||||
| Métrique | Valeur |
|
||||
| Nombre de stationnements | 45 |
|
||||
| Durée moyenne | 1h 30min |
|
||||
| Distance voiture-POI moyen | 320m |
|
||||
Et un événement "PARKING_STATS_VIEWED" est enregistré
|
||||
@@ -0,0 +1,76 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @car-mode @ui @mvp
|
||||
Fonctionnalité: Notifications minimalistes en mode voiture
|
||||
|
||||
En tant qu'utilisateur conducteur
|
||||
Je veux des notifications visuelles minimales et audio prioritaires
|
||||
Afin de rester concentré sur la route en toute sécurité
|
||||
|
||||
Scénario: Affichage minimal des notifications visuelles
|
||||
Étant donné un utilisateur "alice@roadwave.fr" en mode voiture
|
||||
Quand une notification est déclenchée
|
||||
Alors elle s'affiche pendant 3 secondes maximum
|
||||
Et occupe < 20% de l'écran
|
||||
Et disparaît automatiquement
|
||||
Et un événement "CAR_NOTIFICATION_MINIMAL_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Notifications audio prioritaires sur visuel
|
||||
Étant donné un utilisateur "bob@roadwave.fr" en mode voiture
|
||||
Quand un point d'intérêt approche
|
||||
Alors une notification audio est jouée
|
||||
Et la notification visuelle est optionnelle
|
||||
Et l'audio contient toutes les informations nécessaires
|
||||
Et un événement "CAR_AUDIO_NOTIFICATION_PRIORITY" est enregistré
|
||||
|
||||
Scénario: Pas de popups ou modales en mode voiture
|
||||
Étant donné un utilisateur "charlie@roadwave.fr" en mode voiture
|
||||
Quand une action nécessite une confirmation
|
||||
Alors aucune modale bloquante n'apparaît
|
||||
Et la confirmation est reportée ou faite par commande vocale
|
||||
Et un événement "CAR_MODAL_PREVENTED" est enregistré
|
||||
|
||||
Scénario: Gros boutons tactiles espacés pour conduite
|
||||
Étant donné un utilisateur "david@roadwave.fr" en mode voiture
|
||||
Alors tous les boutons ont une taille minimale de 60x60 pixels
|
||||
Et un espacement minimal de 20 pixels entre boutons
|
||||
Et sont facilement accessibles d'une main
|
||||
Et un événement "CAR_UI_TOUCH_OPTIMIZED" est enregistré
|
||||
|
||||
Scénario: Mode nuit automatique pour réduire éblouissement
|
||||
Étant donné un utilisateur "eve@roadwave.fr" en mode voiture la nuit
|
||||
Quand le capteur de luminosité détecte l'obscurité
|
||||
Alors l'interface passe en mode nuit (fond noir)
|
||||
Et la luminosité est réduite de 50%
|
||||
Et un événement "CAR_NIGHT_MODE_AUTO" est enregistré
|
||||
|
||||
Scénario: Notifications groupées pour éviter la surcharge
|
||||
Étant donné un utilisateur "frank@roadwave.fr" en mode voiture
|
||||
Quand plusieurs événements se produisent en 30 secondes
|
||||
Alors une seule notification résume les événements
|
||||
Et les détails sont accessibles après l'arrêt
|
||||
Et un événement "CAR_NOTIFICATIONS_GROUPED" est enregistré
|
||||
|
||||
Scénario: Intégration CarPlay avec notifications système
|
||||
Étant donné un utilisateur "grace@roadwave.fr" avec CarPlay
|
||||
Quand une notification RoadWave arrive
|
||||
Alors elle utilise le système de notification CarPlay natif
|
||||
Et respecte les guidelines Apple pour sécurité
|
||||
Et un événement "CARPLAY_NOTIFICATION_NATIVE" est enregistré
|
||||
|
||||
Scénario: Commandes vocales pour interactions sans les mains
|
||||
Étant donné un utilisateur "henry@roadwave.fr" en mode voiture
|
||||
Quand il dit "Dis Siri, mets en pause"
|
||||
Alors l'audio-guide se met en pause sans interaction tactile
|
||||
Et aucune confirmation visuelle n'est requise
|
||||
Et un événement "CAR_VOICE_COMMAND_EXECUTED" est enregistré
|
||||
|
||||
Scénario: Métriques de sécurité des notifications
|
||||
Étant donné que 50 000 notifications ont été affichées en mode voiture
|
||||
Alors les indicateurs suivants sont respectés:
|
||||
| Métrique | Valeur cible |
|
||||
| Temps d'affichage moyen | < 3s |
|
||||
| Taux d'utilisation audio vs visuel| 80% audio |
|
||||
| Taille moyenne des notifications | < 20% écran |
|
||||
| Taux d'accidents rapportés | 0 |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
226
features/api/navigation/quota-cooldown.feature
Normal file
226
features/api/navigation/quota-cooldown.feature
Normal file
@@ -0,0 +1,226 @@
|
||||
# language: fr
|
||||
|
||||
@api @navigation @anti-spam @mvp
|
||||
Fonctionnalité: Quota et cooldown pour contenus géolocalisés
|
||||
|
||||
En tant que système de navigation
|
||||
Je veux limiter les notifications géolocalisées à 6 par heure
|
||||
Et appliquer un cooldown de 10 minutes après refus
|
||||
Afin d'éviter le spam et préserver l'expérience utilisateur
|
||||
|
||||
Contexte:
|
||||
Étant donné un utilisateur authentifié en mode voiture
|
||||
Et la géolocalisation est activée
|
||||
|
||||
# ============================================================================
|
||||
# QUOTA 6 NOTIFICATIONS / HEURE (fenêtre glissante)
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Première notification de l'heure sans quota atteint
|
||||
Étant donné l'utilisateur n'a reçu aucune notification géolocalisée dans les 60 dernières minutes
|
||||
Et un contenu géolocalisé déclenche une notification (ETA = 7s)
|
||||
Quand la notification est envoyée
|
||||
Alors le compteur de quota doit être incrémenté à 1/6
|
||||
Et un timestamp doit être enregistré pour cette notification
|
||||
Et la notification doit être affichée normalement
|
||||
|
||||
Scénario: Notifications multiples sous le quota
|
||||
Étant donné l'utilisateur a reçu 3 notifications dans les 60 dernières minutes :
|
||||
| timestamp | contenu_id |
|
||||
| 2026-02-03 14:10:00 | content-1 |
|
||||
| 2026-02-03 14:25:00 | content-2 |
|
||||
| 2026-02-03 14:40:00 | content-3 |
|
||||
Et il est maintenant 14:50:00
|
||||
Et un nouveau contenu géolocalisé déclenche une notification
|
||||
Quand la notification est évaluée
|
||||
Alors le compteur doit afficher 4/6
|
||||
Et la notification doit être envoyée normalement
|
||||
|
||||
Scénario: 6ème notification - dernière autorisée
|
||||
Étant donné l'utilisateur a reçu 5 notifications dans l'heure
|
||||
Et un nouveau contenu géolocalisé déclenche une notification
|
||||
Quand la notification est envoyée
|
||||
Alors le compteur doit afficher 6/6
|
||||
Et la notification doit être affichée normalement
|
||||
Et un flag "quota_limit_reached" doit être ajouté aux métriques
|
||||
|
||||
Scénario: 7ème notification - quota dépassé
|
||||
Étant donné l'utilisateur a reçu 6 notifications dans les 60 dernières minutes
|
||||
Et un nouveau contenu géolocalisé déclenche une notification
|
||||
Quand le système évalue le quota
|
||||
Alors la notification ne doit PAS être envoyée
|
||||
Et le contenu doit être ajouté silencieusement à la file d'attente
|
||||
Et un événement "notification_blocked_quota" doit être loggé
|
||||
Et l'utilisateur ne doit voir aucun indicateur visuel de blocage
|
||||
|
||||
Scénario: Fenêtre glissante - libération progressive du quota
|
||||
Étant donné l'utilisateur a reçu 6 notifications :
|
||||
| timestamp | contenu_id |
|
||||
| 2026-02-03 13:00:00 | content-1 |
|
||||
| 2026-02-03 13:15:00 | content-2 |
|
||||
| 2026-02-03 13:30:00 | content-3 |
|
||||
| 2026-02-03 13:45:00 | content-4 |
|
||||
| 2026-02-03 14:00:00 | content-5 |
|
||||
| 2026-02-03 14:10:00 | content-6 |
|
||||
Et il est maintenant 14:05:00 (la 1ère notification a >60 min)
|
||||
Et un nouveau contenu déclenche une notification
|
||||
Quand le système calcule le quota sur les 60 dernières minutes
|
||||
Alors seules 5 notifications doivent être comptées (13:15 à 14:10)
|
||||
Et le compteur doit afficher 6/6 (5 + nouvelle = 6)
|
||||
Et la notification doit être envoyée
|
||||
|
||||
Scénario: Reset complet après 60 minutes sans notification
|
||||
Étant donné l'utilisateur a reçu 6 notifications entre 12:00 et 12:50
|
||||
Et il est maintenant 13:55 (>60 min après la dernière)
|
||||
Quand un nouveau contenu déclenche une notification
|
||||
Alors le compteur doit être reset à 1/6
|
||||
Et la notification doit être envoyée normalement
|
||||
|
||||
# ============================================================================
|
||||
# EXCEPTION AUDIO-GUIDES (1 quota = toutes les séquences)
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Audio-guide multi-séquences compte pour 1 seul quota
|
||||
Étant donné l'utilisateur a reçu 5 notifications normales dans l'heure
|
||||
Et l'utilisateur démarre un audio-guide avec 8 séquences géolocalisées
|
||||
Quand la 1ère séquence de l'audio-guide déclenche une notification
|
||||
Alors le quota doit être incrémenté à 6/6
|
||||
Quand les 7 séquences suivantes déclenchent des notifications
|
||||
Alors le quota doit rester à 6/6
|
||||
Et toutes les notifications d'audio-guide doivent être envoyées
|
||||
Et un flag "audio_guide_exception" doit être loggé
|
||||
|
||||
Scénario: Audio-guide suivi de contenus normaux bloqués
|
||||
Étant donné l'utilisateur a reçu 5 notifications normales
|
||||
Et l'utilisateur a terminé un audio-guide de 6 séquences (compte pour 1 quota)
|
||||
Et le quota est maintenant 6/6
|
||||
Quand un contenu normal déclenche une notification
|
||||
Alors la notification doit être bloquée (quota dépassé)
|
||||
Et le contenu doit être ajouté à la file d'attente
|
||||
|
||||
Scénario: Plusieurs audio-guides dans l'heure
|
||||
Étant donné l'utilisateur a démarré 3 audio-guides dans l'heure :
|
||||
| timestamp | audio_guide_id | sequences |
|
||||
| 2026-02-03 13:00:00 | guide-1 | 5 |
|
||||
| 2026-02-03 13:30:00 | guide-2 | 8 |
|
||||
| 2026-02-03 14:00:00 | guide-3 | 4 |
|
||||
Quand le système calcule le quota
|
||||
Alors chaque audio-guide doit compter pour 1 quota
|
||||
Et le compteur doit afficher 3/6
|
||||
Et 3 contenus normaux supplémentaires peuvent être notifiés
|
||||
|
||||
# ============================================================================
|
||||
# COOLDOWN 10 MINUTES APRÈS REFUS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Notification ignorée déclenche cooldown de 10 minutes
|
||||
Étant donné une notification géolocalisée est affichée à 14:00:00
|
||||
Et le compteur de 7 secondes se termine sans action utilisateur
|
||||
Quand le délai de 7 secondes expire
|
||||
Alors un cooldown de 10 minutes doit être activé
|
||||
Et un timestamp "cooldown_until: 14:10:00" doit être enregistré
|
||||
Et la notification doit disparaître
|
||||
|
||||
Scénario: Notifications bloquées pendant le cooldown
|
||||
Étant donné un cooldown est actif jusqu'à 14:10:00
|
||||
Et il est maintenant 14:05:00
|
||||
Et 3 contenus géolocalisés déclenchent des notifications
|
||||
Quand le système évalue les conditions
|
||||
Alors aucune notification ne doit être affichée
|
||||
Et les 3 contenus doivent être ajoutés silencieusement à la file d'attente
|
||||
Et un événement "notification_blocked_cooldown" doit être loggé pour chacun
|
||||
|
||||
Scénario: Fin du cooldown - reprise normale
|
||||
Étant donné un cooldown actif jusqu'à 14:10:00
|
||||
Et il est maintenant 14:10:05 (cooldown expiré)
|
||||
Et un contenu géolocalisé déclenche une notification
|
||||
Quand le système évalue les conditions
|
||||
Alors le cooldown doit être considéré comme expiré
|
||||
Et la notification doit être envoyée normalement
|
||||
Et le flag "post_cooldown" doit être ajouté aux métriques
|
||||
|
||||
Scénario: Validation notification pendant le countdown annule le cooldown
|
||||
Étant donné une notification affichée avec compteur à 4 secondes restantes
|
||||
Quand l'utilisateur appuie sur "Écouter maintenant"
|
||||
Alors le contenu doit démarrer
|
||||
Et aucun cooldown ne doit être appliqué
|
||||
Et la prochaine notification peut être envoyée normalement (sous réserve du quota)
|
||||
|
||||
Scénario: Cooldown + Quota simultanés
|
||||
Étant donné l'utilisateur a reçu 6 notifications dans l'heure (quota atteint)
|
||||
Et la dernière notification a été ignorée (cooldown actif pour 10 min)
|
||||
Et il est maintenant 5 minutes plus tard
|
||||
Quand un nouveau contenu déclenche une notification
|
||||
Alors la notification doit être bloquée pour les 2 raisons :
|
||||
| raison | statut |
|
||||
| quota_exceeded | true |
|
||||
| cooldown_active | true |
|
||||
Et le contenu doit être ajouté à la file d'attente
|
||||
Et les deux raisons doivent être loggées
|
||||
|
||||
# ============================================================================
|
||||
# CAS LIMITES & EDGE CASES
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Cooldown ne s'applique pas en mode piéton
|
||||
Étant donné l'utilisateur est en mode piéton
|
||||
Et une notification push géolocalisée est ignorée
|
||||
Quand la notification expire
|
||||
Alors aucun cooldown ne doit être appliqué
|
||||
Car en mode piéton les notifications sont opt-in et moins intrusives
|
||||
|
||||
Scénario: Changement de mode pendant cooldown (voiture → piéton)
|
||||
Étant donné un cooldown actif en mode voiture jusqu'à 14:20:00
|
||||
Et il est maintenant 14:12:00 (cooldown encore actif)
|
||||
Quand l'utilisateur bascule en mode piéton
|
||||
Alors le cooldown doit être immédiatement annulé
|
||||
Et les notifications piéton doivent être activées normalement
|
||||
|
||||
Scénario: Déconnexion/reconnexion pendant cooldown
|
||||
Étant donné un cooldown actif jusqu'à 15:30:00
|
||||
Quand l'utilisateur se déconnecte puis se reconnecte à 15:20:00
|
||||
Alors le cooldown doit être persisté (Redis ou DB)
|
||||
Et le cooldown doit toujours être actif jusqu'à 15:30:00
|
||||
Et les notifications doivent rester bloquées
|
||||
|
||||
Scénario: Quota reset à minuit vs fenêtre glissante
|
||||
Étant donné le système utilise une fenêtre glissante de 60 minutes
|
||||
Et l'utilisateur a reçu 6 notifications entre 23:30 et 23:55
|
||||
Quand minuit passe et il est 00:05
|
||||
Alors le quota doit toujours être calculé sur les 60 dernières minutes
|
||||
Et les 6 notifications doivent encore être comptées
|
||||
Et aucune notification supplémentaire ne peut être envoyée avant 00:30
|
||||
|
||||
# ============================================================================
|
||||
# MÉTRIQUES & ANALYTICS
|
||||
# ============================================================================
|
||||
|
||||
Scénario: Logging des blocages quota pour optimisation
|
||||
Étant donné le quota est atteint (6/6)
|
||||
Et 5 contenus tentent de déclencher une notification dans l'heure suivante
|
||||
Quand ces notifications sont bloquées
|
||||
Alors un événement analytics doit être loggé pour chacune :
|
||||
| event_type | notification_blocked_quota |
|
||||
| content_id | content-xyz |
|
||||
| user_quota_current | 6 |
|
||||
| user_quota_max | 6 |
|
||||
| timestamp_blocked | 2026-02-03 14:30:00 |
|
||||
| added_to_queue | true |
|
||||
Et ces métriques doivent alimenter le dashboard de monitoring
|
||||
|
||||
Scénario: Métriques de cooldown par utilisateur
|
||||
Étant donné un utilisateur ignore 3 notifications dans la journée
|
||||
Quand le système analyse le comportement
|
||||
Alors les métriques suivantes doivent être calculées :
|
||||
| cooldowns_triggered_today | 3 |
|
||||
| avg_cooldown_per_user | 2.1 |
|
||||
| ignore_rate | 50% |
|
||||
Et ces données doivent être utilisées pour ajuster l'algorithme de recommandation
|
||||
|
||||
Scénario: A/B testing - quota 6 vs 8 vs 10 par heure
|
||||
Étant donné l'utilisateur est dans le groupe de test "quota_8"
|
||||
Et le système teste différentes valeurs de quota
|
||||
Quand le système évalue les notifications
|
||||
Alors le quota max doit être de 8 au lieu de 6
|
||||
Et le groupe de test doit être loggé dans les événements
|
||||
Et les métriques d'engagement doivent être comparées entre groupes
|
||||
Reference in New Issue
Block a user