schema-profili: test sul database locale, non su quello di .env
Il test leggeva URL e chiavi da .env (progetto remoto) e tentava scritture anonime lì. Ora usa statoLocale() come gli altri test che scrivono. README aggiornato: tolta l'eccezione alla regola sulle scritture. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b2c23f2f38
commit
06c91149e7
2 files changed
+14
-16
No files matched your search
+6
-8
@@ -27,7 +27,7 @@ la consegna effettiva a schermo bloccato richiede un telefono e il servizio push
|
|||||||
| Cartella | Cosa verifica | Serve rete? |
|
| Cartella | Cosa verifica | Serve rete? |
|
||||||
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
||||||
| `unit/` | Logica di dominio pura: badge, serie, palloni, pagelle, MVP, cacche, scout, obiettivi (calcolo e card di dettaglio), avvisi in Home, 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, guardia admin delle route, lettura del `.env` ed elenco dei bucket dello script di backup, logica del worker in `mailer/` (email e push dei promemoria), preferenza «Email» e avviso del sondaggio) | No |
|
| `unit/` | Logica di dominio pura: badge, serie, palloni, pagelle, MVP, cacche, scout, obiettivi (calcolo e card di dettaglio), avvisi in Home, 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, guardia admin delle route, lettura del `.env` ed elenco dei bucket dello script di backup, logica del worker in `mailer/` (email e push dei promemoria), preferenza «Email» e avviso del sondaggio) | 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, incluse le policy di M11, le deroghe dell'amministratore e le tabelle lasciate aperte di proposito (`permessi`), accesso alle route di notifica (`permessi-route`), semantica degli upsert e vincoli (`scritture`), le letture lato server delle route push (`lettori-server`) e la pulizia a cascata dei dati collegati alla cancellazione di un evento (`pulizia-evento`, M14) la funzione di bonifica delle righe orfane (`bonifica-evento`, M16), il centro notifiche in-app (`notifiche-utente`, M17), la coda delle email e le sue funzioni RPC (`notifiche-email`, M22), i promemoria evento che non ricompaiono se eliminati (`promemoria-eventi`, M23), la coda delle push dei promemoria (`push-promemoria`, M24), i job automatici di turno palloni e sollecito presenze con revoca, finestre e testi identici al codice (`notifiche-automatiche`, M26-M28 e M30, DD-040, DD-042, DD-043 e DD-045: palloni un solo avviso a 3 ore, sollecito uno solo a 24 ore, nessun promemoria evento) la colonna `foto_path` eliminata (`foto-tessera-rimossa`, M29, DD-044) e il sondaggio in-app/email (`sondaggio-notifiche`, M24), i destinatari delle notifiche per ruolo (`destinatari-notifiche`: promemoria, messaggio dello staff, sondaggio, sollecito e turno palloni con allenatore e giocatore), l'avviso «Presenza modificata» ad admin e allenatori con finestra di 6 ore, stati e nessun avviso a cancellazione dell'evento (`presenza-modificata`, M32-M33, DD-050), gli avvisi di compleanno con ora, più compleanni lo stesso giorno, registro e 29 febbraio (`notifiche-compleanno`, M31, DD-047), la nascita pubblica sincronizzata dal profilo (`nascita-pubblica`, M18) e il suo backfill per i profili preesistenti (`backfill-nascita-esistenti`, M19 — unico test che esegue SQL diretto via `docker exec` nel container Postgres, perché PostgREST non espone quell'update multi-tabella come RPC) sul database locale | Sì |
|
| `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 locale; permessi per ruolo, incluse le policy di M11, le deroghe dell'amministratore e le tabelle lasciate aperte di proposito (`permessi`), accesso alle route di notifica (`permessi-route`), semantica degli upsert e vincoli (`scritture`), le letture lato server delle route push (`lettori-server`) e la pulizia a cascata dei dati collegati alla cancellazione di un evento (`pulizia-evento`, M14) la funzione di bonifica delle righe orfane (`bonifica-evento`, M16), il centro notifiche in-app (`notifiche-utente`, M17), la coda delle email e le sue funzioni RPC (`notifiche-email`, M22), i promemoria evento che non ricompaiono se eliminati (`promemoria-eventi`, M23), la coda delle push dei promemoria (`push-promemoria`, M24), i job automatici di turno palloni e sollecito presenze con revoca, finestre e testi identici al codice (`notifiche-automatiche`, M26-M28 e M30, DD-040, DD-042, DD-043 e DD-045: palloni un solo avviso a 3 ore, sollecito uno solo a 24 ore, nessun promemoria evento) la colonna `foto_path` eliminata (`foto-tessera-rimossa`, M29, DD-044) e il sondaggio in-app/email (`sondaggio-notifiche`, M24), i destinatari delle notifiche per ruolo (`destinatari-notifiche`: promemoria, messaggio dello staff, sondaggio, sollecito e turno palloni con allenatore e giocatore), l'avviso «Presenza modificata» ad admin e allenatori con finestra di 6 ore, stati e nessun avviso a cancellazione dell'evento (`presenza-modificata`, M32-M33, DD-050), gli avvisi di compleanno con ora, più compleanni lo stesso giorno, registro e 29 febbraio (`notifiche-compleanno`, M31, DD-047), la nascita pubblica sincronizzata dal profilo (`nascita-pubblica`, M18) e il suo backfill per i profili preesistenti (`backfill-nascita-esistenti`, M19 — unico test che esegue SQL diretto via `docker exec` nel container Postgres, perché PostgREST non espone quell'update multi-tabella come RPC) sul database locale | Sì |
|
||||||
| `e2e/` | Percorsi completi sull'app servita: schermate, dati CSI fino alla pagina, file PWA, 404 | 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 | — |
|
| `helpers/` | Avvio del server di test e mini-harness condiviso | — |
|
||||||
|
|
||||||
@@ -102,13 +102,11 @@ Due cose scoperte scrivendo questi test, utili a chi ne aggiunge:
|
|||||||
|
|
||||||
## Convenzioni
|
## Convenzioni
|
||||||
|
|
||||||
- **Sul database configurato in `.env` nessun test scrive.** Integration ed e2e
|
- **I test che scrivono, o che tentano di scrivere, girano solo sul database locale**
|
||||||
fanno solo letture e verifiche di validazione: si possono lanciare anche contro
|
(credenziali da `supabase status`, mai da `.env`). `schema-profili` _tenta_ scritture da
|
||||||
l'ambiente reale. L'unica eccezione apparente è `schema-profili`, che _tenta_
|
utente anonimo per dimostrare che la RLS le respinge e rilegge la riga per verificare che
|
||||||
scritture da utente anonimo proprio per dimostrare che la RLS le respinge, e poi
|
non sia cambiata: su un UPDATE a zero righe PostgREST risponde 2xx, quindi lo stato conta
|
||||||
rilegge la riga per verificare che non sia cambiata: su un UPDATE a zero righe
|
più del codice di risposta. Gli altri integration ed e2e fanno solo letture e validazioni.
|
||||||
PostgREST risponde 2xx, quindi lo stato conta più del codice di risposta.
|
|
||||||
I test che scrivono davvero girano solo sul database locale (vedi sopra).
|
|
||||||
- I test legati alla migration M2 si **saltano da soli** dove quella migration non è
|
- I test legati alla migration M2 si **saltano da soli** dove quella migration non è
|
||||||
ancora applicata, indicandolo nel motivo. Per vederli tutti verdi serve un
|
ancora applicata, indicandolo nel motivo. Per vederli tutti verdi serve un
|
||||||
database che la contenga: `npx supabase start` ne crea uno in locale.
|
database che la contenga: `npx supabase start` ne crea uno in locale.
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* Schema e permessi del Profilo Giocatore: `bun test/integration/schema-profili.test.ts`.
|
* Schema e permessi del Profilo Giocatore: `bun test/integration/schema-profili.test.ts`.
|
||||||
*
|
*
|
||||||
* Verifica contro un database vero (locale con `npx supabase start`, oppure quello
|
* Verifica contro il database locale (`npx supabase start`, credenziali da
|
||||||
* configurato in `.env`) le tre cose che il codice dà per scontate: le colonne della
|
* `supabase status`, mai da `.env`) le tre cose che il codice dà per scontate: le colonne della
|
||||||
* tabella, la chiusura verso l'utente anonimo e il bucket privato.
|
* tabella, la chiusura verso l'utente anonimo e il bucket privato.
|
||||||
*
|
*
|
||||||
* Salta con un motivo esplicito quando mancano le credenziali o quando la migration
|
* Salta con un motivo esplicito quando mancano le credenziali o quando la migration
|
||||||
@@ -10,13 +10,13 @@
|
|||||||
*/
|
*/
|
||||||
import assert from "node:assert/strict";
|
import assert from "node:assert/strict";
|
||||||
import { COLONNE_PROFILO } from "@/lib/profili-core";
|
import { COLONNE_PROFILO } from "@/lib/profili-core";
|
||||||
import { envDaFile } from "../helpers/server";
|
import { statoLocale } from "../helpers/locale";
|
||||||
import { prova, riepilogo, salta } from "../helpers/prova";
|
import { prova, riepilogo, salta } from "../helpers/prova";
|
||||||
|
|
||||||
const env = { ...envDaFile(), ...process.env };
|
const locale = statoLocale();
|
||||||
const URL_BASE = env["SUPABASE_URL"];
|
const URL_BASE = locale?.url;
|
||||||
const CHIAVE_SERVIZIO = env["SUPABASE_SERVICE_ROLE_KEY"];
|
const CHIAVE_SERVIZIO = locale?.servizio;
|
||||||
const CHIAVE_PUBBLICA = env["SUPABASE_PUBLISHABLE_KEY"];
|
const CHIAVE_PUBBLICA = locale?.anon;
|
||||||
|
|
||||||
/** Le chiavi nuove sono opache e viaggiano solo in `apikey`; quelle legacy sono JWT. */
|
/** Le chiavi nuove sono opache e viaggiano solo in `apikey`; quelle legacy sono JWT. */
|
||||||
function intestazioni(chiave: string): Record<string, string> {
|
function intestazioni(chiave: string): Record<string, string> {
|
||||||
@@ -37,7 +37,7 @@ const bucketProfili = (chiave: string) =>
|
|||||||
console.log(`schema profili su ${URL_BASE ?? "(non configurato)"}`);
|
console.log(`schema profili su ${URL_BASE ?? "(non configurato)"}`);
|
||||||
|
|
||||||
if (!URL_BASE || !CHIAVE_SERVIZIO || !CHIAVE_PUBBLICA) {
|
if (!URL_BASE || !CHIAVE_SERVIZIO || !CHIAVE_PUBBLICA) {
|
||||||
salta("schema e permessi dei profili", "credenziali Supabase non configurate");
|
salta("schema e permessi dei profili", "stack locale non attivo (npx supabase start)");
|
||||||
riepilogo("schema profili");
|
riepilogo("schema profili");
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in new issue
Block a user