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,293 @@
# language: fr
Fonctionnalité: Profil créateur
En tant qu'utilisateur de RoadWave
Je veux consulter les profils des créateurs
Afin de découvrir leur contenu et décider de m'abonner
Contexte:
Étant donné que l'application RoadWave est démarrée
# 15.2.1 - Structure de la page profil
Scénario: URL du profil créateur
Étant donné un créateur avec le pseudo "paris_stories"
Quand l'utilisateur accède au profil
Alors l'URL est "https://roadwave.fr/@paris_stories"
Scénario: Informations principales du profil
Étant donné un créateur "@paris_stories" avec les informations suivantes:
| champ | valeur |
| photo | avatar_120x120.jpg |
| pseudo | paris_stories |
| badge_vérifié | true |
| bio | Histoires et anecdotes de Paris |
| abonnés | 1200 |
| contenus | 42 |
| durée_totale | 18h |
| écoutes_totales | 54000 |
Quand le profil est affiché
Alors les éléments suivants sont visibles:
| élément | valeur affichée |
| Photo profil | 120×120 px |
| @pseudo | @paris_stories |
| Badge vérifié | |
| Bio | Histoires et... |
| Nombre abonnés | 1.2K abonnés |
| Nombre contenus | 42 contenus |
| Durée totale | 18h de contenu créé |
| Écoutes totales | 54K écoutes totales |
Plan du Scénario: Arrondi des statistiques publiques
Étant donné un créateur avec <valeur_exacte> <métrique>
Quand le profil est affiché
Alors la valeur affichée est "<valeur_affichée>"
Exemples:
| métrique | valeur_exacte | valeur_affichée |
| abonnés | 342 | 342 |
| abonnés | 1200 | 1.2K |
| abonnés | 54000 | 54K |
| abonnés | 1200000 | 1.2M |
| écoutes | 842 | 842 |
| écoutes | 5400 | 5.4K |
| écoutes | 142000 | 142K |
| écoutes | 2100000 | 2.1M |
| durée (heures) | 18 | 18h |
| durée (heures) | 142 | 142h |
Scénario: Bio avec markdown basique
Étant donné un créateur avec la bio suivante en markdown:
"""
**Histoires de Paris** - Découvrez la capitale
*Nouveau contenu chaque semaine*
https://paris-stories.fr
"""
Quand le profil est affiché
Alors le texte en gras "Histoires de Paris" est formaté
Et le texte en italique "Nouveau contenu chaque semaine" est formaté
Et le lien "https://paris-stories.fr" est cliquable
Scénario: Limitation de la bio à 300 caractères
Étant donné un créateur qui entre une bio de 350 caractères
Quand la bio est sauvegardée
Alors seuls les 300 premiers caractères sont conservés
Et un message "Maximum 300 caractères" s'affiche
Scénario: Boutons d'action principaux
Étant donné que l'utilisateur consulte un profil créateur
Quand la page est chargée
Alors les boutons suivants sont visibles:
| bouton | action |
| S'abonner | Abonnement au créateur |
| Partager profil | Menu de partage |
| | Menu contextuel |
Scénario: Menu contextuel du profil [•••]
Étant donné que l'utilisateur clique sur le bouton []
Quand le menu s'ouvre
Alors les options suivantes sont disponibles:
| option | description |
| Partager profil | Partager le lien du profil |
| Signaler profil | Signaler spam ou usurpation d'identité |
| Bloquer créateur | Masquer tous les contenus du créateur |
Scénario: Liste des contenus du créateur
Étant donné un créateur avec 3 contenus publiés
Quand le profil est affiché
Alors chaque contenu affiche:
| élément | exemple |
| Cover image | Image 16:9 |
| Titre | Balade à Paris |
| Durée et écoutes | 12 min · 🎧 2.3K |
| Localisation | 📍 Paris |
| Bouton lecture | |
Plan du Scénario: Options de tri des contenus
Étant donné un créateur avec 10 contenus publiés
Quand l'utilisateur sélectionne le tri "<option_tri>"
Alors les contenus sont triés par <critère>
Exemples:
| option_tri | critère |
| Plus récents | Date publication DESC (défaut) |
| Plus populaires | Écoutes × facteur temporel (90 jours) |
| Plus anciens | Date publication ASC |
Scénario: Filtrage des contenus par tag
Étant donné un créateur avec des contenus taggés "Voyage", "Histoire", "Gastronomie"
Quand l'utilisateur filtre par tags "Voyage, Histoire"
Alors seuls les contenus avec ces tags sont affichés
Et le nombre de résultats est indiqué "12 contenus"
Scénario: Recherche locale dans le profil
Étant donné que l'utilisateur consulte le profil de "@paris_stories"
Et que le créateur a publié 50 contenus
Quand l'utilisateur entre "Montmartre" dans la barre de recherche
Alors la recherche s'effectue sur les titres et descriptions
Et seuls les contenus correspondants sont affichés
Et le placeholder indique "Rechercher dans les contenus de @paris_stories"
Scénario: Chargement paginé des contenus
Étant donné un créateur avec 100 contenus publiés
Quand le profil est affiché
Alors 20 contenus sont chargés initialement
Et un bouton "Charger plus" est visible en bas de page
Quand l'utilisateur clique sur "Charger plus"
Alors 20 contenus supplémentaires sont chargés
# 15.2.2 - Statistiques publiques
Scénario: Informations publiques visibles par tous
Étant donné que l'utilisateur consulte un profil créateur
Alors les informations suivantes sont publiques:
| information | visible |
| Photo et pseudo | |
| Badge vérifié | |
| Bio | |
| Nombre abonnés | |
| Nombre contenus | |
| Durée totale créée | |
| Écoutes totales | |
Scénario: Informations privées non visibles
Étant donné que l'utilisateur consulte un profil créateur
Alors les informations suivantes sont privées:
| information | visible |
| Liste des abonnés | |
| Revenus | |
| Localisation précise | |
| Email | |
Scénario: Dashboard créateur avec métriques privées
Étant donné que le créateur "@paris_stories" consulte son propre dashboard
Quand la page statistiques est affichée
Alors les métriques suivantes sont accessibles:
| métrique | type |
| Taux complétion moyen | 78% |
| Évolution abonnés | Graphique |
| Écoutes par contenu | Tableau |
| Revenus | Dashboard |
| Taux conversion Premium | Pourcentage |
| Démographie (âge/zone) | Agrégée |
Scénario: Graphique d'évolution des abonnés
Étant donné que le créateur consulte son dashboard
Quand il sélectionne la période "30 jours"
Alors un graphique d'évolution des abonnés est affiché
Et les périodes disponibles sont:
| période |
| 30j |
| 90j |
| 1 an |
Scénario: Tableau détaillé des écoutes par contenu
Étant donné un créateur avec 10 contenus publiés
Quand il consulte le tableau des performances
Alors chaque contenu affiche:
| métrique | exemple |
| Titre | Balade |
| Écoutes totales | 2300 |
| Écoutes complètes >80% | 1840 |
| Taux complétion | 80% |
| Likes | 420 |
| Partages | 56 |
# 15.2.3 - Badge vérifié
Scénario: Affichage du badge vérifié
Étant donné un créateur vérifié "@paris_stories"
Quand son profil est affiché
Alors le badge bleu "" est accolé au pseudo
Et un tooltip "Compte vérifié" s'affiche au survol
Scénario: Badge vérifié visible partout
Étant donné un créateur vérifié "@paris_stories"
Alors le badge "" est affiché dans:
| emplacement |
| Page profil |
| Player en lecture |
| Résultats de recherche|
| Notifications |
Plan du Scénario: Attribution automatique du badge selon critères
Étant donné un créateur avec <critère>
Quand les conditions sont validées
Alors le badge vérifié est attribué <automatique>
Exemples:
| critère | automatique |
| KYC Mangopay validé | Oui |
| 10K abonnés + compte >6 mois | Oui |
| Célébrité / Média officiel | Manuel |
Scénario: Attribution automatique via KYC
Étant donné un créateur qui complète son KYC Mangopay
Quand les documents sont validés
Alors le badge vérifié est attribué automatiquement
Et une notification "Votre compte est maintenant vérifié " est envoyée
Scénario: Attribution automatique à 10K abonnés
Étant donné un créateur avec 9999 abonnés et un compte de 7 mois
Quand il atteint 10000 abonnés
Alors le badge vérifié est attribué automatiquement
Et une notification de félicitations est envoyée
Scénario: Demande manuelle de vérification (célébrité)
Étant donné un créateur reconnu publiquement
Quand il soumet le formulaire de demande de vérification
Alors une requête est créée pour l'équipe RoadWave
Et l'équipe vérifie l'identité sous 48-72h
Et le badge est attribué si validation réussie
Scénario: Retrait du badge en cas de suspension
Étant donné un créateur vérifié avec le badge ""
Quand sa monétisation est suspendue
Alors le badge vérifié est retiré temporairement
Et le badge est restauré après levée de la suspension
Scénario: Retrait définitif du badge pour strikes multiples
Étant donné un créateur vérifié avec 3 strikes actifs
Quand un 4ème strike est appliqué (ban)
Alors le badge vérifié est retiré définitivement
Et le compte est banni
Scénario: Retrait du badge pour usurpation d'identité
Étant donné un créateur vérifié qui usurpe l'identité d'une célébrité
Quand la fraude est détectée
Alors le badge est retiré immédiatement
Et le compte est banni
Et une enquête est ouverte
# Cas d'erreur et limites
Scénario: Profil créateur supprimé
Étant donné qu'un utilisateur tente d'accéder à "@deleted_user"
Quand la page est chargée
Alors un message "Ce profil n'existe pas ou a été supprimé" s'affiche
Scénario: Blocage d'un créateur
Étant donné que l'utilisateur bloque le créateur "@spam_account"
Quand l'utilisateur consulte son flux de recommandations
Alors aucun contenu de "@spam_account" n'est affiché
Et le créateur n'apparaît plus dans les recherches
Scénario: Déblocage d'un créateur
Étant donné que l'utilisateur a bloqué "@paris_stories"
Quand il accède à ses paramètres "Comptes bloqués"
Et qu'il débloque "@paris_stories"
Alors les contenus du créateur réapparaissent dans les recommandations
Scénario: Signalement d'un profil pour spam
Étant donné que l'utilisateur signale le profil "@spam_account"
Quand il sélectionne la raison "Spam"
Alors le signalement est envoyé à la modération
Et un message de confirmation s'affiche
Et le profil reste visible jusqu'à décision de modération
Scénario: Signalement pour usurpation d'identité
Étant donné que l'utilisateur signale le profil "@fake_celebrity"
Quand il sélectionne "Usurpation d'identité"
Et qu'il fournit une preuve
Alors le signalement est priorisé (priorité HAUTE)
Et l'équipe modération traite sous 24h