eb37f8319f
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
67 lines
2.2 KiB
JavaScript
67 lines
2.2 KiB
JavaScript
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')
|
|
})
|
|
})
|