longevity: pagina /longevity/progressione, grafico e tabella dell'andamento

Progressione.tsx: una linea per macro-score (connectNulls=false: un dato
mancante è un buco, non una linea inventata), tratteggio e spessore a
distinguere le serie invece di un colore nuovo, riga verticale tratteggiata
sui cambi di versione; sotto, la tabella per asse. Colori identici a
Radar.tsx, nessuno nuovo.

progressione.astro: stesso modello di io.astro (codicePerUtenteLoggato,
nessuna query diretta); sotto i due punti mostra il messaggio che ne serve
almeno uno in più. io.astro linka la pagina nuova.

Refs #5

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-26 13:02:57 +00:00
parent 4cd911098d
commit 5dc6b85d52
5 changed files with 219 additions and 1 deletions
@@ -93,4 +93,19 @@ describe('il guscio della piattaforma', () => {
const src = readFileSync(p, 'utf8');
expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/io['"`]/);
});
it('la pagina dell andamento non interroga il database e usa codicePerUtenteLoggato', () => {
// Rete secondaria alla stessa prova generica di referto.test.ts ("nessuna pagina
// interroga il database da sola", che scandisce TUTTE le .astro sotto longevity/):
// qui si controlla in piu' che il codice cliente arrivi dalla via autorizzata, non da
// un'altra query o da un parametro della richiesta.
const p = join(process.cwd(), 'src/pages/longevity/progressione.astro');
expect(existsSync(p)).toBe(true);
const src = readFileSync(p, 'utf8');
expect(src).not.toMatch(/\.prepare\(/);
expect(src).toMatch(/codicePerUtenteLoggato/);
// Stessa rete secondaria di anagrafica.test.ts: nessuna giunzione identity/longevity
// in un file fuori dai due moduli autorizzati.
expect(src).not.toContain('Identity');
});
});