feat(bdd): réorganiser features en catégories api/ui/e2e et créer ADR-024

Résolution des incohérences #10, #11, et #12 de l'analyse d'architecture.

## Phase 1 : Réorganisation Features BDD (Point #10 - RÉSOLU)

- Créer structure features/{api,ui,e2e}
- Déplacer 83 features en 3 catégories via git mv (historique préservé)
  - features/api/ : 53 features (tests API backend)
  - features/ui/ : 22 features (tests UI mobile)
  - features/e2e/ : 8 features (tests end-to-end)

Domaines déplacés :
- API : authentication, recommendation, rgpd-compliance, content-creation,
  moderation, monetisation, premium, radio-live, publicites
- UI : audio-guides, navigation, interest-gauges, mode-offline,
  partage, profil, recherche
- E2E : abonnements, error-handling

## Phase 2 : Mise à jour Documentation

### ADR-007 - Tests BDD
- Ajouter section "Convention de Catégorisation des Features"
- Documenter règles api/ui/e2e avec exemples concrets
- Spécifier step definitions (backend Go, mobile Dart)

### ADR-024 - Stratégie CI/CD Monorepo (NOUVEAU)
- Créer ADR dédié pour stratégie CI/CD avec path filters
- Architecture workflows séparés (backend.yml, mobile.yml, shared.yml)
- Configuration path filters détaillée avec exemples YAML
- Matrice de déclenchement et optimisations (~70% gain temps CI)
- Plan d'implémentation (~2h, reporté jusqu'au développement)

### ADR-016 - Organisation Monorepo
- Simplifier en retirant section CI/CD détaillée
- Ajouter référence vers ADR-024 pour stratégie CI/CD

### INCONSISTENCIES-ANALYSIS.md
- Point #10 (Tests BDD synchronisés) :  RÉSOLU
  - Catégorisation features implémentée
  - ADR-007 mis à jour avec convention complète
- Point #11 (70/30 Split paiements) :  ANNULÉ (faux problème)
  - ADR-009 et Règle 18 parfaitement cohérents
  - Documentation exhaustive existante (formule, SQL, comparaisons)
- Point #12 (Monorepo path filters) : ⏸️ DOCUMENTÉ
  - Architecture CI/CD complète dans ADR-024
  - Implémentation reportée (projet en phase documentation)
- Métriques mises à jour :
  - MODERATE : 6/9 traités (4 résolus + 1 annulé + 1 documenté)
  - ADR à jour : 100% (19/19 avec ADR-024)

## Phase 3 : Validation

- Structure features validée (api/ui/e2e, aucun répertoire restant)
- Historique Git préservé (git mv, renommages détectés)
- 83 features total (API: 53, UI: 22, E2E: 8)

Closes: Point #10 (résolu), Point #11 (annulé), Point #12 (documenté)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
jpgiannetti
2026-02-01 11:31:41 +01:00
parent 841028d1b2
commit 37c62206ad
88 changed files with 625 additions and 67 deletions

View File

