Verifica che gli upsert dell'app scrivano sulla riga giusta.
Ogni salvataggio di CrAPP è un upsert con un onConflict scritto a mano nei hook di src/lib/. Se quella chiave non corrisponde al vincolo UNIQUE della tabella non arriva nessun errore: il database sovrascrive la riga sbagliata, e il difetto si vede settimane dopo in una media che non torna. Nessuna delle sedici scritture era mai stata eseguita da un test. test/integration/scritture.test.ts ripete le stesse chiamate dei hook contro il database locale e conta cosa resta nella tabella. Le due regole opposte che nessuno verificava: le pagelle tengono un voto per ogni votato — se il conflitto fosse su (match, votante) ogni voto cancellerebbe il precedente — mentre l'MVP ne tiene uno solo per votante e partita. Più badge social per categoria, cacche, turni palloni, risposte presenze (con l'istante che alimenta la serie di conferme) e lo stato jsonb dello scout, che viene sostituito e non fuso. In più i due CHECK su cui l'app conta: niente autovoto, voto fra 1 e 10. Le righe usano il prefisso test-scritture e spariscono in un finally. La lettura delle credenziali locali passa da test/helpers/locale.ts, ora che la usano due file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+16
-13
@@ -17,12 +17,12 @@ non può inquinare gli altri.
|
||||
|
||||
## Struttura
|
||||
|
||||
| Cartella | Cosa verifica | Serve rete? |
|
||||
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
||||
| `unit/` | Logica di dominio pura: badge, serie, palloni, pagelle, MVP, cacche, scout, obiettivi, notifiche, parsing CSI, dati della rosa. Più le funzioni pure isolabili nei moduli con hook/rete (validazione upload, guardie push, JWT VAPID, cattura errori, avatar) | No |
|
||||
| `integration/` | Le route `/api/public/*` sul server di sviluppo: risposte, cache, validazione degli input. Più schema e permessi del Profilo Giocatore (`schema-profili`) contro il database configurato, e i permessi per ruolo (`permessi`) sul database locale | Sì |
|
||||
| `e2e/` | Percorsi completi sull'app servita: schermate, dati CSI fino alla pagina, file PWA, 404 | Sì |
|
||||
| `helpers/` | Avvio del server di test e mini-harness condiviso | — |
|
||||
| Cartella | Cosa verifica | Serve rete? |
|
||||
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- |
|
||||
| `unit/` | Logica di dominio pura: badge, serie, palloni, pagelle, MVP, cacche, scout, obiettivi, notifiche, parsing CSI, dati della rosa. Più le funzioni pure isolabili nei moduli con hook/rete (validazione upload, guardie push, JWT VAPID, cattura errori, avatar) | No |
|
||||
| `integration/` | Le route `/api/public/*` sul server di sviluppo: risposte, cache, validazione degli input. Più schema e permessi del Profilo Giocatore (`schema-profili`) contro il database configurato; permessi per ruolo (`permessi`) e semantica degli upsert (`scritture`) sul database locale | Sì |
|
||||
| `e2e/` | Percorsi completi sull'app servita: schermate, dati CSI fino alla pagina, file PWA, 404 | Sì |
|
||||
| `helpers/` | Avvio del server di test e mini-harness condiviso | — |
|
||||
|
||||
## Database locale in Docker
|
||||
|
||||
@@ -36,7 +36,8 @@ npx supabase status # URL e chiavi locali; Studio su http://127.0.0.1:54323
|
||||
npx supabase db reset # ricrea il database da zero se i dati si sporcano
|
||||
npx supabase stop # spegne tutto
|
||||
|
||||
bun test/integration/permessi.test.ts # i test che richiedono lo stack locale
|
||||
bun test/integration/permessi.test.ts # permessi per ruolo
|
||||
bun test/integration/scritture.test.ts # semantica degli upsert
|
||||
```
|
||||
|
||||
Il primo `start` scarica le immagini (qualche minuto), i successivi partono in
|
||||
@@ -44,13 +45,15 @@ una decina di secondi. Le mail finiscono in Mailpit (http://127.0.0.1:54324),
|
||||
non escono dalla macchina.
|
||||
|
||||
I test che scrivono **non leggono `.env`**: prendono URL e chiavi da
|
||||
`supabase status` e si fermano se l'URL non è `127.0.0.1`. È una cintura di
|
||||
sicurezza, non una comodità: così un `.env` puntato alla produzione non può
|
||||
trasformare un test in una scrittura sul database vero.
|
||||
`supabase status` (helper `test/helpers/locale.ts`) e si fermano se l'URL non è
|
||||
`127.0.0.1`. È una cintura di sicurezza, non una comodità: così un `.env`
|
||||
puntato alla produzione non può trasformare un test in una scrittura sul
|
||||
database vero.
|
||||
|
||||
Ognuno ripristina lo stato che tocca (utenti creati, slot della rosa, colonne
|
||||
modificate) in un `finally`, così la suite si può rilanciare all'infinito senza
|
||||
un `db reset` in mezzo.
|
||||
Ognuno ripristina lo stato che tocca in un `finally` — utenti creati, slot della
|
||||
rosa, colonne modificate, e per `scritture` tutte le righe con il prefisso
|
||||
`test-scritture`, che nessun dato vero può avere. Così la suite si rilancia
|
||||
all'infinito senza un `db reset` in mezzo.
|
||||
|
||||
Due cose scoperte scrivendo questi test, utili a chi ne aggiunge:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user