Documentation

Guide Testeur / QA — Pixel Night

Tests automatisés

Lancer les tests

pnpm test              # Run all (once)
pnpm test --watch      # Mode watch
pnpm test --ui         # Interface Vitest
pnpm test --coverage   # Couverture de code

Suite de tests unitaires

FichierTestsCe qui est couvert
__tests__/lib/tmdb.test.ts8tmdbPoster(), tmdbBackdrop(), tmdbHeaders()
__tests__/lib/duration.test.ts30+parseDurationToMinutes(), formatDurationFromMinutes(), formats divers
__tests__/lib/encryption.test.ts9encrypt(), decrypt(), round-trips, mauvaise clé, tampering
__tests__/lib/tmdb-token.test.ts7getActiveTmdbToken() — env var, DB fallback, erreurs decrypt/Supabase
__tests__/lib/theme-catalog.test.ts6Intégrité du catalogue, genre_ids valides, tri TMDB_GENRE_LIST
__tests__/api/finalize-theme.test.tsLogique de départage à égalité (tirage au sort)
__tests__/api/finalize-film.test.ts4Logique de départage à égalité
__tests__/api/exclusion.test.ts6Calcul excluded_until pour les 3 modes d'exclusion
__tests__/api/films-curation.test.ts5Vote-lock : autoriser la curation si 0 votes, bloquer sinon

Plan de test manuel

Prérequis

  • Application déployée (ou pnpm dev local)
  • Compte organisateur créé
  • Token TMDb configuré (GET /api/tmdb/status{ configured: true })
  • Au moins un thème dans le catalogue

Module 1 — Authentification

IDScénarioActionRésultat attendu
AUTH-01Connexion valideSaisir email + mot de passe correctsRedirect /admin, toast « Connexion réussie ! »
AUTH-02Connexion échouéeMauvais mot de passeMessage d'erreur, reste sur /auth/login
AUTH-03Accès admin sans authOuvrir /admin sans sessionRedirect vers /auth/login
AUTH-04DéconnexionCliquer "Se déconnecter"Redirect /, session invalidée

Module 2 — Configuration cinéma et salles

IDScénarioActionRésultat attendu
CINE-01Affichage paramètresOuvrir /admin/parametresNom, slug, URL de partage affichés
CINE-02Modifier le nomChanger le nom, enregistrerNom mis à jour, toast succès
CINE-03Ajouter une salleCliquer "+ Ajouter une salle", nommerSalle apparaît dans la liste
CINE-04Salle avec capacitéAjouter une salle avec 50 placesCapacité affichée sur la carte
CINE-05Supprimer une salleCliquer supprimer sur une salleSalle disparaît
CINE-06Règle exclusion "jours"Sélectionner "Par jours", valeur 7Sauvegardé, thème gagnant exclu 7 jours après finalisation
CINE-07Règle exclusion "soirées"Sélectionner "Par soirées", valeur 3Thème exclu ~90 jours après finalisation
CINE-08Règle exclusion "aucune"Sélectionner "Aucune exclusion"Thème disponible immédiatement à la prochaine soirée

Module 3 — Gestion des thèmes

IDScénarioActionRésultat attendu
THEME-01Importer depuis le catalogueCliquer "Catalogue", importer "Western"Thème ajouté avec genres et mots-clés
THEME-02Catalogue masque les doublonsRé-ouvrir le catalogue"Western" ne figure plus dans la liste
THEME-03Créer thème avec genresNouveau thème, cocher "Action" et "Aventure"Badges genres affichés sur la carte
THEME-04Créer thème sans genresNouveau thème, seulement des mots-clésAucun badge genre, mots-clés affichés
THEME-05Activer / désactiverCliquer "Désactiver" sur un thèmeThème exclu des soirées suivantes

Module 4 — Création de soirée

IDScénarioActionRésultat attendu
CREA-01Cinéma avec une salleCréer une soiréeAucun sélecteur de salle affiché
CREA-02Cinéma avec plusieurs sallesCréer une soiréeSélecteur de salle affiché, première sélectionnée par défaut
CREA-03Changer de salleSélectionner une autre salleSalle mise en évidence
CREA-04Création basiqueRemplir le formulaire, sans propositionsSoirée créée en phase theme_vote
CREA-05Avec propositionsActiver "propositions", saisir "2 jours"Soirée créée, durée correctement parsée
CREA-06Durée invalideSaisir "abc" dans le champ duréeBouton "Créer" désactivé, « Format non reconnu »

Module 5 — Vote de thème

IDScénarioActionRésultat attendu
VOTE-T01Accès page publiqueOuvrir /s/{slug}Affiche les soirées du cinéma
VOTE-T02Badge salleCinéma avec plusieurs sallesBadge salle visible sur chaque soirée
VOTE-T03Premier voteCliquer sur un thèmeToast succès, bouton désactivé
VOTE-T04Double vote (même session)Re-cliquer un thèmeToast erreur « Déjà voté »
VOTE-T05Finaliser (sans égalité)Admin : cliquer "Finaliser le thème"Thème gagnant affiché, phase change
VOTE-T06Finaliser (avec égalité)Votes égaux sur 2 thèmesUn thème désigné au hasard

Module 6 — Récupération et curation des films

