272 lines
12 KiB
Gherkin
272 lines
12 KiB
Gherkin
# language: fr
|
|
Fonctionnalité: Insertion et fréquence des publicités
|
|
En tant que système RoadWave
|
|
Je veux insérer les publicités de manière équilibrée et non intrusive
|
|
Afin de préserver l'expérience utilisateur tout en monétisant
|
|
|
|
Contexte:
|
|
Étant donné que l'API RoadWave est disponible
|
|
Et qu'un utilisateur gratuit est connecté
|
|
|
|
Scénario: Fréquence par défaut 1 pub / 5 contenus
|
|
Étant donné que la fréquence par défaut est configurée à 1/5
|
|
Et que je suis un utilisateur gratuit
|
|
Quand j'écoute 5 contenus
|
|
Alors 1 publicité est insérée après le 5ème contenu
|
|
Quand j'écoute 10 contenus
|
|
Alors 2 publicités sont insérées (après les contenus 5 et 10)
|
|
|
|
Scénario: Aucune publicité pour utilisateurs Premium
|
|
Étant donné que je suis un utilisateur Premium
|
|
Quand j'écoute 100 contenus
|
|
Alors aucune publicité n'est insérée
|
|
Et je bénéficie d'une expérience sans interruption publicitaire
|
|
|
|
Scénario: Fréquence paramétrable par admin (1/3)
|
|
Étant donné que l'admin configure la fréquence à 1/3
|
|
Et que je suis un utilisateur gratuit
|
|
Quand j'écoute 6 contenus
|
|
Alors 2 publicités sont insérées (après contenus 3 et 6)
|
|
|
|
Scénario: Fréquence paramétrable par admin (1/10)
|
|
Étant donné que l'admin configure la fréquence à 1/10
|
|
Et que je suis un utilisateur gratuit
|
|
Quand j'écoute 20 contenus
|
|
Alors 2 publicités sont insérées (après contenus 10 et 20)
|
|
|
|
Scénario: Jamais d'interruption d'un contenu en cours
|
|
Étant donné que j'écoute un contenu de 10 minutes
|
|
Et que je suis à 5 minutes de lecture
|
|
Et qu'une publicité devrait être insérée selon la fréquence
|
|
Quand le système vérifie l'insertion
|
|
Alors la publicité attend la fin du contenu actuel
|
|
Et elle s'insère pendant le délai de transition (2s)
|
|
Et le contenu n'est jamais interrompu
|
|
|
|
Scénario: Insertion entre deux contenus uniquement
|
|
Étant donné que le contenu "A" se termine
|
|
Et que le délai de transition de 2s démarre
|
|
Quand le système détecte qu'une publicité doit être insérée
|
|
Alors le message "Publicité (30s)" s'affiche
|
|
Et la publicité démarre après les 2 secondes
|
|
Et l'enchaînement est naturel et fluide
|
|
|
|
Scénario: Rotation limite 3 fois/jour par utilisateur
|
|
Étant donné qu'un utilisateur a entendu la publicité "A" 3 fois aujourd'hui
|
|
Quand le système sélectionne une nouvelle publicité à diffuser
|
|
Alors la publicité "A" n'est plus éligible pour cet utilisateur aujourd'hui
|
|
Et une autre publicité "B" est sélectionnée
|
|
Et cela évite la saturation publicitaire
|
|
|
|
Scénario: Compteur de diffusions par pub et par utilisateur
|
|
Étant donné qu'un utilisateur écoute la pub "RestaurantX"
|
|
Quand la diffusion se termine
|
|
Alors un compteur Redis "pub:RestaurantX:user:123:count" s'incrémente
|
|
Et le TTL est de 24h (reset à minuit)
|
|
Quand le compteur atteint 3
|
|
Alors la pub "RestaurantX" est exclue des prochaines sélections aujourd'hui
|
|
|
|
Scénario: Limite max 6 pubs/heure par utilisateur
|
|
Étant donné qu'un utilisateur a entendu 6 publicités dans la dernière heure
|
|
Quand le système devrait insérer une 7ème pub
|
|
Alors l'insertion est reportée à l'heure suivante
|
|
Et un compteur horaire Redis "pub:user:123:hourly" est vérifié
|
|
Et cela évite le spam publicitaire
|
|
|
|
Scénario: Ciblage géographique prioritaire - Point GPS
|
|
Étant donné qu'une publicité cible un point GPS à 2km de ma position
|
|
Et qu'une autre publicité cible ma ville entière
|
|
Quand le système sélectionne une publicité
|
|
Alors la publicité point GPS est priorisée (score géo plus élevé)
|
|
Et le ciblage précis est favorisé
|
|
|
|
Scénario: Ciblage géographique prioritaire - Hiérarchie
|
|
Étant donné que 4 publicités sont éligibles:
|
|
| Publicité | Zone | Distance |
|
|
| A | Point GPS | 1km |
|
|
| B | Ville | 0km |
|
|
| C | Département | 0km |
|
|
| D | National | N/A |
|
|
Quand le système sélectionne selon priorité géographique
|
|
Alors l'ordre de priorité est: A > B > C > D
|
|
Et la publicité A (Point GPS, la plus précise) est diffusée
|
|
|
|
Scénario: Ciblage centres d'intérêt secondaire
|
|
Étant donné que 2 publicités ciblent ma zone géographique:
|
|
| Publicité | Tags | Mes jauges |
|
|
| A | Automobile | 80% |
|
|
| B | Voyage | 40% |
|
|
Quand le système applique le score centres d'intérêt
|
|
Alors la publicité A est favorisée (meilleur match jauges)
|
|
Et le ciblage thématique affine la sélection
|
|
|
|
Scénario: Ciblage horaire strict
|
|
Étant donné qu'une campagne cible uniquement 7h-9h
|
|
Et qu'il est 10h30
|
|
Quand le système sélectionne une publicité
|
|
Alors cette campagne n'est PAS éligible
|
|
Et seules les campagnes "toute la journée" ou avec plage horaire actuelle sont considérées
|
|
|
|
Scénario: Ciblage horaire pendant plage active
|
|
Étant donné qu'une campagne cible 7h-9h et 17h-19h
|
|
Et qu'il est 8h15
|
|
Quand le système sélectionne une publicité
|
|
Alors cette campagne est éligible
|
|
Et elle peut être diffusée
|
|
|
|
Scénario: Normalisation volume audio -14 LUFS
|
|
Étant donné qu'une publicité est uploadée avec volume trop élevé (-6 LUFS)
|
|
Quand le système encode l'audio via FFmpeg
|
|
Alors le volume est normalisé automatiquement à -14 LUFS
|
|
Et le publicitaire reçoit une notification "Volume audio ajusté pour conformité"
|
|
Et cela évite l'effet "pub trop forte" frustrant
|
|
|
|
Scénario: Validation volume audio lors encodage
|
|
Étant donné qu'une publicité est soumise
|
|
Quand FFmpeg encode le fichier
|
|
Alors une commande loudnorm est appliquée:
|
|
```
|
|
ffmpeg -i input.mp3 -filter:a loudnorm=I=-14:LRA=11:TP=-1 output.mp3
|
|
```
|
|
Et le fichier final respecte le standard broadcast -14 LUFS
|
|
|
|
Scénario: Sélection aléatoire si critères équivalents
|
|
Étant donné que 3 publicités ont le même score géo
|
|
Et qu'elles ont toutes des jauges centres d'intérêt équivalentes
|
|
Et qu'aucune n'a été diffusée 3 fois aujourd'hui
|
|
Quand le système sélectionne une publicité
|
|
Alors une sélection aléatoire équitable est faite
|
|
Et chaque campagne a 33% de chances d'être diffusée
|
|
|
|
Scénario: Exclusion publicités avec budget épuisé
|
|
Étant donné qu'une campagne "A" a épuisé son budget
|
|
Et qu'une campagne "B" a encore du budget disponible
|
|
Quand le système sélectionne une publicité
|
|
Alors seule la campagne "B" est éligible
|
|
Et la campagne "A" est automatiquement exclue
|
|
|
|
Scénario: Exclusion publicités hors dates de campagne
|
|
Étant donné qu'une campagne "A" est programmée du 01/02 au 14/02
|
|
Et que nous sommes le 20/01
|
|
Quand le système sélectionne une publicité
|
|
Alors la campagne "A" n'est pas éligible
|
|
Et seules les campagnes actives aujourd'hui sont considérées
|
|
|
|
Scénario: Publicité visible uniquement dans zone géographique
|
|
Étant donné qu'une publicité cible "Marseille uniquement"
|
|
Et que je suis à Lyon
|
|
Quand le système sélectionne une publicité
|
|
Alors cette publicité n'est jamais éligible pour moi
|
|
Et je ne la verrai jamais tant que je reste à Lyon
|
|
|
|
Scénario: Tracking compteur horaire avec TTL
|
|
Étant donné qu'un utilisateur entend une pub à 10h05
|
|
Quand le compteur horaire est incrémenté
|
|
Alors la clé Redis "pub:user:123:hourly:2026012110" est créée
|
|
Et le TTL est de 1 heure (expire à 11h05)
|
|
Et le système compte les pubs dans la fenêtre glissante d'1h
|
|
|
|
Scénario: Reset compteur quotidien à minuit
|
|
Étant donné qu'un utilisateur a entendu la pub "A" 3 fois le 20/01
|
|
Quand minuit passe et on est le 21/01
|
|
Alors le compteur "pub:A:user:123:count" est expiré (TTL 24h)
|
|
Et l'utilisateur peut à nouveau entendre la pub "A" jusqu'à 3 fois
|
|
|
|
Scénario: Aucune pub si aucune campagne éligible
|
|
Étant donné qu'aucune campagne n'a de budget disponible
|
|
Ou que toutes les campagnes ont déjà été diffusées 3 fois aujourd'hui
|
|
Quand le système devrait insérer une publicité
|
|
Alors aucune pub n'est insérée
|
|
Et l'enchaînement de contenus continue normalement
|
|
Et le prochain contenu démarre directement
|
|
|
|
Scénario: Priorisation campagnes avec budget important restant
|
|
Étant donné que 2 campagnes sont éligibles:
|
|
| Campagne | Budget restant | Jours restants |
|
|
| A | 500€ | 2j |
|
|
| B | 50€ | 10j |
|
|
Quand le système applique la priorisation budgétaire
|
|
Alors la campagne A est légèrement favorisée (urgence dépense)
|
|
Et cela aide à épuiser les budgets avant fin de campagne
|
|
|
|
Scénario: Log des sélections pour analytics
|
|
Étant donné qu'une publicité "RestaurantX" est sélectionnée
|
|
Quand elle est diffusée à l'utilisateur "123"
|
|
Alors un événement est loggé en base:
|
|
| Champ | Valeur |
|
|
| pub_id | RestaurantX |
|
|
| user_id | 123 |
|
|
| timestamp | 2026-01-21 10:30 |
|
|
| zone_geo | Marseille |
|
|
| score_geo | 0.85 |
|
|
| score_interet | 0.70 |
|
|
Et cela permet l'analytics publicitaire
|
|
|
|
Scénario: Détection changement statut utilisateur (gratuit → premium)
|
|
Étant donné que je suis un utilisateur gratuit
|
|
Et que j'entends des publicités
|
|
Quand je souscris à Premium
|
|
Alors le système détecte le changement de statut immédiatement
|
|
Et plus aucune publicité n'est insérée dès le prochain contenu
|
|
Et mon expérience devient sans pub instantanément
|
|
|
|
Scénario: Interface admin pour ajuster fréquence globale
|
|
Étant donné que je suis admin RoadWave
|
|
Quand j'accède aux paramètres publicitaires
|
|
Alors je peux ajuster le curseur de fréquence:
|
|
| Option | Fréquence |
|
|
| 1/3 | Haute (agressif) |
|
|
| 1/5 | Standard (défaut)|
|
|
| 1/7 | Modérée |
|
|
| 1/10 | Faible |
|
|
Et le changement s'applique en temps réel à tous les utilisateurs
|
|
|
|
Scénario: A/B testing fréquence sur cohortes utilisateurs
|
|
Étant donné que l'admin active un test A/B
|
|
Quand 50% des utilisateurs ont fréquence 1/5
|
|
Et 50% des utilisateurs ont fréquence 1/7
|
|
Alors les métriques sont trackées séparément:
|
|
| Cohorte | Fréquence | Taux désabonnement | Revenus/user |
|
|
| A | 1/5 | 2.5% | 0.50€ |
|
|
| B | 1/7 | 1.8% | 0.40€ |
|
|
Et l'admin peut identifier la fréquence optimale
|
|
|
|
Plan du Scénario: Insertion publicité selon fréquence
|
|
Étant donné que la fréquence est <frequence>
|
|
Quand j'écoute <contenus> contenus
|
|
Alors <pubs> publicités sont insérées
|
|
|
|
Exemples:
|
|
| frequence | contenus | pubs |
|
|
| 1/3 | 9 | 3 |
|
|
| 1/5 | 10 | 2 |
|
|
| 1/5 | 25 | 5 |
|
|
| 1/7 | 14 | 2 |
|
|
| 1/10 | 30 | 3 |
|
|
|
|
Plan du Scénario: Priorité géographique selon type zone
|
|
Étant donné qu'une publicité cible <type_zone>
|
|
Quand le système calcule le score géographique
|
|
Alors la priorité est <score>
|
|
|
|
Exemples:
|
|
| type_zone | score |
|
|
| Point GPS | 1.0 |
|
|
| Ville | 0.8 |
|
|
| Département | 0.6 |
|
|
| Région | 0.4 |
|
|
| National | 0.2 |
|
|
|
|
Plan du Scénario: Exclusion publicité selon compteur quotidien
|
|
Étant donné qu'une publicité a été entendue <fois> fois aujourd'hui
|
|
Quand le système vérifie l'éligibilité
|
|
Alors la publicité est <eligible>
|
|
|
|
Exemples:
|
|
| fois | eligible |
|
|
| 0 | éligible |
|
|
| 1 | éligible |
|
|
| 2 | éligible |
|
|
| 3 | non éligible |
|
|
| 4 | non éligible |
|