// tests/longevity/referto.test.ts import { describe, it, expect } from 'vitest'; import { readFileSync } from 'node:fs'; import { join } from 'node:path'; import { createLongevityDb } from '../../src/lib/longevity/db'; import { seedRegistro, seedPesi, MODEL_VERSION } from '../../src/lib/longevity/registro'; import { salvaCompilazione } from '../../src/lib/longevity/questionario'; import { calcolaSessione, salvaScore } from '../../src/lib/longevity/motore'; import { refertoDi } from '../../src/lib/longevity/vista'; function conCompilazione() { const db = createLongevityDb(':memory:'); seedRegistro(db); seedPesi(db, MODEL_VERSION); db.prepare(`INSERT INTO soggetti (client_code, sesso) VALUES ('ISL-0001','F')`).run(); const s = salvaCompilazione(db, { client_code: 'ISL-0001', data: '2026-08-22', eta: 35, risposte: { q_attivita: 5, q_alimentazione: 8, q_sigarette: 0, q_alcol_life: 2, q_luce: 2, q_schermi: 10 }, }); salvaScore(db, s, calcolaSessione(db, s)); return { db, s }; } describe('il referto del cliente', () => { it('restituisce i sette assi', () => { const { db, s } = conCompilazione(); expect(refertoDi(db, s).assi.length).toBe(7); }); it('un asse senza dati NON porta un numero', () => { const { db, s } = conCompilazione(); const forza = refertoDi(db, s).assi.find((a) => a.nome === 'Forza & Struttura')!; expect(forza.valore).toBeNull(); }); it('e dice cosa manca per completarlo, invece di lasciare un buco', () => { const { db, s } = conCompilazione(); const forza = refertoDi(db, s).assi.find((a) => a.nome === 'Forza & Struttura')!; expect(forza.mancano.length).toBeGreaterThan(0); }); it('un asse coperto porta il suo numero', () => { const { db, s } = conCompilazione(); const stile = refertoDi(db, s).assi.find((a) => a.nome === 'Stile di Vita & Sonno')!; expect(stile.valore).not.toBeNull(); expect(stile.mancano).toEqual([]); }); it('legge i punteggi congelati, non li ricalcola al volo', () => { const { db, s } = conCompilazione(); // se rileggesse le misure invece degli score salvati, cambiare i pesi cambierebbe il referto const prima = JSON.stringify(refertoDi(db, s)); db.prepare(`UPDATE pesi SET peso = 0.99 WHERE model_version = ? AND elemento = 'questionario_lifestyle'`).run(MODEL_VERSION); expect(JSON.stringify(refertoDi(db, s))).toBe(prima); }); it('nessuna pagina interroga il database da sola', () => { for (const f of ['src/pages/longevity/io.astro', 'src/pages/longevity/questionario.astro']) { const src = readFileSync(join(process.cwd(), f), 'utf8'); expect(src, `${f} contiene SQL`).not.toMatch(/\bSELECT\b|\.prepare\(/i); } }); });