Initial commit
This commit is contained in:
271
features/publicites/insertion-frequence-pub.feature
Normal file
271
features/publicites/insertion-frequence-pub.feature
Normal file
@@ -0,0 +1,271 @@
|
||||
# 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 |
|
||||
Reference in New Issue
Block a user