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
|
// 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['"`]/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user