Files
AdrianoDev 18b0877026 Longevity: il registro si semina da solo, e un cliente demo con un referto vero
seedRegistro/seedPesi esistevano dal 22/08 ed erano chiamati SOLO dai test: su
un database nuovo il registro restava vuoto, campiDelQuestionario non trovava
niente e la pagina del questionario si apriva SENZA DOMANDE. Non era un problema
della demo, era il primo avvio in produzione - lo stesso difetto gia' visto in
questo ramo (una funzione corretta che nessuno chiama), con la stessa
correzione: agganciarla dove non si puo' dimenticare, cioe' alla creazione del
database. Entrambe le semine sono INSERT OR REPLACE, quindi rilanciarle e' a
vuoto, e i punteggi gia' emessi non cambiano (sono congelati nella tabella
"score", che e' quello che il referto legge). Quattro test lo presidiano.

scripts/seed-demo.ts crea l'utente con ruolo "cliente", il fascicolo (passando
da creaCliente, l'unico varco fra identity e longevity) e compila il
questionario attraverso salvaDalForm - lo stesso percorso della pagina vera,
consenso compreso - cosi' i punteggi vengono calcolati e congelati come in
produzione. Si ferma se l'utente esiste gia': rifare la demo su dati esistenti
vuol dire duplicare o cancellare un fascicolo, e non e' una decisione da script.

Verificato girando l'app: Energy 74,5/100 con copertura 50%, Performance e
Recovery dichiarati insufficienti (5% e 35%) con l'elenco di cosa manca, Fitness
Age assente. E' la regola di Nicola all'opera - annullare invece di stimare - ed
e' lo stato vero del prodotto: nel registro ci sono solo le 20 domande del
questionario, i test fisici arrivano col gestionale trainer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EndnceRA5WnA6rvA5iV9WL
2026-09-03 12:27:48 +00:00

52 lines
2.7 KiB
TypeScript

// Il registro dei test è dato di prodotto, non dato di un cliente: un database nuovo deve
// nascere con dentro le domande e i pesi. Fino al 03/09/2026 seedRegistro e seedPesi erano
// chiamati SOLO dai test, quindi ogni suite passava e il primo avvio vero apriva un
// questionario senza domande. Questo test guarda il database come lo trova l'applicazione.
import { describe, it, expect } from 'vitest';
import { createLongevityDb } from '../../src/lib/longevity/db';
import { campiDelQuestionario } from '../../src/lib/longevity/vista';
import { MODEL_VERSION, seedRegistro, seedPesi } from '../../src/lib/longevity/registro';
const OGGI = new Date().toISOString().slice(0, 10);
describe('un database longevity appena creato', () => {
it('ha il registro dei test già seminato, non vuoto', () => {
const db = createLongevityDb(':memory:');
const n = (db.prepare('SELECT COUNT(*) AS n FROM registro_test').get() as { n: number }).n;
expect(n).toBeGreaterThan(0);
});
it('mostra le domande del questionario senza che nessuno semini a mano', () => {
const db = createLongevityDb(':memory:');
const campi = campiDelQuestionario(db, OGGI);
expect(campi.length).toBeGreaterThan(0);
// I tre sotto-domini che il questionario alimenta oggi: se un giorno il registro
// perdesse una famiglia di domande, il referto continuerebbe a "funzionare" con un
// asse in meno e nessuno se ne accorgerebbe.
const sottoDomini = new Set(campi.map((c) => c.sottoDominio));
expect(sottoDomini).toContain('questionario_sonno');
expect(sottoDomini).toContain('questionario_energia_stress');
expect(sottoDomini).toContain('questionario_lifestyle');
});
it('ha i pesi del modello corrente, per assi e macro', () => {
const db = createLongevityDb(':memory:');
const perLivello = db.prepare(
'SELECT livello, COUNT(*) AS n FROM pesi WHERE model_version = ? GROUP BY livello'
).all(MODEL_VERSION) as { livello: string; n: number }[];
const mappa = Object.fromEntries(perLivello.map((r) => [r.livello, r.n]));
expect(mappa.asse).toBeGreaterThan(0);
expect(mappa.macro).toBeGreaterThan(0);
expect(mappa.fitness_age).toBeGreaterThan(0);
});
it('rilanciare la creazione non duplica niente (INSERT OR REPLACE)', () => {
const db = createLongevityDb(':memory:');
const prima = (db.prepare('SELECT COUNT(*) AS n FROM registro_test').get() as { n: number }).n;
// Stessa semina, stesso database: è ciò che accade a ogni riavvio del container.
seedRegistro(db); seedPesi(db, MODEL_VERSION);
const dopo = (db.prepare('SELECT COUNT(*) AS n FROM registro_test').get() as { n: number }).n;
expect(dopo).toBe(prima);
});
});