longevity: index.astro smista per ruolo, test del gestionale

pages/longevity/index.astro: trainer e admin → /longevity/gestionale, cliente →
/longevity/io come prima (l'assert esistente sul redirect a /longevity/io resta
valido, il ramo cliente lo chiama ancora testualmente).
tests/longevity/pagine.test.ts: le quattro pagine del gestionale esistono, usano
variante="gestionale", non toccano il DB direttamente e non nominano il database
anagrafico riservato; index.astro smista per ruolo.

Refs #2
This commit is contained in:
2026-09-26 13:05:52 +00:00
parent 9375a0380d
commit 948068b312
2 changed files with 46 additions and 3 deletions
@@ -1,7 +1,12 @@
--- ---
// Punto di ingresso della piattaforma: non c'è un indice, solo la scorciatoia al // Punto di ingresso della piattaforma: smista per ruolo, non è un indice proprio.
// referto del cliente. La protezione della rotta è già del middleware (isProtectedPath // Il trainer e l'admin lavorano nel gestionale (Unità 2b, #2); il cliente resta sulla
// e canAccessAdminPath in src/lib/auth.ts). // scorciatoia al proprio referto, come prima. La protezione della rotta è già del
// middleware (isProtectedPath e canAccessPath in src/lib/auth.ts): qui arriva solo chi è
// già autenticato su una delle due sezioni.
export const prerender = false; export const prerender = false;
const ruolo = Astro.locals.user?.role;
if (ruolo === 'admin' || ruolo === 'trainer') return Astro.redirect('/longevity/gestionale');
return Astro.redirect('/longevity/io'); return Astro.redirect('/longevity/io');
--- ---
@@ -94,3 +94,41 @@ describe('il guscio della piattaforma', () => {
expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/io['"`]/); expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/io['"`]/);
}); });
}); });
describe('il gestionale del trainer (Unità 2b)', () => {
const PAGINE_GESTIONALE = [
'src/pages/longevity/gestionale/index.astro',
'src/pages/longevity/gestionale/nuovo.astro',
'src/pages/longevity/gestionale/cliente/[code].astro',
'src/pages/longevity/gestionale/cliente/[code]/checkup.astro',
];
it('ogni pagina del gestionale esiste e usa la variante "gestionale" del layout', () => {
for (const p of PAGINE_GESTIONALE) {
expect(existsSync(join(process.cwd(), p))).toBe(true);
expect(leggi(p)).toMatch(/variante=["']gestionale["']/);
}
});
it('nessuna pagina del gestionale interroga il database direttamente', () => {
// Il gestionale legge sempre attraverso lib/longevity (anagrafica, gestionale, vista):
// una .prepare( dentro una .astro sarebbe una query scritta a mano nella pagina.
for (const p of PAGINE_GESTIONALE) {
expect(leggi(p)).not.toMatch(/\.prepare\(/);
}
});
it('nessuna pagina del gestionale nomina il database anagrafico riservato', () => {
for (const p of PAGINE_GESTIONALE) {
expect(leggi(p)).not.toMatch(/Identity/);
}
});
it('index.astro smista per ruolo: trainer e admin al gestionale, il cliente al proprio referto', () => {
const src = leggi('src/pages/longevity/index.astro');
expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/gestionale['"`]/);
expect(src).toMatch(/trainer/);
expect(src).toMatch(/admin/);
expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/io['"`]/);
});
});