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:
@@ -1,7 +1,12 @@
|
||||
---
|
||||
// Punto di ingresso della piattaforma: non c'è un indice, solo la scorciatoia al
|
||||
// referto del cliente. La protezione della rotta è già del middleware (isProtectedPath
|
||||
// e canAccessAdminPath in src/lib/auth.ts).
|
||||
// Punto di ingresso della piattaforma: smista per ruolo, non è un indice proprio.
|
||||
// Il trainer e l'admin lavorano nel gestionale (Unità 2b, #2); il cliente resta sulla
|
||||
// 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;
|
||||
|
||||
const ruolo = Astro.locals.user?.role;
|
||||
if (ruolo === 'admin' || ruolo === 'trainer') return Astro.redirect('/longevity/gestionale');
|
||||
return Astro.redirect('/longevity/io');
|
||||
---
|
||||
|
||||
@@ -94,3 +94,41 @@ describe('il guscio della piattaforma', () => {
|
||||
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['"`]/);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user