docs: aggiorna README, tests/README e CLAUDE.md con la nuova copertura test
Riflette i test aggiunti nei commit precedenti: rilevamento piattaforma di server-utils, avvio effettivo di startServer, rami di errore del WebSocket handler, cleanup/riconnessione di wsMixin, side-effect di generaReferto e layout esteso del controller. Aggiorna anche i conteggi di esempio (15 file/362 test Vitest, 81 E2E) e documenta come verificare la copertura (>99% statement).
This commit is contained in:
@@ -78,6 +78,8 @@ In sviluppo, `vite-plugin-websocket.js` incorpora il server WebSocket dentro il
|
|||||||
|
|
||||||
I test E2E girano in serie (`workers: 1`) per evitare race condition sullo stato WebSocket. Eseguire `npm run serve` prima di `npm run test:e2e`.
|
I test E2E girano in serie (`workers: 1`) per evitare race condition sullo stato WebSocket. Eseguire `npm run serve` prima di `npm run test:e2e`.
|
||||||
|
|
||||||
|
La copertura statement/linee della suite Vitest è oltre il 99%. Per testare `startServer()` (`server.js`) o i rami platform-dependent di `getNetworkIPs()` (`server-utils.js`) senza effetti collaterali reali (scrittura su `.segnapunti/state.json`, dipendenza dalla piattaforma), si mocka il modulo con `vi.mock`/`vi.doMock` (vedi `tests/integration/startServer.test.js` e `tests/unit/server-utils-platform.test.js`) invece di eseguire il codice reale.
|
||||||
|
|
||||||
## Deploy
|
## Deploy
|
||||||
|
|
||||||
Il progetto si distribuisce tramite Docker. L'immagine è pubblicata sul registry Gitea self-hosted (`santantonio.sytes.net`):
|
Il progetto si distribuisce tramite Docker. L'immagine è pubblicata sul registry Gitea self-hosted (`santantonio.sytes.net`):
|
||||||
|
|||||||
@@ -242,8 +242,12 @@ Lo stato viene salvato in `.segnapunti/state.json` anche in modalità dev.
|
|||||||
| `npm run test:e2e` | Playwright — Chromium, Firefox, Mobile Chrome |
|
| `npm run test:e2e` | Playwright — Chromium, Firefox, Mobile Chrome |
|
||||||
|
|
||||||
Le suite Vitest coprono la logica di gioco (`gameState`, inclusa `formInizio`),
|
Le suite Vitest coprono la logica di gioco (`gameState`, inclusa `formInizio`),
|
||||||
il protocollo e il routing del server, la persistenza, il client WebSocket
|
il protocollo e il routing del server (incluso l'avvio effettivo di
|
||||||
(`wsMixin`), i componenti Vue e la generazione del referto.
|
`startServer`), la persistenza, il rilevamento di rete/piattaforma
|
||||||
|
(`server-utils`, inclusi i rami WSL/PowerShell), il client WebSocket
|
||||||
|
(`wsMixin`, connessione/riconnessione/cleanup), i componenti Vue e la
|
||||||
|
generazione del referto (inclusi i suoi side-effect di stampa). La copertura
|
||||||
|
statement complessiva è oltre il 99%.
|
||||||
|
|
||||||
> I test E2E richiedono il server in esecuzione (`npm run serve`) e i browser Playwright installati:
|
> I test E2E richiedono il server in esecuzione (`npm run serve`) e i browser Playwright installati:
|
||||||
> ```bash
|
> ```bash
|
||||||
|
|||||||
+28
-7
@@ -94,7 +94,9 @@ Esempi reali nel progetto:
|
|||||||
- time out (`startTimeout`/`stopTimeout`: squadra, video, timestamp)
|
- time out (`startTimeout`/`stopTimeout`: squadra, video, timestamp)
|
||||||
- generazione del referto (`buildRefertoHtml`)
|
- generazione del referto (`buildRefertoHtml`)
|
||||||
- persistenza stato su disco (`persist.js`, con `fs` mockato)
|
- persistenza stato su disco (`persist.js`, con `fs` mockato)
|
||||||
- utility di rete (`server-utils.js`)
|
- utility di rete (`server-utils.js`), incluso il rilevamento piattaforma
|
||||||
|
(WSL/PowerShell vs. `os.networkInterfaces()`, con `fs`/`child_process`/`os`
|
||||||
|
mockati per non dipendere dalla macchina che esegue i test)
|
||||||
- elenco video spot (`spot-utils.js`, su cartella temporanea reale)
|
- elenco video spot (`spot-utils.js`, su cartella temporanea reale)
|
||||||
|
|
||||||
Quando falliscono:
|
Quando falliscono:
|
||||||
@@ -119,6 +121,8 @@ Esempi reali nel progetto:
|
|||||||
- autorizzazioni (solo controller puo inviare certe azioni)
|
- autorizzazioni (solo controller puo inviare certe azioni)
|
||||||
- timer server-side del time out (auto-`stopTimeout` dopo 30s, `startedAt` impostato dal server)
|
- timer server-side del time out (auto-`stopTimeout` dopo 30s, `startedAt` impostato dal server)
|
||||||
- routing del server Express (`createApp`: rotte display/controller/asset, `/spot/list` e file statici `/spot/`)
|
- routing del server Express (`createApp`: rotte display/controller/asset, `/spot/list` e file statici `/spot/`)
|
||||||
|
- rami di errore del WebSocket handler (`ws.send`/`ws.terminate` che lanciano, `applyAction` che fallisce a metà azione: lo stato precedente va ripristinato senza propagare l'eccezione)
|
||||||
|
- avvio effettivo di `startServer` (`server.js`): ascolto HTTP, upgrade su `/ws`, rifiuto su altri percorsi, persistenza dopo un'azione — con `persist.js` mockato per non toccare mai `.segnapunti/state.json` reale
|
||||||
|
|
||||||
Quando falliscono:
|
Quando falliscono:
|
||||||
- spesso c'e problema nel protocollo messaggi o nei controlli di ruolo
|
- spesso c'e problema nel protocollo messaggi o nei controlli di ruolo
|
||||||
@@ -138,8 +142,9 @@ Esempi reali nel progetto:
|
|||||||
- dialog reset/config/cambi
|
- dialog reset/config/cambi
|
||||||
- modal time out del controller (scelta squadra/video, banner, countdown)
|
- modal time out del controller (scelta squadra/video, banner, countdown)
|
||||||
- overlay time out del display (video, placeholder, countdown, dissolvenza)
|
- overlay time out del display (video, placeholder, countdown, dissolvenza)
|
||||||
- bottone REFERTO nel dialog PARTITA FINITA
|
- bottone REFERTO nel dialog PARTITA FINITA e generazione del referto stampabile (`generaReferto`: `window.open`, scrittura HTML, stampa)
|
||||||
- client WebSocket (`wsMixin`: connessione, riconnessione, `sendWs`, errori)
|
- client WebSocket (`wsMixin`: connessione, riconnessione con backoff, cleanup allo smontaggio, `sendWs`, errori)
|
||||||
|
- layout esteso/landscape del controller (pannelli squadra, popup automatico SET VINTO con soglia decisiva)
|
||||||
|
|
||||||
Quando falliscono:
|
Quando falliscono:
|
||||||
- spesso hai rotto template, computed, metodi o binding
|
- spesso hai rotto template, computed, metodi o binding
|
||||||
@@ -190,8 +195,8 @@ Note importanti:
|
|||||||
Caso OK (verde):
|
Caso OK (verde):
|
||||||
|
|
||||||
```text
|
```text
|
||||||
Test Files 10 passed (10)
|
Test Files 15 passed (15)
|
||||||
Tests 212 passed (212)
|
Tests 362 passed (362)
|
||||||
```
|
```
|
||||||
|
|
||||||
Significa:
|
Significa:
|
||||||
@@ -208,7 +213,7 @@ Caso KO (rosso):
|
|||||||
Caso OK:
|
Caso OK:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
75 passed
|
81 passed
|
||||||
```
|
```
|
||||||
|
|
||||||
Caso KO:
|
Caso KO:
|
||||||
@@ -279,7 +284,23 @@ npm run test:e2e -- --update-snapshots
|
|||||||
npm run test:e2e
|
npm run test:e2e
|
||||||
```
|
```
|
||||||
|
|
||||||
## 10) Come aggiungere un nuovo test (consigli pratici)
|
## 10) Copertura del codice
|
||||||
|
|
||||||
|
Non c'è uno script `npm` dedicato, ma si può controllare la copertura in
|
||||||
|
qualsiasi momento con:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx vitest run tests/unit tests/integration tests/component --coverage
|
||||||
|
```
|
||||||
|
|
||||||
|
Il report a schermo mostra percentuale e righe scoperte per file. La suite
|
||||||
|
attuale copre oltre il 99% di statement/linee; le poche righe rimaste
|
||||||
|
scoperte sono documentate nei commit dei rispettivi test come codice morto,
|
||||||
|
difensivo, oppure legato a HMR (`import.meta.hot`) o all'avvio diretto
|
||||||
|
(`node server.js`) — casi non testabili in modo significativo senza side
|
||||||
|
effect reali sull'ambiente.
|
||||||
|
|
||||||
|
## 11) Come aggiungere un nuovo test (consigli pratici)
|
||||||
|
|
||||||
- metti i test nel posto giusto:
|
- metti i test nel posto giusto:
|
||||||
- `tests/unit` per logica pura
|
- `tests/unit` per logica pura
|
||||||
|
|||||||
Reference in New Issue
Block a user