Files
roadwave/features/recommendation/README.md
2026-01-31 11:45:11 +01:00

241 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tests Gherkin - Algorithme de Recommandation
Tests BDD pour la section [04-algorithme-recommandation.md](../../docs/regles-metier/04-algorithme-recommandation.md)
## Fichiers de tests
### [classification-geo.feature](classification-geo.feature)
**Couverture** : Section 2.1 des règles métier
- ✅ Classification 3 types (Géo-ancré 70%, Géo-contextuel 50%, Géo-neutre 20%)
- ✅ Choix par créateur
- ✅ Reclassification par modérateur
- ✅ Modification après publication
- ✅ Impact sur pondération algorithme
**Scénarios** : 11
---
### [scoring-recommandation.feature](scoring-recommandation.feature)
**Couverture** : Sections 2.2, 2.3, 2.4 des règles métier
- ✅ Calcul score géographique linéaire (1 - distance/200km)
- ✅ Calcul score d'intérêts (moyenne jauges tags)
- ✅ Calcul score engagement (complétion 50%, likes 30%, abonnements 20%)
- ✅ Seuil minimum 50 écoutes
- ✅ Score final combiné selon type contenu
- ✅ Bonus aléatoire 10% configurable
- ✅ Contenu viral peut être recommandé loin
- ✅ Pré-calcul 5 contenus suivants
- ✅ Recalcul si >10 km ou >10 min
**Scénarios** : 23
---
### [contenu-politique.feature](contenu-politique.feature)
**Couverture** : Section 2.5 des règles métier (MVP simplifié)
- ✅ Tag simple "Politique" sans classification gauche/droite
- ✅ Filtrage utilisateur "Masquer contenu politique"
- ✅ Par défaut tous contenus visibles
- ✅ Mode Kids filtre automatiquement le politique
- ✅ Pas d'équilibrage imposé en MVP
**Scénarios** : 13
---
### [mode-kids.feature](mode-kids.feature)
**Couverture** : Section 2.6 des règles métier
- ✅ Activation manuelle (pas automatique car âge min 13 ans)
- ✅ Filtrage contenus "Tous publics" uniquement
- ✅ Exclusion automatique contenu politique
- ✅ Pas de publicité (ou validée manuellement)
- ✅ Interface standard (pas d'UI enfant)
- ✅ Désactivation possible à tout moment
**Scénarios** : 15
---
### [declenchement-geo.feature](declenchement-geo.feature)
**Couverture** : Section 2.7 des règles métier
- ✅ Notification sonore + visuelle au passage <500m
- ✅ Délai réaction 5 secondes
- ✅ Pas d'interruption contenu en cours
- ✅ Logos différenciés (📍🏛️🍴🎭)
- ✅ Publicité uniquement entre contenus
- ✅ Gestion demi-tour (pas de répétition avant 24h)
- ✅ Rayon configurable par admin
**Scénarios** : 17
---
### [historique-reproposition.feature](historique-reproposition.feature)
**Couverture** : Section 2.8 des règles métier
- ✅ Contenu >80% jamais reproposé (sauf replayable=true)
- ✅ Contenu <10s ne pas reproposer (signal négatif)
- ✅ Contenu 10-80% reproposer avec reprise position
- ✅ Stockage illimité PostgreSQL
- ✅ Algorithme considère 100 derniers pour performance
- ✅ Export complet RGPD
**Scénarios** : 17
---
### [parametrabilite-admin.feature](parametrabilite-admin.feature)
**Couverture** : Section 2.9 des règles métier
- ✅ Dashboard admin avec tous paramètres configurables à chaud
- ✅ Validation plages de valeurs
- ✅ Aucun recalcul batch (économie CPU)
- ✅ Versioning configurations (git-like)
- ✅ Rollback 1 clic
- ✅ A/B testing avec split 50/50
- ✅ Métriques comparatives temps réel
- ✅ Graphiques évolution engagement
- ✅ Export CSV analyse externe
**Scénarios** : 17
---
### [parametrabilite-utilisateur.feature](parametrabilite-utilisateur.feature)
**Couverture** : Section 2.10 des règles métier
- ✅ 3 curseurs (Géolocalisation, Découverte, Politique)
- ✅ Profils sauvegardables (Trajet quotidien, Road trip, Enfants)
- ✅ Synchronisation multi-devices
- ✅ Auto-switch selon contexte GPS
- ✅ Blocage modification si vitesse >10 km/h
- ✅ Warning avant de prendre la route
- ✅ Limite 10 profils par utilisateur
**Scénarios** : 22
---
### [medias-traditionnels.feature](medias-traditionnels.feature)
**Couverture** : Section 2.11 des règles métier
- ✅ Compte média vérifié (badge ✓)
- ✅ Pas de validation 3 premiers contenus
- ✅ Modération a posteriori uniquement
- ✅ Formats: flash info, chroniques, éditos, reportages
- ✅ Classification âge obligatoire
- ✅ Monétisation standard (3€/1000 écoutes)
- ✅ Sponsoring direct autorisé
- ✅ Statistiques détaillées
**Scénarios** : 19
---
## Statistiques
| Métrique | Valeur |
|----------|--------|
| **Fichiers** | 9 |
| **Scénarios** | 154 |
| **Règles métier** | 100% couverture section 2 |
## Formules mathématiques testées
### Score géographique
```
score_geo = 1 - (distance_km / distance_max_km)
```
### Score intérêts
```
score_interets = moyenne(jauges_tags_correspondants)
```
### Score engagement
```
score_engagement = (taux_completion × 0.5) + (ratio_likes × 0.3) + (ratio_abonnements × 0.2)
```
### Score final
```
score_final = (score_geo × poids_geo_type)
+ (score_interets × poids_interets_type)
+ (score_engagement × 0.2)
+ bonus_aleatoire
```
## Paramètres par défaut
| Paramètre | Défaut | Plage |
|-----------|--------|-------|
| poids_geo_ancre | 0.7 | 0.5 - 1.0 |
| poids_geo_contextuel | 0.5 | 0.3 - 0.7 |
| poids_geo_neutre | 0.2 | 0.0 - 0.4 |
| poids_engagement | 0.2 | 0.0 - 0.5 |
| part_aleatoire_global | 0.1 | 0.0 - 0.3 |
| distance_max_km | 200 | 50 - 500 |
| rayon_gps_point_m | 500 | 100 - 2000 |
| seuil_min_ecoutes_engagement | 50 | 10 - 200 |
## Exécution des tests
### Tous les tests de recommandation
```bash
godog run features/recommendation/
```
### Un fichier spécifique
```bash
godog run features/recommendation/scoring-recommandation.feature
```
### Tests calculs mathématiques uniquement
```bash
godog run features/recommendation/scoring-recommandation.feature --tags=@calcul
```
## CI/CD
Ces tests sont exécutés :
- ✅ Avant chaque release
- ✅ Sur les PRs modifiant l'algorithme de recommandation
- ✅ Nightly builds (tous les tests)
## Implémentation des steps
Les steps definitions seront implémentées dans :
```
features/steps/recommendation_steps.go
```
Exemple avec calculs :
```go
func (s *RecommendationSteps) lalgorithmeCalculeLeScoreGeo(expectedScore float64) error {
actualScore := 1.0 - (s.distance / s.distanceMax)
if math.Abs(actualScore - expectedScore) > 0.01 {
return fmt.Errorf("score_geo: attendu %.2f, obtenu %.2f", expectedScore, actualScore)
}
return nil
}
```
## Prochaines étapes
1. ⏳ Implémenter les steps definitions en Go
2. ⏳ Tester les formules mathématiques avec valeurs edge cases
3. ⏳ Configurer Testcontainers pour PostgreSQL + PostGIS
4. ⏳ Tests de performance (calcul score pour 1000 contenus <100ms)
5. ⏳ Créer les Gherkin pour les 14 autres sections
---
**Statut** : ✅ Spécifications complètes
**Dernière mise à jour** : 2026-01-21