test(gherkin): ajouter tests BDD pour toutes clarifications règles métier
Ajoute/modifie tests Gherkin pour couvrir les 7 sections clarifiées : 1. Algorithme recommandation (scoring intérêts nuls) : - Ajout scénarios scoring-recommandation.feature - Cas contenu géo-ancré proche avec intérêts nuls = recommandable - Comparaison scores géo vs intérêts 2. Audio-guides mode voiture (système double clic) : - Nouveau fichier systeme-double-clic-sortie.feature - Premier clic : passage mode manuel + séquence suivante - Deuxième clic <10s : sortie audio-guide - Détection hors itinéraire + reprise 3. Monétisation créateurs (soldes dormants + DAS2) : - Nouveau fichier soldes-dormants-inactifs.feature - Conservation indéfinie si actif - Emails 12/18 mois + versement forcé 18 mois + 30j - Exception soldes <10€ avec proposition don - Modification obligations-fiscales.feature - DAS2 systématique tous montants (même <1200€) 4. Skip et abonnement (neutralisation pénalités) : - Nouveau fichier skip-abonnes-neutralisation.feature - Skip <10s non-abonné : -0.5% - Skip <10s abonné : 0% (neutre) - Métriques engagement : abonnés ne pénalisent pas - Anti-raid naturel (sources non pertinentes) 5. Premium multi-devices (KISS) : - Nouveau fichier multi-devices-dernier-priorite.feature - Règle simple : dernier device prend toujours priorité - Offline connecté vs déconnecté - Détection abus post-MVP (pas automatique) 6. Mode offline (contenus supprimés) : - Nouveau fichier contenus-supprimes-pendant-offline.feature - Suppression immédiate à reconnexion - Modal si contenu en cours d'écoute - Popup récapitulative si 2+ contenus supprimés 7. Publicités (ciblage horaire + fuseaux horaires) : - Nouveau fichier ciblage-horaire-fuseaux-horaires.feature - Ciblage horaire = heure locale utilisateur - France entière = Métropole + DOM - Détection fuseau GPS/device/IP - Cas d'usage restaurant Guadeloupe, assureur national Couverture complète de toutes les règles métier clarifiées.
This commit is contained in:
192
features/ui/audio-guides/systeme-double-clic-sortie.feature
Normal file
192
features/ui/audio-guides/systeme-double-clic-sortie.feature
Normal file
@@ -0,0 +1,192 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Système double clic et sortie audio-guide mode voiture
|
||||
En tant qu'utilisateur en voiture
|
||||
Je veux pouvoir désactiver le GPS automatique et sortir de l'audio-guide facilement
|
||||
Afin de gérer les situations d'embouteillage ou de changement de plan
|
||||
|
||||
Contexte:
|
||||
Étant donné qu'un utilisateur est en mode voiture
|
||||
Et qu'un audio-guide de 8 séquences est actif
|
||||
Et que le mode GPS automatique est activé par défaut
|
||||
Et que la séquence 2 est en cours de lecture
|
||||
|
||||
# Comportement bouton [▶|] Suivant
|
||||
|
||||
Scénario: Premier clic Suivant - Passage en mode manuel
|
||||
Étant donné que le mode GPS auto est actif
|
||||
Et que la séquence 2 vient de se terminer
|
||||
Et que le prochain point GPS (séquence 3) est à 2 km
|
||||
Quand l'utilisateur clique sur le bouton [▶|] Suivant
|
||||
Alors le GPS automatique est désactivé
|
||||
Et le mode bascule en "mode manuel"
|
||||
Et la séquence 3 démarre immédiatement
|
||||
Et un toast s'affiche pendant 3 secondes:
|
||||
"""
|
||||
Mode manuel activé. Cliquez à nouveau pour quitter l'audio-guide.
|
||||
"""
|
||||
Et un timer de 10 secondes démarre en arrière-plan
|
||||
|
||||
Scénario: Deuxième clic Suivant dans les 10 secondes - Sortie audio-guide
|
||||
Étant donné que le mode manuel vient d'être activé il y a 5 secondes
|
||||
Et que la séquence 3 est en cours de lecture
|
||||
Quand l'utilisateur clique à nouveau sur [▶|] Suivant
|
||||
Alors l'audio-guide est mis en pause
|
||||
Et l'historique de progression est conservé (séquence 3 à X:XX)
|
||||
Et l'application retourne au flux normal de recommandation
|
||||
Et un toast s'affiche pendant 2 secondes: "Audio-guide en pause"
|
||||
|
||||
Scénario: Clic Suivant après 10 secondes - Navigation normale
|
||||
Étant donné que le mode manuel est actif depuis 12 secondes
|
||||
Et que la séquence 3 est en cours
|
||||
Quand l'utilisateur clique sur [▶|] Suivant
|
||||
Alors la séquence 4 démarre immédiatement
|
||||
Et le timer de 10 secondes redémarre
|
||||
Et le mode reste en "mode manuel"
|
||||
Et aucune sortie d'audio-guide ne se produit
|
||||
|
||||
Scénario: Clics multiples Suivant en mode manuel
|
||||
Étant donné que le mode manuel est actif
|
||||
Et que l'utilisateur clique sur [▶|] pour passer séquence 3 → 4
|
||||
Et que 5 secondes se passent
|
||||
Quand l'utilisateur clique à nouveau sur [▶|] pour passer séquence 4 → 5
|
||||
Alors la séquence 5 démarre
|
||||
Et le timer de 10 secondes redémarre à chaque clic
|
||||
Et l'utilisateur peut naviguer normalement entre les séquences
|
||||
|
||||
Scénario: Double clic rapide accidentel - sortie immédiate
|
||||
Étant donné que le mode GPS auto est actif
|
||||
Et que la séquence 2 vient de se terminer
|
||||
Quand l'utilisateur clique sur [▶|] (clic 1)
|
||||
Et que l'utilisateur clique immédiatement sur [▶|] (clic 2 à <2s)
|
||||
Alors l'audio-guide est mis en pause après le clic 2
|
||||
Et l'utilisateur retourne au flux normal
|
||||
Et un toast confirme: "Audio-guide en pause"
|
||||
|
||||
# Comportement bouton [|◀] Précédent
|
||||
|
||||
Scénario: Bouton Précédent dans audio-guide GPS auto
|
||||
Étant donné que le mode GPS auto est actif
|
||||
Et que la séquence 3 est en cours
|
||||
Quand l'utilisateur clique sur [|◀] Précédent
|
||||
Alors la séquence 2 démarre
|
||||
Et l'audio-guide reste actif
|
||||
Et le mode GPS auto reste actif
|
||||
|
||||
Scénario: Bouton Précédent dans audio-guide mode manuel
|
||||
Étant donné que le mode manuel est actif
|
||||
Et que la séquence 5 est en cours
|
||||
Quand l'utilisateur clique sur [|◀] Précédent
|
||||
Alors la séquence 4 démarre
|
||||
Et l'audio-guide reste actif
|
||||
Et le mode manuel reste actif
|
||||
|
||||
Scénario: Bouton Précédent hors audio-guide - Reprend audio-guide si contenu précédent
|
||||
Étant donné que l'utilisateur a quitté l'audio-guide "Safari du Paugre"
|
||||
Et que l'utilisateur écoute un contenu normal "Podcast A"
|
||||
Quand l'utilisateur clique sur [|◀] Précédent
|
||||
Alors l'audio-guide "Safari du Paugre" reprend
|
||||
Et la dernière séquence écoutée (séquence 3) reprend
|
||||
|
||||
# Détection et reprise après détour
|
||||
|
||||
Scénario: Détection hors itinéraire >1 km pendant >10 min
|
||||
Étant donné que l'audio-guide est actif (mode GPS auto ou manuel)
|
||||
Et que l'utilisateur s'éloigne à 1.2 km de tous les points GPS
|
||||
Et que cette situation dure 11 minutes
|
||||
Quand le système détecte le hors itinéraire
|
||||
Alors un toast s'affiche: "Audio-guide en pause (hors itinéraire)"
|
||||
Et l'icône de l'audio-guide passe en gris (inactif)
|
||||
Et la lecture continue du contenu en cours s'arrête
|
||||
|
||||
Scénario: Retour sur itinéraire <100m d'un point non écouté
|
||||
Étant donné que l'audio-guide est en pause (hors itinéraire)
|
||||
Et que l'utilisateur revient à 80m du point GPS séquence 5 (non écoutée)
|
||||
Quand le système détecte le retour sur itinéraire
|
||||
Alors une popup s'affiche:
|
||||
"""
|
||||
Reprendre l'audio-guide à la séquence 5 ?
|
||||
[Reprendre] [Voir liste] [Ignorer]
|
||||
"""
|
||||
|
||||
Scénario: Action "Reprendre" après retour sur itinéraire
|
||||
Étant donné que la popup de reprise est affichée
|
||||
Quand l'utilisateur clique sur [Reprendre]
|
||||
Alors la séquence 5 démarre immédiatement
|
||||
Et l'audio-guide redevient actif
|
||||
Et l'icône repasse en couleur normale
|
||||
|
||||
Scénario: Action "Voir liste" après retour sur itinéraire
|
||||
Étant donné que la popup de reprise est affichée
|
||||
Quand l'utilisateur clique sur [Voir liste]
|
||||
Alors la liste complète des séquences s'affiche
|
||||
Et l'utilisateur peut choisir manuellement quelle séquence écouter
|
||||
|
||||
Scénario: Action "Ignorer" après retour sur itinéraire
|
||||
Étant donné que la popup de reprise est affichée
|
||||
Quand l'utilisateur clique sur [Ignorer]
|
||||
Alors la popup se ferme
|
||||
Et l'audio-guide reste en pause
|
||||
Et l'utilisateur continue le flux normal de recommandation
|
||||
|
||||
# Respect des clics manuels
|
||||
|
||||
Scénario: Séquence skippée manuellement non reproposée automatiquement
|
||||
Étant donné que l'utilisateur est en mode manuel
|
||||
Et que l'utilisateur clique [▶|] pour passer de séquence 3 à séquence 4
|
||||
Et que la séquence 3 est marquée "skippée volontairement"
|
||||
Quand l'utilisateur revient à 50m du point GPS séquence 3
|
||||
Alors aucune popup de reprise automatique ne s'affiche
|
||||
Et l'utilisateur peut revenir manuellement via liste séquences s'il le souhaite
|
||||
|
||||
Scénario: Séquence skippée par GPS (point manqué) reproposable
|
||||
Étant donné que l'utilisateur a dépassé un point GPS à 110m (rayon 30m)
|
||||
Et que la séquence 3 a été marquée "point manqué" (pas de skip manuel)
|
||||
Quand l'utilisateur revient à 80m du point GPS séquence 3
|
||||
Alors une popup de reprise s'affiche:
|
||||
"""
|
||||
Reprendre la séquence 3 ?
|
||||
[Reprendre] [Voir liste] [Ignorer]
|
||||
"""
|
||||
|
||||
# Mode manuel persistant
|
||||
|
||||
Scénario: Mode manuel persiste jusqu'à fin audio-guide
|
||||
Étant donné que le mode manuel est activé en séquence 3
|
||||
Quand l'utilisateur navigue jusqu'à la séquence 8 (dernière)
|
||||
Alors le mode manuel reste actif durant toutes les séquences
|
||||
Et le GPS automatique n'est jamais réactivé
|
||||
|
||||
Scénario: Reset mode GPS auto au redémarrage audio-guide
|
||||
Étant donné que l'utilisateur a quitté l'audio-guide en mode manuel
|
||||
Et que plusieurs heures se sont écoulées
|
||||
Quand l'utilisateur relance l'audio-guide "Safari du Paugre"
|
||||
Alors le mode GPS automatique est réactivé par défaut
|
||||
Et l'utilisateur peut à nouveau passer en mode manuel s'il le souhaite
|
||||
|
||||
# Cas d'usage réel : embouteillage
|
||||
|
||||
Scénario: Embouteillage - Passage manuel puis sortie
|
||||
Étant donné que l'utilisateur écoute la séquence 2 "Les lions"
|
||||
Et que la séquence 2 se termine
|
||||
Et que le prochain point GPS (séquence 3) est à 3 km
|
||||
Et que l'utilisateur est bloqué dans un embouteillage
|
||||
Et que l'ETA indique "≈ 30 minutes"
|
||||
Quand l'utilisateur clique [▶|] (clic 1) pour passer en mode manuel
|
||||
Alors la séquence 3 démarre immédiatement
|
||||
Et le toast indique: "Mode manuel activé. Cliquez à nouveau pour quitter."
|
||||
Quand l'utilisateur clique [▶|] (clic 2) dans les 8 secondes
|
||||
Alors l'audio-guide est mis en pause
|
||||
Et l'utilisateur retourne au flux normal (podcasts, musique)
|
||||
Et la progression est sauvegardée (séquence 3 à X:XX)
|
||||
|
||||
Scénario: Reprise audio-guide après sortie embouteillage
|
||||
Étant donné que l'utilisateur a quitté l'audio-guide en séquence 3
|
||||
Et que plusieurs heures plus tard, l'utilisateur se reconnecte
|
||||
Et que l'utilisateur est à 80m du point GPS séquence 4
|
||||
Quand le système détecte la proximité
|
||||
Alors une popup de reprise s'affiche:
|
||||
"""
|
||||
Reprendre l'audio-guide "Safari du Paugre" ?
|
||||
Progression : 3/8 séquences
|
||||
[Reprendre] [Recommencer] [Voir liste]
|
||||
"""
|
||||
@@ -0,0 +1,242 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Gestion des contenus supprimés pendant offline
|
||||
En tant qu'utilisateur offline
|
||||
Je veux être informé des contenus supprimés à la reconnexion
|
||||
Afin de comprendre pourquoi certains contenus ont disparu
|
||||
|
||||
Contexte:
|
||||
Étant donné qu'un utilisateur a téléchargé 50 contenus offline
|
||||
Et que l'utilisateur part offline pendant 7 jours
|
||||
|
||||
# Processus de synchronisation
|
||||
|
||||
Scénario: Reconnexion WiFi - Validation des contenus locaux
|
||||
Étant donné que l'utilisateur se reconnecte au WiFi
|
||||
Quand l'application détecte la connexion internet
|
||||
Alors une requête API est envoyée: GET /offline/validate
|
||||
Et l'API retourne:
|
||||
"""json
|
||||
{
|
||||
"valid_ids": [1, 2, 3, 5, 7, 8, ...],
|
||||
"deleted_ids": [4, 6, 10],
|
||||
"metadata_updates": [
|
||||
{"id": 9, "new_title": "Nouveau titre", "creator": "CreateurA"}
|
||||
]
|
||||
}
|
||||
"""
|
||||
|
||||
Scénario: Traitement réponse validation - Suppression fichiers locaux
|
||||
Étant donné que l'API retourne deleted_ids = [4, 6, 10]
|
||||
Quand l'application traite la réponse
|
||||
Alors les fichiers locaux des contenus 4, 6, 10 sont supprimés immédiatement
|
||||
Et les métadonnées locales SQLite sont mises à jour
|
||||
Et un compteur de suppressions est incrémenté
|
||||
|
||||
Scénario: Renouvellement validité contenus valides
|
||||
Étant donné que l'API retourne valid_ids = [1, 2, 3, 5, 7, 8, ...]
|
||||
Quand l'application traite la réponse
|
||||
Alors la validité de ces contenus est renouvelée pour 30 jours
|
||||
Et la date d'expiration est mise à jour: today + 30 jours
|
||||
|
||||
Scénario: Mise à jour métadonnées modifiées
|
||||
Étant donné que l'API retourne metadata_updates avec un nouveau titre
|
||||
Quand l'application traite la réponse
|
||||
Alors la base SQLite locale est mise à jour:
|
||||
| content_id | nouveau_titre | nouveau_creator |
|
||||
| 9 | Nouveau titre | CreateurA |
|
||||
Et les fichiers audio restent inchangés
|
||||
|
||||
# Gestion contenu en cours d'écoute
|
||||
|
||||
Scénario: Contenu supprimé en cours de lecture - Arrêt immédiat
|
||||
Étant donné que l'utilisateur écoute le contenu 4 (à 1:30 sur 3:00)
|
||||
Et que l'API retourne deleted_ids = [4]
|
||||
Quand la synchronisation détecte que contenu 4 est supprimé
|
||||
Alors la lecture s'arrête immédiatement
|
||||
Et une modal s'affiche:
|
||||
"""
|
||||
Contenu supprimé
|
||||
|
||||
Ce contenu n'est plus disponible
|
||||
et a été retiré par le créateur.
|
||||
|
||||
Passage au contenu suivant...
|
||||
|
||||
[OK]
|
||||
"""
|
||||
Et le fichier audio est supprimé localement
|
||||
Et après 2 secondes, le contenu suivant démarre
|
||||
|
||||
Scénario: Contenu supprimé PAS en cours - Suppression silencieuse
|
||||
Étant donné que l'utilisateur écoute le contenu 1
|
||||
Et que l'API retourne deleted_ids = [4, 6, 10]
|
||||
Quand la synchronisation traite les suppressions
|
||||
Alors les fichiers 4, 6, 10 sont supprimés silencieusement
|
||||
Et aucune interruption de lecture ne se produit
|
||||
Et un toast récapitulatif est affiché à la fin de la lecture actuelle
|
||||
|
||||
# Message récapitulatif
|
||||
|
||||
Scénario: Plusieurs contenus supprimés - Popup récapitulative
|
||||
Étant donné que 3 contenus ont été supprimés (4, 6, 10)
|
||||
Quand la synchronisation est terminée
|
||||
Alors une popup s'affiche:
|
||||
"""
|
||||
Contenus supprimés
|
||||
|
||||
3 contenus téléchargés ne sont plus
|
||||
disponibles et ont été retirés.
|
||||
|
||||
Les créateurs peuvent supprimer ou
|
||||
modifier leurs contenus à tout moment.
|
||||
|
||||
[Voir la liste] [OK]
|
||||
"""
|
||||
|
||||
Scénario: Bouton "Voir la liste" - Affichage détails
|
||||
Étant donné que la popup récapitulative est affichée
|
||||
Quand l'utilisateur clique sur [Voir la liste]
|
||||
Alors une nouvelle vue s'affiche avec:
|
||||
| Contenu | Créateur | Raison |
|
||||
| Podcast Auto Episode 4| CreateurA | Retiré créateur |
|
||||
| Musique Classique | CreateurB | Modération |
|
||||
| Audio-guide Paris | CreateurC | Retiré créateur |
|
||||
Et l'historique est conservé 7 jours puis purgé
|
||||
|
||||
Scénario: Bouton "OK" - Fermeture popup
|
||||
Étant donné que la popup récapitulative est affichée
|
||||
Quand l'utilisateur clique sur [OK]
|
||||
Alors la popup se ferme
|
||||
Et l'utilisateur continue normalement
|
||||
Et l'historique des suppressions reste accessible pendant 7 jours
|
||||
|
||||
# Toast notification
|
||||
|
||||
Scénario: Toast simple si 1 seul contenu supprimé
|
||||
Étant donné qu'un seul contenu a été supprimé (4)
|
||||
Quand la synchronisation est terminée
|
||||
Alors un toast s'affiche pendant 5 secondes:
|
||||
"""
|
||||
1 contenu supprimé a été retiré
|
||||
"""
|
||||
Et aucune popup n'est affichée (toast suffit)
|
||||
|
||||
Scénario: Popup si 2+ contenus supprimés
|
||||
Étant donné que 2 ou plus contenus ont été supprimés
|
||||
Quand la synchronisation est terminée
|
||||
Alors une popup complète est affichée (pas juste un toast)
|
||||
Car l'utilisateur doit être informé clairement
|
||||
|
||||
# Motifs de suppression
|
||||
|
||||
Scénario: Contenu supprimé par créateur volontairement
|
||||
Étant donné que le créateur a supprimé le contenu 4 volontairement
|
||||
Quand l'API retourne deleted_ids = [4] avec motif "creator_deleted"
|
||||
Alors le contenu est retiré immédiatement (pas de grace period MVP)
|
||||
Et la raison affichée est: "Retiré par le créateur"
|
||||
|
||||
Scénario: Contenu supprimé par modération (violation CGU)
|
||||
Étant donné que le contenu 6 a été modéré pour violation CGU
|
||||
Quand l'API retourne deleted_ids = [6] avec motif "moderation"
|
||||
Alors le contenu est retiré immédiatement
|
||||
Et la raison affichée est: "Retiré pour modération"
|
||||
|
||||
Scénario: Contenu passé en Premium (créateur change statut)
|
||||
Étant donné que le contenu 10 est passé en "Premium exclusif"
|
||||
Et que l'utilisateur est gratuit
|
||||
Quand l'API retourne deleted_ids = [10] avec motif "premium_only"
|
||||
Alors le contenu est retiré immédiatement
|
||||
Et la raison affichée est: "Réservé aux abonnés Premium"
|
||||
|
||||
# Justification KISS
|
||||
|
||||
Scénario: Comparaison avec grace period - Simplicité MVP
|
||||
Étant donné qu'on compare la suppression immédiate vs grace period
|
||||
Quand on évalue les avantages KISS
|
||||
Alors les avantages suppression immédiate sont:
|
||||
| avantage | description |
|
||||
| Simplicité technique | Pas de gestion états intermédiaires complexes |
|
||||
| Respect créateur | Volonté immédiate respectée |
|
||||
| Conformité légale | Contenu illégal retiré immédiatement |
|
||||
| Cas rare | Peu de créateurs suppriment contenus après publi |
|
||||
|
||||
# Post-MVP : Grace period (si feedback négatifs)
|
||||
|
||||
Scénario: Post-MVP - Grace period 7 jours pour suppression créateur volontaire
|
||||
Étant donné qu'on implémente la grace period post-MVP
|
||||
Et que le contenu 4 est supprimé volontairement par le créateur
|
||||
Quand l'API retourne deleted_ids = [4] avec motif "creator_deleted"
|
||||
Alors le contenu est marqué "Bientôt retiré" avec badge
|
||||
Et l'utilisateur peut encore l'écouter pendant 7 jours
|
||||
Et après 7 jours, le contenu est supprimé
|
||||
|
||||
Scénario: Post-MVP - Pas de grace period pour modération
|
||||
Étant donné qu'on implémente la grace period post-MVP
|
||||
Et que le contenu 6 est modéré (illégal, violation CGU)
|
||||
Quand l'API retourne deleted_ids = [6] avec motif "moderation"
|
||||
Alors le contenu est supprimé immédiatement (pas de grace period)
|
||||
Car sécurité/légalité prime
|
||||
|
||||
Scénario: Post-MVP - Grace period si user Premium et contenu devient Premium
|
||||
Étant donné qu'on implémente la grace period post-MVP
|
||||
Et que le contenu 10 passe en "Premium exclusif"
|
||||
Et que l'utilisateur a un abonnement Premium
|
||||
Quand l'API retourne deleted_ids = [10] avec motif "premium_only"
|
||||
Alors l'utilisateur Premium conserve l'accès (pas supprimé)
|
||||
Mais l'utilisateur gratuit perd l'accès après 7 jours
|
||||
|
||||
# Cas limites
|
||||
|
||||
Scénario: Tous les contenus offline supprimés - Message spécifique
|
||||
Étant donné que l'utilisateur avait 5 contenus offline
|
||||
Et que les 5 contenus ont été supprimés pendant offline
|
||||
Quand la synchronisation retourne deleted_ids = [1, 2, 3, 4, 5]
|
||||
Alors une popup spécifique s'affiche:
|
||||
"""
|
||||
Tous vos contenus offline ont été supprimés
|
||||
|
||||
Les 5 contenus téléchargés ne sont plus disponibles.
|
||||
|
||||
Téléchargez de nouveaux contenus pour écouter offline.
|
||||
|
||||
[Parcourir contenus] [OK]
|
||||
"""
|
||||
|
||||
Scénario: Contenu supprimé puis utilisateur re-télécharge
|
||||
Étant donné que le contenu 4 a été supprimé pendant offline
|
||||
Et que l'utilisateur a vu la notification
|
||||
Quand l'utilisateur se reconnecte et browse les contenus
|
||||
Alors le contenu 4 n'apparaît plus dans la liste
|
||||
Et l'utilisateur ne peut pas le re-télécharger (supprimé définitivement)
|
||||
|
||||
Scénario: Historique suppressions conservé 7 jours
|
||||
Étant donné que 3 contenus ont été supprimés le 1er février
|
||||
Quand l'utilisateur consulte l'historique des suppressions le 7 février
|
||||
Alors l'historique est toujours visible
|
||||
Quand l'utilisateur consulte l'historique le 9 février (7+ jours)
|
||||
Alors l'historique a été purgé automatiquement
|
||||
|
||||
# Statistiques côté API
|
||||
|
||||
Scénario: API - Comptabilisation contenus supprimés pendant offline
|
||||
Étant donné que 1000 utilisateurs étaient offline pendant 7 jours
|
||||
Et que 150 contenus ont été supprimés pendant cette période
|
||||
Quand l'API génère les métriques de synchronisation
|
||||
Alors les statistiques affichent:
|
||||
| métrique | valeur |
|
||||
| Utilisateurs reconnectés | 1000 |
|
||||
| Contenus supprimés détectés | 4500 |
|
||||
| Moyenne contenus supprimés/user | 4.5 |
|
||||
| Users affectés (≥1 suppression) | 850 |
|
||||
|
||||
# Performance
|
||||
|
||||
Scénario: Requête GET /offline/validate - Performance optimisée
|
||||
Étant donné qu'un utilisateur a 50 contenus offline
|
||||
Quand l'API reçoit GET /offline/validate avec la liste des 50 IDs
|
||||
Alors la requête SQL vérifie l'existence des contenus en batch:
|
||||
"""sql
|
||||
SELECT id FROM contents WHERE id IN (1,2,3,...,50) AND deleted_at IS NULL
|
||||
"""
|
||||
Et la réponse est générée en <200ms
|
||||
Et Redis cache les résultats pour éviter requêtes répétées
|
||||
Reference in New Issue
Block a user