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:
@@ -0,0 +1,66 @@
|
||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
|
||||
import { mkdtempSync, writeFileSync, rmSync } from 'fs'
|
||||
import { tmpdir } from 'os'
|
||||
import { join } from 'path'
|
||||
import { createApp } from '../../server.js'
|
||||
|
||||
// Usiamo una dist temporanea con file marcatori, così il test non dipende da
|
||||
// una build reale ed è deterministico.
|
||||
let server
|
||||
let baseUrl
|
||||
let distDir
|
||||
|
||||
beforeAll(async () => {
|
||||
distDir = mkdtempSync(join(tmpdir(), 'segnapunti-dist-'))
|
||||
writeFileSync(join(distDir, 'index.html'), 'DISPLAY_MARKER')
|
||||
writeFileSync(join(distDir, 'controller.html'), 'CONTROLLER_MARKER')
|
||||
writeFileSync(join(distDir, 'app.js'), 'ASSET_MARKER')
|
||||
|
||||
const app = createApp(distDir)
|
||||
await new Promise((resolve) => {
|
||||
server = app.listen(0, () => {
|
||||
baseUrl = `http://127.0.0.1:${server.address().port}`
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
afterAll(async () => {
|
||||
await new Promise((resolve) => server.close(resolve))
|
||||
rmSync(distDir, { recursive: true, force: true })
|
||||
})
|
||||
|
||||
async function get(path) {
|
||||
const res = await fetch(baseUrl + path)
|
||||
return { status: res.status, body: await res.text() }
|
||||
}
|
||||
|
||||
describe('Routing server (server.js)', () => {
|
||||
it('GET / serve la pagina display', async () => {
|
||||
const { status, body } = await get('/')
|
||||
expect(status).toBe(200)
|
||||
expect(body).toBe('DISPLAY_MARKER')
|
||||
})
|
||||
|
||||
it('GET /display serve la pagina display', async () => {
|
||||
expect((await get('/display')).body).toBe('DISPLAY_MARKER')
|
||||
})
|
||||
|
||||
it('GET /display/qualsiasi serve comunque la pagina display (SPA)', async () => {
|
||||
expect((await get('/display/foo/bar')).body).toBe('DISPLAY_MARKER')
|
||||
})
|
||||
|
||||
it('GET /controller serve la pagina controller', async () => {
|
||||
expect((await get('/controller')).body).toBe('CONTROLLER_MARKER')
|
||||
})
|
||||
|
||||
it('GET /controller/qualsiasi serve comunque la pagina controller', async () => {
|
||||
expect((await get('/controller/foo')).body).toBe('CONTROLLER_MARKER')
|
||||
})
|
||||
|
||||
it('serve gli asset statici dalla dist', async () => {
|
||||
const { status, body } = await get('/app.js')
|
||||
expect(status).toBe(200)
|
||||
expect(body).toBe('ASSET_MARKER')
|
||||
})
|
||||
})
|
||||
@@ -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', () => {
|
||||
|
||||
Reference in New Issue
Block a user