Test Checklist¶
Manual test checklist for ApexLab V2. Run on Windows after dotnet build / Release executable.
Additional test documents
docs/UI_TEST_REPORT.md— UI review document (visual fidelity, DPI scaling, interaction states)docs/INTERNAL_TEST_REPORT.md— Internal testing report template
Checklist tests manuels — ApexLab V2¶
À exécuter sur Windows après dotnet build / exécutable Release. Cocher au fur et à mesure.
Prérequis V2 : le serveur API doit être lancé localement (voir SimCopilot.Api/docs/DEPLOYMENT_WINDOWS.md).
ApiBaseUrl client : http://localhost:5000 — à configurer dans Paramètres → Compte.
A. Sans jeu (rapide) — tests V1 de base¶
- [ ] Lancer l'app ; barre de statut « Prêt », version affichée en bas à droite.
- [ ] Accueil → Session de démonstration (ou Ctrl+Shift+D) : session chargée, ≥ 1 tour, courbes vitesse / gaz / frein / delta visibles.
- [ ] Changer Réf. et Courant dans les listes : les graphes se mettent à jour.
- [ ] Double-clic sur une ligne du tableau Tours : le tour courant change et l'analyse se rafraîchit.
- [ ] Liste Insights : au moins une entrée cohérente (ou message clair si données insuffisantes).
- [ ] Colonne gauche → Checklist tests… : ce fichier s'ouvre dans l'éditeur / visionneur par défaut.
B. Catalogue et métadonnées SQLite¶
- [ ] Première installation (base vide) : une session démo apparaît dans la liste après premier lancement (fichier créé sous
%LocalAppData%\ApexLab\Sessions\). - [ ] Accueil : sous-titre de la dernière session affiche tours et météo (si présente en base).
- [ ] Session → Bibliothèque : colonnes Tours et Météo renseignées.
- [ ] Ouvrir une session puis revenir à l'accueil : les infos catalogue restent cohérentes.
C. Bibliothèque de sessions¶
- [ ] Session → Bibliothèque : liste, recherche, filtre jeu si utilisé.
- [ ] Paramètres : liste pilote B — chargement d'une autre session du catalogue.
D. LMU (plugin mémoire partagée requis)¶
- [ ] Connecter mémoire partagée : pas d'erreur bloquante si jeu + plugin OK.
- [ ] Enregistrer, compléter au moins un tour, Arrêter : session en mémoire avec N tours, analyse dispo.
- [ ] Après chargement d'une session LMU : bandeau d'analyse affiche LMU / rF2 et, si dispo, températures / pluie / humidité piste.
- [ ] Vérifier que le fichier créé apparaît sous
ApexLab\Sessionset dans le catalogue.
D-bis. Carte / contour OSM¶
- [ ] Bandeau Contour OSM : message cohérent (cache, aligné, téléchargement).
- [ ] Pan clic droit sur la carte : déplacement naturel ; zoom molette.
E. Assetto Corsa (UDP)¶
- [ ] Paramètres : sous « Assetto Corsa UDP », le libellé Bêta est visible.
- [ ] Renseigner hôte/port, Connecter avec jeu en cours et UDP activé.
- [ ] Stop : arrêt propre.
E-bis. Affichage Δ live¶
- [ ] Cocher Masquer l'encart Δ sur la carte → l'overlay disparaît en mode analyse.
- [ ] Cocher Masquer le Δ dans la barre de statut → le bloc Δ / prédiction disparaît.
F. Résilience locale¶
- [ ] Charger une session avec deux tours très différents en longueur : un insight d'avertissement explique la situation, pas de crash silencieux.
G. Build automatisé¶
- [ ]
dotnet test SimCopilot.sln -c Release: tous les tests verts (≥ 169). - [ ] CI GitHub (
windows-latest) : workflow CI exécutedotnet build+dotnet test.
H. Authentification V2 (nécessite API locale)¶
Prérequis : API démarrée, Google ou Discord OAuth configuré dans .env.
- [ ] Bouton Connexion visible dans la barre nav quand déconnecté.
- [ ] Clic Connexion → l'overlay
LoginViews'affiche dans la fenêtre principale avec boutons Google / Discord / Steam / Email. - [ ] Clic Google : navigateur système s'ouvre sur la page de consentement OAuth.
- [ ] Autorisation réussie :
LoginViewse masque, UserChip (avatar + nom) apparaît dans la nav. - [ ] Redémarrage de l'app : l'état de connexion est restauré automatiquement (token persisté via DPAPI).
- [ ] Token expiré simulé (attendre 60 min, ou manipuler l'heure système) : rafraîchissement silencieux, pas de déconnexion.
- [ ] Clic sur le UserChip → menu avec Déconnexion ; clic → retour au bouton Connexion.
- [ ] Déconnexion : revérifier que le token est bien révoqué côté serveur (
GET /v1/auth/validatedoit retourner 401).
I. Synchronisation de sessions (SyncService)¶
Prérequis : connecté (section H réussie).
- [ ] Ouvrir ou enregistrer une session : la barre de statut affiche brièvement une icône de sync, puis confirme.
- [ ] Même session ouverte une deuxième fois : pas de double upload (idempotency —
client_session_id). - [ ] Couper le réseau (désactiver l'adaptateur ou bloquer le port 5000 dans le pare-feu) ; ouvrir une session → la sync échoue silencieusement.
- [ ] Rétablir le réseau : la queue se vide, la session remonte.
- [ ] Sans connexion au compte : aucun appel réseau n'est tenté.
- [ ] Vérification API :
GET http://localhost:5000/v1/sessionsavec Bearer token → la session uploadée apparaît.
J. Classements (Leaderboards)¶
Prérequis : au moins une session uploadée avec des tours valides (quality ≥ 0.8).
- [ ] Onglet Classements : liste des jeux disponibles dans le filtre.
- [ ] Sélectionner un jeu → dropdown des circuits se peuple.
- [ ] Sélectionner un circuit → tableau des temps se charge.
- [ ] Temps de lap affiché au format M:SS.mmm.
- [ ] Colonne Rang commence à 1.
- [ ] Soumettre un tour via API avec quality < 0.8 : réponse
422 Unprocessable Entity. - [ ] Soumettre un meilleur tour : le rang se met à jour (une seule ligne par pilote).
- [ ] Soumettre un tour moins bon : pas de changement de rang, réponse
200 { "improved": false }. - [ ] Consultation du classement sans être connecté : accessible en lecture (200 public).
- [ ] Filtre par véhicule (si implémenté dans l'UI) : seules les entrées du véhicule sélectionné apparaissent.
K. Coach IA¶
Prérequis : ANTHROPIC_API_KEY configuré dans .env, session ouverte avec analyse.
- [ ] Onglet Coach visible dans le panneau d'analyse.
- [ ] Clic Analyser → requête envoyée, indicateur de chargement visible.
- [ ] Réponse en langage naturel reçue, affichée dans le panneau.
- [ ] Zone de saisie libre : poser une question → réponse contextuelle reçue.
- [ ] Sans
ANTHROPIC_API_KEY: message d'erreur clair, pas de crash. - [ ] Sans connexion au compte : fonctionnalité désactivée ou message d'invitation à se connecter.
L. Fil d'activité (Feed)¶
Prérequis : connecté.
- [ ] Onglet Accueil → section Actualité : événements listés après une session uploadée ou un classement soumis.
- [ ] Les entrées affichent titre, sous-titre, et date.
- [ ] Défilement infini ou pagination fonctionne.
- [ ] Les entrées de plus de 90 jours ne sont pas visibles (appliqué côté serveur).
M. Succès (Achievements)¶
- [ ] Section Succès dans le panneau profil : liste des succès débloqués.
- [ ] Uploader une première session → succès Première session synchronisée débloqué (ou équivalent dans le catalogue).
- [ ] Catalogue complet accessible :
GET /v1/achievements/catalog.
N. SharePack cloud¶
Prérequis : connecté.
- [ ] Exporter → SharePack Cloud (ou équivalent UI) : fichier uploadé, confirmation reçue.
- [ ]
GET /v1/sharepacks: le pack apparaît dans la liste. - [ ] Télécharger le pack depuis l'API : fichier ZIP intact et ouvert correctement dans le client.
- [ ] Supprimer le SharePack via l'UI (ou
DELETE /v1/sharepacks/{id}) : n'apparaît plus dans la liste. - [ ] Un autre utilisateur ne peut pas supprimer un SharePack qui ne lui appartient pas (404 ou 403).
O. Profil et RGPD¶
- [ ]
GET /v1/profile/me: profil retourné avecdisplayName,email,createdAt. - [ ]
PATCH /v1/profile/me: changer le nom d'affichage → réflété dans l'UI au prochain chargement. - [ ]
GET /v1/profile/me/export: téléchargement d'un fichier JSON contenant toutes les données de l'utilisateur. - [ ]
DELETE /v1/profile/me: confirmation demandée → compte et toutes les données supprimées ; reconnexion impossible avec les mêmes credentials (nouvel enregistrement).
P. Sécurité et rate limiting¶
Ces tests s'effectuent directement contre l'API (Postman, Invoke-RestMethod, etc.).
- [ ] Auth rate limiting : 11 tentatives de login en 5 min → la 11ème retourne
429 Too Many Requests. - [ ] Upload rate limiting : 31 uploads en 1 min → le 31ème retourne
429. - [ ] Refresh token rotation : utiliser un refresh token déjà consommé →
401 Unauthorized(pas de réutilisation possible). - [ ] Redirect URI check : appeler
GET /v1/auth/google?redirect_uri=https://evil.com→400 Bad Request(open redirect bloqué). - [ ] Code échange one-time : appeler
POST /v1/auth/exchangedeux fois avec le même code → la deuxième retourne400. - [ ] Token JWT dans l'URL : vérifier que le callback OAuth redirige avec
?code=(court code temporaire), pas?token=(JWT brut).
Q. Infrastructure (API en production locale)¶
- [ ]
GET /health→{ "status": "Healthy" }. - [ ]
GET /health/ready→ base de données Healthy. - [ ]
GET /health/live→200 OK. - [ ]
GET /metrics→ sortie Prometheus (lignes# HELPet# TYPE). - [ ] Redémarrer l'API avec des jobs
track_processing_jobsen statutprocessing→ les jobs sont remis enpendingau démarrage (pas de stuck jobs). - [ ]
DataRetentionService: vérifier dans les logs qu'il s'exécute après 2 min de démarrage.
R. Build et CI¶
- [ ]
dotnet build SimCopilot.sln -c Release: 0 erreur, 0 avertissement. - [ ]
dotnet build SimCopilot.Api/src/SimCopilot.Api/SimCopilot.Api.csproj -c Release: 0 erreur, 0 avertissement. - [ ]
dotnet test SimCopilot.sln -c Release: tous les tests verts. - [ ] CI GitHub (API repo) : workflow
ci.yml— build + image Docker.
Révision V2 — Avril 2026. À mettre à jour quand de nouveaux connecteurs ou fonctionnalités seront ajoutés.
S. Onboarding V2.5¶
Prérequis : HasSeenOnboarding = false dans %LocalAppData%\ApexLab\settings.json (supprimer le fichier ou éditer la valeur).
- [ ] Après connexion réussie, l'overlay d'onboarding apparaît (pas l'écran Home).
- [ ] Étape 0 visible : logo ApexLab, titre « Bienvenue dans ApexLab », texte corps + sous-titre.
- [ ] Bouton « ← Précédent » masqué à l'étape 0.
- [ ] Bouton « Suivant → » affiche l'étape 1 ; les points de progression se mettent à jour.
- [ ] Navigation Suivant/Précédent fonctionne sur toutes les étapes ; les points reflètent l'étape courante.
- [ ] À l'étape 4 : bouton « Suivant → » devient « Commencer » ; bouton « Passer » disparaît.
- [ ] Clic « Passer » depuis n'importe quelle étape (0–3) : overlay masqué, navigation vers l'Accueil,
HasSeenOnboarding = truedans settings.json. - [ ] Clic « Commencer » à l'étape 4 : même comportement que « Passer ».
- [ ] Deuxième lancement avec le même compte (
HasSeenOnboarding = true) : onboarding N'apparaît PAS. - [ ] Déconnexion puis reconnexion (
HasSeenOnboarding = true) : onboarding ne réapparaît pas.
V2.5 Screen Completion¶
Home¶
- [ ] Logged-in user sees hero greeting with their name and progression summary
- [ ] Logged-out user: hero zone is hidden (no blank space)
- [ ] Last session card shows the most recent session's track and vehicle
- [ ] Clicking the last session card (anywhere, not just the button) opens that session
- [ ] Three quick-action buttons navigate to Mes Sessions, Classements, Mon Pilote
- [ ] With no sessions: last-session card and quick actions are still displayed (quick actions always show)
Leaderboards¶
- [ ] Filters bar shows available tracks loaded from the API
- [ ] Changing the track filter reloads the leaderboard
- [ ] Authenticated user's row is highlighted in blue in the list
- [ ] Sticky user row is pinned below the header when scrolling
- [ ] Clicking any row updates the comparison snapshot header
- [ ] Rank card shows correct rank, total count, and gap to leader
- [ ] When user has no time on this track: "Non classé" state and submit CTA
- [ ] Network error: "Impossible de charger le classement" with retry behavior
- [ ] Context insight appears when PilotAnalysisService has completed
My Pilot¶
- [ ] Loading state shows "Calcul en cours…" while analysis runs
- [ ] With < 3 sessions: "Analyse disponible après 3 sessions" message
- [ ] Pilot card shows correct name, level, and subtitle
- [ ] Four skill bars appear with correct colors (green ≥75%, blue 50–74%, orange 25–49%, red <25%)
- [ ] Trend arrows reflect improvement/regression vs previous sessions
- [ ] Critical weakness card shows the most impactful recurring issue
- [ ] Goal card shows "Définir un objectif" when no goal is set
- [ ] Goal progress bar advances when a new session with a better lap is imported
- [ ] "Objectif atteint !" shown in green when current best reaches target