IDScénarioActionRésultat attendu
FILMS-01Récupérer (Découverte)Thème avec genres, cliquer "Découverte"Films récupérés, used_discover: true dans la réponse
FILMS-02Récupérer (Mots-clés)Cliquer "Mots-clés"Films récupérés depuis /search/movie
FILMS-03Thème sans genres → DécouverteThème sans genre_ids, cliquer "Découverte"Repli sur mots-clés automatique
FILMS-04Supprimer un film (avant vote)Cliquer × sur un filmFilm retiré de la liste
FILMS-05Ajouter un film (avant vote)Cliquer "Ajouter", chercher, ajouterFilm ajouté à la liste
FILMS-06Curation après voteUn participant vote, admin tente de supprimerErreur 409, modification impossible
FILMS-07Bandeau thème gagnantParticipant en phase film_voteBandeau "Thème de la soirée : …" affiché

Module 7 — Phase propositions

IDScénarioActionRésultat attendu
PROP-01Lancer les propositionsAdmin : cliquer "Lancer les propositions"Phase film_proposal, minuterie affichée
PROP-02Rechercher un filmParticipant : saisir un terme, chercherRésultats TMDb affichés
PROP-03Proposer un filmCliquer "Proposer" sur un filmFilm ajouté à la liste des propositions
PROP-043 propositions maxProposer un 4ème filmErreur « Limite atteinte »
PROP-05Film déjà proposéProposer un film déjà proposéErreur idempotente
PROP-06Clore avec propositionsAdmin : clore les propositionsFilms copiés → sp_soiree_films, phase film_vote
PROP-07Clore sans propositionAucune proposition, admin cloreRepli TMDb automatique, phase film_vote

Module 8 — Vote de film

IDScénarioActionRésultat attendu
VOTE-F01Affichage filmsOuvrir la page en film_voteFilms affichés avec poster, titre, durée
VOTE-F02Voter pour un filmCliquer sur un filmToast succès, bouton désactivé
VOTE-F03Double vote filmRe-cliquerErreur « Déjà voté »
VOTE-F04Finaliser le filmAdmin : finaliserFilm gagnant affiché, phase completed
VOTE-F05Finaliser à égalitéVotes égaux sur 2 filmsUn film désigné au hasard
VOTE-F06Exclusion après finalisationThème gagnant, règle "5 soirées"excluded_until mis à jour sur le thème

Module 9 — Résultats

IDScénarioActionRésultat attendu
RES-01Page résultatsPhase completedFilm gagnant, titre, poster affiché
RES-02Lien bande-annonceCliquer sur la bande-annonceOuverture YouTube (si disponible)
RES-03Soirée passée sur page cinémaOuvrir /s/{slug}Soirée dans "Soirées passées" avec film gagnant

Module 10 — Annulation et suppression

IDScénarioActionRésultat attendu
ANN-01Annuler une soiréeAdmin : cliquer "Annuler"Phase cancelled, badge rouge sur page publique
ANN-02Vote sur soirée annuléeParticipant tente de voterInterface en lecture seule
SUP-01SupprimerAdmin : supprimer la soiréeSoirée disparaît du dashboard

Module 11 — Configuration TMDb

IDScénarioActionRésultat attendu
TMDb-01Statut sans tokenTMDB_API_READ_ACCESS_TOKEN absent/api/tmdb/status{ configured: false }
TMDb-02Statut avec tokenTMDB_API_READ_ACCESS_TOKEN défini/api/tmdb/status{ configured: true }

Module 12 — Pages publiques

IDScénarioActionRésultat attendu
PUB-01AccueilOuvrir /Page d'accueil avec champ code cinéma
PUB-02Code invalideSaisir un slug inexistantPage → 404
PUB-03RoadmapOuvrir /roadmapPage chargée, issues GitHub affichées ou état vide
PUB-04Documentation APIOuvrir /docsPage Redoc chargée avec l'OpenAPI spec
PUB-05FooterVérifier tous les liens du footerGitHub, Docs, Roadmap, Contribuer, Crédits, Mentions légales, Confidentialité fonctionnels
PUB-06CréditsOuvrir /creditsLogo TMDb affiché, mention légale TMDb présente
PUB-07Mentions légalesOuvrir /legalPage chargée, éditeur Helixir affiché
PUB-08ConfidentialitéOuvrir /privacyPage chargée, droits RGPD et lien CNIL présents

Cas limites à tester

  • Soirée sans thème → action "Finaliser" doit retourner 400
  • Soirée sans film → action "Finaliser film" doit retourner 400
  • Finaliser thème sans vote (0 votes sur tous) → comportement cohérent
  • Réseau coupé pendant un vote → pas de vote fantôme en DB
  • Rechargement page pendant un vote en cours → état cohérent
  • Curation : supprimer tous les films → re-récupérer fonctionne
  • Thème exclu → absent de la liste des éligibles à la création de soirée suivante

Outils de test recommandés

OutilUsage
Navigateur DevTools → StorageVérifier/modifier sp_voter_id dans localStorage
curl / Insomnia / PostmanTester les routes API directement
Supabase SQL EditorVérifier l'état des tables directement
Network throttle (DevTools)Tester les états de chargement
Incognito modeSimuler un nouveau participant