63 lines
2.7 KiB
TypeScript
63 lines
2.7 KiB
TypeScript
// 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);
|
|
}
|
|
});
|
|
});
|