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:
@@ -0,0 +1,28 @@
|
||||
import { spawnSync } from "node:child_process";
|
||||
|
||||
/**
|
||||
* Credenziali dello stack Supabase locale (`npx supabase start`), lette da
|
||||
* `supabase status` e non da `.env`.
|
||||
*
|
||||
* I test che scrivono usano questo helper e non le variabili d'ambiente: un `.env`
|
||||
* puntato alla produzione non deve poter trasformare un test in una scrittura sul
|
||||
* database vero. Torna `null` — e il test si salta — se lo stack non è attivo o se
|
||||
* per qualsiasi motivo l'URL non è locale.
|
||||
*/
|
||||
export type StackLocale = { url: string; anon: string; servizio: string };
|
||||
|
||||
export function statoLocale(): StackLocale | null {
|
||||
const esito = spawnSync("npx", ["supabase", "status", "-o", "env"], {
|
||||
encoding: "utf8",
|
||||
timeout: 60_000,
|
||||
});
|
||||
if (esito.status !== 0) return null;
|
||||
const leggi = (nome: string) =>
|
||||
new RegExp(`^${nome}="?([^"\\n]+)"?$`, "m").exec(esito.stdout)?.[1] ?? "";
|
||||
const url = leggi("API_URL");
|
||||
const anon = leggi("ANON_KEY");
|
||||
const servizio = leggi("SERVICE_ROLE_KEY");
|
||||
if (!url || !anon || !servizio) return null;
|
||||
if (!/^https?:\/\/(127\.0\.0\.1|localhost)/.test(url)) return null;
|
||||
return { url, anon, servizio };
|
||||
}
|
||||
Reference in New Issue
Block a user