@@ -0,0 +1,254 @@
# language: fr
Fonctionnalité: Création de campagnes publicitaires
En tant que publicitaire
Je veux créer des campagnes avec ciblage précis et maîtrise du budget
Afin d'optimiser mes investissements publicitaires
Contexte:
Étant donné que l'API RoadWave est disponible
Et qu'un compte publicitaire est créé et vérifié
Scénario: Création d'une campagne publicitaire complète
Étant donné que je suis connecté en tant que publicitaire
Quand je crée une nouvelle campagne avec les paramètres:
| Paramètre | Valeur |
| Budget total | 300 |
| Date début | 2026-02-01 |
| Date fin | 2026-02-14 |
| Zone géographique | Département du Var |
| Plages horaires | 7h-9h, 17h-19h |
| Tags ciblés | Automobile, Voyage |
| Tranche d'âge | 18+ |
Alors la campagne est créée avec succès
Et le budget quotidien calculé est de 21.43/jour
Et les diffusions estimées sont de ~430 écoutes complètes
Et un statut "En attente de validation" est assigné
Scénario: Budget minimum 50€ requis
Étant donné que je crée une nouvelle campagne
Quand je définis un budget de 40
Alors une erreur s'affiche: "Budget minimum requis: 50"
Et la campagne n'est pas créée
Scénario: Budget de 50€ exactement accepté
Étant donné que je crée une nouvelle campagne
Quand je définis un budget de 50
Alors la campagne est créée avec succès
Et aucune erreur n'est affichée
Scénario: Calcul automatique du budget quotidien
Étant donné une campagne avec:
| Budget total | 300 |
| Durée | 14 j |
Quand le système calcule le budget quotidien
Alors le budget/jour est de 21.43
Et le nombre estimé de diffusions/jour est de 430 (à 0.05/écoute)
Scénario: Ciblage géographique point GPS précis
Étant donné que je crée une campagne
Quand je sélectionne "Point GPS" avec coordonnées (43.1234, 5.9234)
Et que je définis un rayon de 5km
Alors la campagne cible uniquement les utilisateurs dans ce rayon
Et la zone est représentée par un cercle sur la carte
Scénario: Ciblage géographique ville
Étant donné que je crée une campagne
Quand je sélectionne "Ville" et choisis "Marseille"
Alors la campagne cible tous les utilisateurs dans la commune de Marseille
Et les limites administratives sont affichées sur la carte
Scénario: Ciblage géographique département
Étant donné que je crée une campagne
Quand je sélectionne "Département" et choisis "Var (83)"
Alors la campagne cible tout le département du Var
Et une estimation de population cible est affichée
Scénario: Ciblage géographique région
Étant donné que je crée une campagne
Quand je sélectionne "Région" et choisis "Provence-Alpes-Côte d'Azur"
Alors la campagne cible toute la région PACA
Et l'estimation de population cible est mise à jour
Scénario: Ciblage géographique national
Étant donné que je crée une campagne
Quand je sélectionne "National"
Alors la campagne cible tous les utilisateurs en France
Et aucune limite géographique n'est appliquée
Scénario: Ciblage horaire plages multiples
Étant donné que je crée une campagne
Quand je définis les plages horaires:
| Plage |
| 7h-9h |
| 12h-14h |
| 17h-19h |
Alors la publicité est diffusée uniquement pendant ces plages
Et elle n'est jamais diffusée en dehors (ex: 10h, 15h, 20h)
Scénario: Ciblage horaire toute la journée
Étant donné que je crée une campagne
Quand je ne définis aucune plage horaire spécifique
Alors la publicité est diffusée 24h/24
Et aucune restriction horaire n'est appliquée
Scénario: Ciblage par centres d'intérêt
Étant donné que je crée une campagne pour un garage automobile
Quand je sélectionne les tags:
| Tag |
| Automobile |
| Mécanique |
| Sport |
Alors la publicité est prioritaire pour les utilisateurs avec jauges élevées sur ces tags
Et elle peut quand même être diffusée à d'autres utilisateurs (ciblage non exclusif)
Scénario: Classification d'âge obligatoire
Étant donné que je crée une campagne
Quand j'essaie de valider sans sélectionner une tranche d'âge
Alors une erreur s'affiche: "Classification d'âge obligatoire"
Et les options proposées sont:
| Option |
| Tout public |
| 13+ |
| 16+ |
| 18+ |
Scénario: Upload audio publicitaire formats acceptés
Étant donné que je crée une campagne
Quand j'upload un fichier audio format MP3
Alors le fichier est accepté
Quand j'upload un fichier audio format AAC (.aac ou .m4a)
Alors le fichier est accepté
Quand j'upload un fichier audio format WAV
Alors une erreur s'affiche: "Format non supporté. Utilisez MP3 ou AAC"
Scénario: Durée audio publicitaire validée
Étant donné que je crée une campagne
Quand j'upload un audio de 8 secondes
Alors une erreur s'affiche: "Durée minimale: 10 secondes"
Quand j'upload un audio de 65 secondes
Alors une erreur s'affiche: "Durée maximale: 60 secondes"
Quand j'upload un audio de 30 secondes
Alors le fichier est accepté
Scénario: Prépaiement obligatoire via Mangopay
Étant donné que j'ai configuré une campagne à 300
Quand j'arrive à l'étape de paiement
Alors je dois payer les 300 avant validation
Et le paiement est traité via Mangopay
Et seule la carte bancaire est acceptée
Scénario: Recharge automatique optionnelle
Étant donné que j'ai une campagne active
Quand je configure la recharge automatique à 10% du budget
Alors si le budget restant passe sous 30 (10% de 300)
Et que la campagne recharge automatiquement 100
Et ma carte bancaire est débitée de 100
Et le budget total passe à 130
Scénario: Désactivation recharge automatique
Étant donné que j'ai activé la recharge automatique
Quand je désactive cette option
Alors aucune recharge ne se produit automatiquement
Et la campagne s'arrête quand le budget atteint 0
Scénario: Étalement budget sur période longue
Étant donné une campagne avec:
| Budget total | 1000 |
| Durée | 30 j |
Quand le système calcule l'étalement
Alors le budget/jour est de 33.33
Et si le budget se consomme plus vite (ex: 50/jour)
Alors une alerte "Budget épuisé dans 10 jours" est envoyée
Scénario: Estimation population cible selon zone
Étant donné que je sélectionne la zone "Marseille"
Quand le système calcule la population cible
Alors l'estimation affichée est "~15 000 utilisateurs potentiels"
Et un message "Estimation basée sur utilisateurs actifs dans la zone" s'affiche
Scénario: Campagne avec date de début différée
Étant donné que je crée une campagne
Quand je définis la date de début au 2026-03-01 (dans 1 mois)
Alors la campagne a le statut "Programmée"
Et elle démarre automatiquement le 2026-03-01 à 00h00
Et le budget n'est pas consommé avant cette date
Scénario: Interface self-service accessible
Étant donné que je suis un publicitaire
Quand j'accède à l'interface publicitaire
Alors je peux créer une campagne sans contact commercial RoadWave
Et toutes les options sont configurables en autonomie
Et un tutoriel guidé est disponible (première utilisation)
Scénario: Aperçu zone ciblée sur carte interactive
Étant donné que je configure une zone géographique
Quand je sélectionne "Département du Var"
Alors une carte Leaflet affiche les limites du département en surbrillance
Et un compteur "~50 000 utilisateurs actifs" est affiché
Et je peux zoomer/dézoomer pour visualiser la zone
Scénario: Tags multiples pour ciblage affiné
Étant donné que je crée une campagne pour un restaurant
Quand je sélectionne les tags:
| Tag |
| Gastronomie |
| Tourisme |
| Famille |
Alors la publicité est prioritaire pour utilisateurs intéressés par ces 3 thèmes
Et le score de ciblage combine les 3 jauges d'intérêt
Scénario: Validation des dates de campagne
Étant donné que je crée une campagne
Quand je définis une date de début postérieure à la date de fin
Alors une erreur s'affiche: "Date de fin doit être après date de début"
Et la campagne n'est pas créée
Scénario: Durée minimale de campagne
Étant donné que je crée une campagne
Quand je définis une durée de moins de 24 heures
Alors une erreur s'affiche: "Durée minimale: 1 jour"
Et je dois ajuster les dates
Scénario: Durée maximale de campagne
Étant donné que je crée une campagne
Quand je définis une durée de plus de 90 jours
Alors une erreur s'affiche: "Durée maximale: 90 jours"
Et je dois ajuster les dates ou créer plusieurs campagnes
Plan du Scénario: Calcul budget quotidien selon durée
Étant donné une campagne avec un budget de <budget>
Quand la durée est de <duree> jours
Alors le budget quotidien est de <budget_jour>/jour
Exemples:
| budget | duree | budget_jour |
| 100 | 10 | 10.00 |
| 300 | 14 | 21.43 |
| 500 | 30 | 16.67 |
| 1000 | 60 | 16.67 |
Plan du Scénario: Estimation diffusions selon budget
Étant donné un budget quotidien de <budget_jour>
Quand le coût par écoute complète est 0.05
Alors le nombre estimé de diffusions/jour est <diffusions>
Exemples:
| budget_jour | diffusions |
| 10.00 | 200 |
| 21.43 | 429 |
| 50.00 | 1000 |
| 100.00 | 2000 |
Plan du Scénario: Formats audio acceptés/rejetés
Étant donné que j'upload un fichier <fichier>
Quand le format est <format>
Alors le résultat est <resultat>
Exemples:
| fichier | format | resultat |
| pub.mp3 | MP3 | accepté |
| pub.aac | AAC | accepté |
| pub.m4a | AAC | accepté |
| pub.wav | WAV | rejeté |
| pub.ogg | OGG | rejeté |
| pub.flac | FLAC | rejeté |