test: ripara la suite Vitest e migra gli e2e all'architettura attuale

La suite era allineata a una vecchia forma dello stato (sp.punt/sp.set/
sp.servHome) e a una vecchia architettura e2e (controller su :3001).
Baseline iniziale: 77/170 test Vitest falliti.

Vitest (ora 212/212 verdi):
- gameState.test.js: riscritto con helper che derivano punteggio/set/
  servizio dalla striscia; aggiunto blocco formInizio
- server-utils.js: getNetworkIPs accetta interfacce iniettabili e
  printServerInfo accetta gli IP iniettabili (deterministico anche su WSL);
  filtro LAN unificato (esclude 127./169.254./172.)
- websocket + stress: punteggio letto via punteggio(striscia)
- ControllerPage/DisplayPage: forzato layout mobile (viewport portrait),
  punteggi impostati via striscia; aggiunto test bottone REFERTO
- nuovi: referto.test.js, persist.test.js (mock fs), wsMixin.test.js,
  integration/server.test.js (routing)

Refactor di supporto:
- referto.js: estratta buildRefertoHtml(state, now) pura; generaReferto
  resta wrapper con window.open/print
- server.js: estratti createApp()/startServer(); avvio solo se entrypoint

e2e (migrazione parziale, NON ancora verificata verde):
- tutti i riferimenti controller :3001 -> :3000/controller
- forzato viewport portrait sul controller prima del goto
- reset helper: chiude il dialog di configurazione che doReset apre
- game-simulation: gestione del dialog SET VINTO automatico a 25
This commit is contained in:
2026-06-21 00:36:02 +02:00
parent ddf68010a4
commit eb37f8319f
19 changed files with 931 additions and 302 deletions
+12 -8
View File
@@ -1,7 +1,11 @@
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'
import { setupWebSocketHandler } from '../../src/websocket-handler.js'
import { punteggio } from '../../src/gameState.js'
import { EventEmitter } from 'events'
// Il punteggio non è memorizzato nello stato: si ricava dalla striscia.
const puntHome = (state) => punteggio(state.sp.striscia).home
// Mock parziale di una WebSocket e del Server
class MockWebSocket extends EventEmitter {
constructor() {
@@ -103,7 +107,7 @@ describe('WebSocket Integration (websocket-handler.js)', () => {
expect(controller.send).toHaveBeenCalled()
const sentMsg = lastSent(controller)
expect(sentMsg.type).toBe('state')
expect(sentMsg.state.sp.punt.home).toBe(1)
expect(puntHome(sentMsg.state)).toBe(1)
})
it('dovrebbe impedire al display di inviare azioni', () => {
@@ -182,8 +186,8 @@ describe('WebSocket Integration (websocket-handler.js)', () => {
const msg1 = lastSent(display1)
const msg2 = lastSent(display2)
expect(msg1.type).toBe('state')
expect(msg1.state.sp.punt.home).toBe(1)
expect(msg2.state.sp.punt.home).toBe(1)
expect(puntHome(msg1.state)).toBe(1)
expect(puntHome(msg2.state)).toBe(1)
})
it('non dovrebbe inviare a client con readyState != OPEN', () => {
@@ -302,7 +306,7 @@ describe('WebSocket Integration (websocket-handler.js)', () => {
const msg = lastSent(controller)
expect(msg.type).toBe('state')
expect(msg.state.sp.punt.home).toBe(1)
expect(puntHome(msg.state)).toBe(1)
})
})
@@ -374,15 +378,15 @@ describe('WebSocket Integration (websocket-handler.js)', () => {
describe('API pubblica', () => {
it('getState dovrebbe restituire lo stato corrente', () => {
const state = handler.getState()
expect(state.sp.punt.home).toBe(0)
expect(state.sp.punt.guest).toBe(0)
expect(puntHome(state)).toBe(0)
expect(punteggio(state.sp.striscia).guest).toBe(0)
})
it('setState dovrebbe sovrascrivere lo stato', () => {
const newState = handler.getState()
newState.sp.punt.home = 99
newState.sp.striscia.at(-1).ris = 'hh'
handler.setState(newState)
expect(handler.getState().sp.punt.home).toBe(99)
expect(puntHome(handler.getState())).toBe(2)
})
it('broadcastState dovrebbe inviare a tutti i client', () => {