fix(socket): reject invalid game transitions server-side (#4) #30

Merged
Reliodas merged 1 commit from fix/4-reject-invalid-transitions into develop 2026-06-24 02:19:23 +00:00
Owner

Closes #4.

Renforce le rejet des transitions de jeu invalides dans la couche métier (l'UI n'est plus un garde-fou de sécurité).

Changements

  • round1.start refuse tout statut ≠ lobby et renvoie un résultat → un second start ne peut plus relancer la manche en conservant les scores.
  • player:answer rejette un answerId absent de la question courante.
  • round2.selectCategory refuse un playOrder vide ou une catégorie sans questions ; categoryCorrect ne crédite plus un candidat redevenu spectateur.
  • Toutes les transitions de manche 1 renvoient succès/échec ; une transition refusée ne déclenche aucune diffusion.

Tests

  • Unitaires (round1/round2) + Jest + intégration Socket.IO : transitions valides/invalides, double action, statut invalide, answerId invalide, catégorie vide, picker spectateur.
  • node:test 119 pass / 1 skip, Jest 13 pass, couverture c8 au-dessus des planchers (round1.ts 100 %).
  • docs/Implémentation.md mis à jour.

Critères d'acceptation

  • Valider chaque transition dans la couche métier
  • Fonctions de transition cohérentes (succès/échec)
  • Empêcher doubles actions et actions en mauvais statut
  • Tester transitions valides et invalides des deux manches
  • Ne pas dépendre de la visibilité des boutons

🤖 Generated with Claude Code

Closes #4. Renforce le rejet des transitions de jeu invalides dans la couche métier (l'UI n'est plus un garde-fou de sécurité). ## Changements - `round1.start` refuse tout statut ≠ `lobby` et renvoie un résultat → un second `start` ne peut plus relancer la manche en conservant les scores. - `player:answer` rejette un `answerId` absent de la question courante. - `round2.selectCategory` refuse un `playOrder` vide ou une catégorie sans questions ; `categoryCorrect` ne crédite plus un candidat redevenu spectateur. - Toutes les transitions de manche 1 renvoient succès/échec ; une transition refusée ne déclenche aucune diffusion. ## Tests - Unitaires (round1/round2) + Jest + intégration Socket.IO : transitions valides/invalides, double action, statut invalide, `answerId` invalide, catégorie vide, picker spectateur. - node:test 119 pass / 1 skip, Jest 13 pass, couverture c8 au-dessus des planchers (round1.ts 100 %). - `docs/Implémentation.md` mis à jour. ## Critères d'acceptation - [x] Valider chaque transition dans la couche métier - [x] Fonctions de transition cohérentes (succès/échec) - [x] Empêcher doubles actions et actions en mauvais statut - [x] Tester transitions valides et invalides des deux manches - [x] Ne pas dépendre de la visibilité des boutons 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(socket): reject invalid game transitions server-side
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pr/woodpecker Pipeline failed
7e972041b1
Enforce game transitions in the business layer instead of relying on
client-side button visibility (#4).

- round1.start refuses any status other than lobby and returns a result,
  so a repeated start can no longer reset the running round.
- player:answer rejects an answerId absent from the current question.
- round2.selectCategory refuses an empty playOrder or a category with no
  questions; categoryCorrect no longer awards a picker who became a
  spectator.
- All round-1 transitions now return success/failure and a rejected
  transition triggers no broadcast.

Add unit, Jest and Socket.IO integration tests for valid/invalid
transitions, double actions and invalid statuses; document the
engine-level transition guarantees.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas force-pushed fix/4-reject-invalid-transitions from 7e972041b1 to aad1d6764f 2026-06-24 02:10:23 +00:00 Compare
Reliodas merged commit 38c2df68a4 into develop 2026-06-24 02:19:23 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jeux/le-grand-concours#30
No description provided.