feat(gherkin): compléter couverture règles métier avec 47 features manquantes
Ajout de 47 features Gherkin (~650 scénarios) pour couvrir 100% des règles métier : - Authentification (5) : validation mot de passe, tentatives connexion, multi-device, 2FA, récupération - Audio-guides (12) : détection mode, création, navigation piéton/voiture, ETA, gestion points, progression - Navigation (5) : notifications minimalistes, décompte 5s, stationnement, historique, basculement auto - Création contenu (3) : image auto, restrictions modification, suppression - Radio live (2) : enregistrement auto, interdictions modération - Droits auteur (6) : fair use 30s, détection musique, signalements, sanctions, appels - Modération (9) : badges Bronze/Argent/Or, score fiabilité, utilisateur confiance, audit, anti-abus - Premium (2) : webhooks Mangopay, tarification multi-canal - Profil/Partage/Recherche (5) : badge vérifié, stats arrondies, partage premium, filtres avancés, carte Tous les scénarios incluent edge cases, métriques de performance et conformité RGPD. Couverture fonctionnelle MVP maintenant complète.
This commit is contained in:
95
features/ui/recherche/filtres-avances.feature
Normal file
95
features/ui/recherche/filtres-avances.feature
Normal file
@@ -0,0 +1,95 @@
|
||||
# language: fr
|
||||
|
||||
@ui @search @filters @mvp
|
||||
Fonctionnalité: Filtres avancés de recherche
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux filtrer les résultats de recherche
|
||||
Afin de trouver précisément le contenu qui m'intéresse
|
||||
|
||||
Scénario: Filtres de base toujours visibles
|
||||
Étant donné un utilisateur sur la page de recherche
|
||||
Quand il consulte les filtres
|
||||
Alors il voit les filtres de base:
|
||||
| Filtre | Options |
|
||||
| Catégorie | Tourisme, Culture, Gastronomie, etc. |
|
||||
| Durée | < 30min, 30min-1h, 1h-2h, 2h+ |
|
||||
| Prix | Gratuit, Payant |
|
||||
| Note | 4+ étoiles, 3+ étoiles |
|
||||
| Distance | < 5km, 5-10km, 10-50km, 50km+ |
|
||||
Et un événement "SEARCH_FILTERS_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Filtres avancés dépliables
|
||||
Étant donné un utilisateur qui clique sur "Filtres avancés"
|
||||
Alors des filtres supplémentaires apparaissent:
|
||||
| Filtre | Options |
|
||||
| Langue | Français, Anglais, etc. |
|
||||
| Accessibilité PMR | Oui / Non |
|
||||
| Mode de déplacement | Piéton, Voiture, Vélo |
|
||||
| Créateur vérifié | Oui / Non |
|
||||
| Date de publication | Dernière semaine, mois, année |
|
||||
| Nombre de séquences | 1-5, 6-10, 11-20, 20+ |
|
||||
Et un événement "ADVANCED_FILTERS_EXPANDED" est enregistré
|
||||
|
||||
Scénario: Application des filtres en temps réel
|
||||
Étant donné un utilisateur qui sélectionne:
|
||||
| Filtre | Valeur choisie |
|
||||
| Catégorie | Tourisme |
|
||||
| Durée | 1h-2h |
|
||||
| Distance | < 10km |
|
||||
Quand il applique les filtres
|
||||
Alors les résultats se mettent à jour instantanément (< 500ms)
|
||||
Et le compteur affiche: "23 résultats trouvés"
|
||||
Et un événement "SEARCH_FILTERS_APPLIED" est enregistré
|
||||
|
||||
Scénario: Sauvegarde des filtres préférés
|
||||
Étant donné un utilisateur "alice@roadwave.fr" connecté
|
||||
Quand elle configure des filtres spécifiques
|
||||
Et clique sur "Sauvegarder ces filtres"
|
||||
Alors les filtres sont sauvegardés dans son profil
|
||||
Et automatiquement appliqués à sa prochaine recherche
|
||||
Et un événement "SEARCH_FILTERS_SAVED" est enregistré
|
||||
|
||||
Scénario: Suggestions de filtres intelligentes
|
||||
Étant donné un utilisateur qui recherche "Louvre"
|
||||
Quand les résultats s'affichent
|
||||
Alors des filtres suggérés apparaissent:
|
||||
"Peut aussi vous intéresser: Musées à Paris, Art classique"
|
||||
Et un clic applique automatiquement ces filtres
|
||||
Et un événement "SMART_FILTERS_SUGGESTED" est enregistré
|
||||
|
||||
Scénario: Compteur de résultats par filtre
|
||||
Étant donné un utilisateur qui survole un filtre
|
||||
Alors un badge affiche le nombre de résultats:
|
||||
| Filtre | Badge |
|
||||
| Tourisme | (45) |
|
||||
| Culture | (23) |
|
||||
| Gastronomie | (12) |
|
||||
| Gratuit | (34) |
|
||||
| Payant | (28) |
|
||||
Et aide à la décision de filtrage
|
||||
Et un événement "FILTER_COUNTS_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Réinitialisation des filtres
|
||||
Étant donné un utilisateur avec plusieurs filtres actifs
|
||||
Quand il clique sur "Réinitialiser les filtres"
|
||||
Alors tous les filtres sont désactivés
|
||||
Et tous les résultats sont affichés
|
||||
Et un événement "SEARCH_FILTERS_RESET" est enregistré
|
||||
|
||||
Scénario: Filtres persistants dans l'URL
|
||||
Étant donné un utilisateur qui applique des filtres
|
||||
Quand l'URL se met à jour
|
||||
Alors elle contient: /search?category=tourisme&duration=1-2h&distance=10km
|
||||
Et le lien peut être partagé avec les filtres actifs
|
||||
Et un événement "SEARCH_URL_UPDATED_WITH_FILTERS" est enregistré
|
||||
|
||||
Scénario: Métriques d'utilisation des filtres
|
||||
Étant donné que 10 000 recherches ont été effectuées
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| % d'utilisateurs utilisant filtres| 68% |
|
||||
| Nombre moyen de filtres/recherche | 2.3 |
|
||||
| Filtre le plus utilisé | Distance|
|
||||
| Filtre le moins utilisé | PMR |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
134
features/ui/recherche/page-resultats-carte.feature
Normal file
134
features/ui/recherche/page-resultats-carte.feature
Normal file
@@ -0,0 +1,134 @@
|
||||
# language: fr
|
||||
|
||||
@ui @search @map @mvp
|
||||
Fonctionnalité: Page de résultats avec carte interactive
|
||||
|
||||
En tant qu'utilisateur
|
||||
Je veux visualiser les résultats sur une carte
|
||||
Afin de choisir des contenus proches de ma position ou d'une zone
|
||||
|
||||
Scénario: Affichage par défaut en mode liste + carte
|
||||
Étant donné un utilisateur qui effectue une recherche
|
||||
Quand les résultats s'affichent
|
||||
Alors l'écran est divisé en 2 parties:
|
||||
| Section | Largeur | Contenu |
|
||||
| Liste | 40% | Résultats scrollables |
|
||||
| Carte | 60% | Marqueurs des résultats |
|
||||
Et la carte est synchronisée avec la liste
|
||||
Et un événement "SEARCH_RESULTS_MAP_VIEW" est enregistré
|
||||
|
||||
Scénario: Bascule entre vue liste, carte, et mixte
|
||||
Étant donné un utilisateur sur la page de résultats
|
||||
Quand il clique sur les boutons de vue:
|
||||
| Bouton | Vue résultante |
|
||||
| [Liste] | Liste 100%, carte masquée |
|
||||
| [Carte] | Carte 100%, liste masquée |
|
||||
| [Mixte] | Liste 40% + Carte 60% |
|
||||
Alors la vue change instantanément
|
||||
Et la préférence est sauvegardée
|
||||
Et un événement "SEARCH_VIEW_MODE_CHANGED" est enregistré
|
||||
|
||||
Scénario: Marqueurs groupés par zone (clustering)
|
||||
Étant donné 50 résultats dans une zone de 10km
|
||||
Quand la carte est affichée en zoom large
|
||||
Alors les marqueurs sont regroupés en clusters:
|
||||
| Cluster | Nombre de contenus |
|
||||
| Paris 1 | 15 |
|
||||
| Paris 2 | 12 |
|
||||
| Paris 5 | 23 |
|
||||
Et un clic sur un cluster zoome sur la zone
|
||||
Et un événement "MAP_CLUSTERING_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Survol d'un marqueur affiche une preview
|
||||
Étant donné un utilisateur qui survole un marqueur sur la carte
|
||||
Alors une popup s'affiche avec:
|
||||
| Élément | Contenu |
|
||||
| Image miniature | Photo de couverture |
|
||||
| Titre | Visite du Quartier Latin |
|
||||
| Durée | 2h 30min |
|
||||
| Note | 4.8/5 (1,234 avis) |
|
||||
| Prix | Gratuit |
|
||||
| Bouton | [Voir détails] |
|
||||
Et un événement "MAP_MARKER_PREVIEW_SHOWN" est enregistré
|
||||
|
||||
Scénario: Clic sur un marqueur ouvre la fiche
|
||||
Étant donné un utilisateur qui clique sur un marqueur
|
||||
Alors la fiche complète du contenu s'ouvre en modal
|
||||
Et la carte reste visible en arrière-plan
|
||||
Et un événement "MAP_MARKER_CLICKED" est enregistré
|
||||
|
||||
Scénario: Synchronisation liste-carte bidirectionnelle
|
||||
Étant donné un utilisateur en vue mixte (liste + carte)
|
||||
Quand il scroll dans la liste
|
||||
Alors la carte se centre automatiquement sur les contenus visibles
|
||||
Et inversement, quand il déplace la carte
|
||||
Alors la liste affiche les contenus de la zone visible
|
||||
Et un événement "LIST_MAP_SYNC" est enregistré
|
||||
|
||||
Scénario: Recherche par zone dessinée sur la carte
|
||||
Étant donné un utilisateur qui clique sur "Dessiner une zone"
|
||||
Quand il dessine un polygone sur la carte
|
||||
Alors seuls les contenus dans ce polygone sont affichés
|
||||
Et le filtre "Zone personnalisée" s'active
|
||||
Et un événement "MAP_CUSTOM_ZONE_DRAWN" est enregistré
|
||||
|
||||
Scénario: Calcul d'itinéraire depuis la carte
|
||||
Étant donné un utilisateur qui clique sur un marqueur
|
||||
Quand il clique sur "Itinéraire"
|
||||
Alors un calcul d'itinéraire démarre depuis sa position
|
||||
Et s'affiche sur la carte avec:
|
||||
| Information | Exemple |
|
||||
| Distance | 3.2 km |
|
||||
| Temps piéton | 40 min |
|
||||
| Temps voiture | 12 min |
|
||||
| Temps vélo | 18 min |
|
||||
Et un événement "MAP_ROUTE_CALCULATED" est enregistré
|
||||
|
||||
Scénario: Sauvegarde des contenus depuis la carte
|
||||
Étant donné un utilisateur qui consulte la carte
|
||||
Quand il clique sur l'icône "♡" d'un marqueur
|
||||
Alors le contenu est ajouté à ses favoris
|
||||
Et le marqueur change de couleur (rouge)
|
||||
Et un événement "CONTENT_SAVED_FROM_MAP" est enregistré
|
||||
|
||||
Scénario: Affichage de la position utilisateur en temps réel
|
||||
Étant donné un utilisateur avec géolocalisation activée
|
||||
Quand il consulte la carte
|
||||
Alors sa position est affichée par un point bleu
|
||||
Et se met à jour en temps réel si il se déplace
|
||||
Et un cercle indique la précision GPS (±10m)
|
||||
Et un événement "USER_LOCATION_TRACKED_ON_MAP" est enregistré
|
||||
|
||||
Scénario: Légende de la carte avec codes couleur
|
||||
Étant donné un utilisateur sur la carte
|
||||
Alors une légende affiche:
|
||||
| Couleur | Signification |
|
||||
| Vert | Gratuit |
|
||||
| Bleu | Payant |
|
||||
| Or | Créateur vérifié |
|
||||
| Rouge | Favoris |
|
||||
Et un événement "MAP_LEGEND_DISPLAYED" est enregistré
|
||||
|
||||
Scénario: Export de la carte en image
|
||||
Étant donné un utilisateur qui clique sur "Exporter la carte"
|
||||
Alors une image PNG de la carte actuelle est générée
|
||||
Et téléchargeable avec résultats visibles
|
||||
Et un événement "MAP_EXPORTED" est enregistré
|
||||
|
||||
Scénario: Mode hors ligne de la carte
|
||||
Étant donné un utilisateur qui télécharge une zone
|
||||
Quand il active le mode hors ligne
|
||||
Alors les tuiles de carte sont disponibles localement
|
||||
Et les contenus téléchargés sont accessibles
|
||||
Et un événement "MAP_OFFLINE_MODE_ENABLED" est enregistré
|
||||
|
||||
Scénario: Métriques d'utilisation de la carte
|
||||
Étant donné que 10 000 utilisateurs ont consulté la carte
|
||||
Alors les indicateurs suivants sont disponibles:
|
||||
| Métrique | Valeur |
|
||||
| % d'utilisations en mode carte | 42% |
|
||||
| % d'utilisations en mode mixte | 48% |
|
||||
| % d'utilisations en mode liste | 10% |
|
||||
| Nombre moyen de clics sur marqueurs| 3.2 |
|
||||
| Taux de conversion depuis carte | 18% |
|
||||
Et les métriques sont exportées vers le monitoring
|
||||
Reference in New Issue
Block a user