longevity: l'endpoint del questionario apre solo longevity, e il test anti-giunzione diventa strutturale

L'endpoint /api/longevity/questionario apriva anche identity (getIdentityDb)
per risolvere il client_code, violando la garanzia della spec (§4): un solo
modulo, anagrafica.ts, tiene insieme le due connessioni. La logica di
giunzione era gia' al posto giusto (chiamava codicePerUtente, che sta in
anagrafica.ts) ma l'APERTURA delle connessioni no.

- anagrafica.ts: nuova codicePerUtenteLoggato(userId), apre lei stessa
  identity via getIdentityDb() (e' il modulo autorizzato) e delega a
  codicePerUtente. L'endpoint chiama solo questa: apre esclusivamente
  longevity, per salvare.
- tests/longevity/anagrafica.test.ts: il test anti-giunzione cercava due nomi
  letterali (createIdentityDb/createLongevityDb) e non vedeva getIdentityDb/
  getLongevityDb, nati dopo di lui - la stessa lezione del semaforo nel Task 1
  (proteggere il nome invece della cosa). Ora e' strutturale: segnala
  qualunque file (esclusi anagrafica.ts e db.ts) che contenga sia "Identity"
  sia "Longevity", in qualunque forma. Verificato con un file finto sotto
  src/ che apriva entrambe con i nomi nuovi: il test diventa rosso, poi
  torna verde dopo la cancellazione.
This commit is contained in:
2026-08-22 14:01:33 +02:00
parent f5ca841d92
commit f0629db3c4
3 changed files with 28 additions and 6 deletions
+10 -2
View File
@@ -88,7 +88,15 @@ describe('anagrafica pseudonimizzata', () => {
expect(id.prepare(`SELECT * FROM clienti WHERE nome = 'Errato'`).get()).toBeUndefined();
});
it('nessun file in src/ (escluso anagrafica.ts e db.ts) apre entrambe le connessioni', () => {
it('nessun file in src/ (escluso anagrafica.ts e db.ts) fa riferimento sia a identity sia a longevity', () => {
// Non cerchiamo due nomi di funzione precisi (createIdentityDb/createLongevityDb): un
// domani qualcuno aggiunge getIdentityDb, o un terzo accessore con un nome diverso, e
// l'elenco invecchia senza che nessuno se ne accorga (è già successo: getIdentityDb e
// getLongevityDb sono nati DOPO questo test e sono passati indisturbati). Il verso
// giusto è strutturale: qualunque accesso alle due connessioni passa comunque per una
// funzione esportata da db.ts il cui nome contiene "Identity" o "Longevity" — quindi
// basta cercare quei due riferimenti letterali, in QUALUNQUE forma compaiano, e
// segnalare i file che li hanno tutti e due.
const srcDir = join(process.cwd(), 'src');
const colpevoli: string[] = [];
@@ -106,7 +114,7 @@ describe('anagrafica pseudonimizzata', () => {
if (f === 'lib/longevity/anagrafica.ts' || f === 'lib/longevity/db.ts') continue;
const src = readFileSync(path, 'utf8');
if (src.includes('createIdentityDb') && src.includes('createLongevityDb')) {
if (src.includes('Identity') && src.includes('Longevity')) {
colpevoli.push(f);
}
}