// tests/longevity/pagine.test.ts import { describe, it, expect } from 'vitest'; import { readFileSync, existsSync } from 'node:fs'; import { join } from 'node:path'; const leggi = (p: string) => readFileSync(join(process.cwd(), p), 'utf8'); describe('il guscio della piattaforma', () => { it('il layout esiste e non monta header e footer pubblici', () => { const l = leggi('src/layouts/Longevity.astro'); expect(l).not.toMatch(/import\s+Header/); expect(l).not.toMatch(/import\s+Footer/); expect(l).toMatch(/noindex/); // area riservata: mai indicizzata }); it('il foglio di stile e globale e prefissato, non scoped', () => { expect(existsSync(join(process.cwd(), 'src/styles/longevity.css'))).toBe(true); const css = leggi('src/styles/longevity.css'); const classi = [...css.matchAll(/^\.([a-z-]+)/gm)].map((m) => m[1]); expect(classi.length).toBeGreaterThan(3); expect(classi.every((c) => c.startsWith('lg'))).toBe(true); }); it('usa i token del sito invece di inventare colori', () => { const css = leggi('src/styles/longevity.css'); expect(css).toMatch(/var\(--c-/); }); it('nessun semaforo sui punteggi: il colore non giudica il corpo', () => { const css = leggi('src/styles/longevity.css').toLowerCase(); // il mattone del fuori range e ammesso; un verde "tutto bene" no expect(css).not.toMatch(/--lg-ok|--lg-buono|--lg-verde/); }); it('la rotta del cliente e sotto /longevity, dove le regole la proteggono', () => { expect(existsSync(join(process.cwd(), 'src/pages/longevity/index.astro'))).toBe(true); }); });