Skip to content

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\Sessions et 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écute dotnet 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 LoginView s'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 : LoginView se 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/validate doit 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/sessions avec 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é avec displayName, 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.com400 Bad Request (open redirect bloqué).
  • [ ] Code échange one-time : appeler POST /v1/auth/exchange deux fois avec le même code → la deuxième retourne 400.
  • [ ] 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/live200 OK.
  • [ ] GET /metrics → sortie Prometheus (lignes # HELP et # TYPE).
  • [ ] Redémarrer l'API avec des jobs track_processing_jobs en statut processing → les jobs sont remis en pending au 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 = true dans 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