3d43de5ab9
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 in , il referto legge quelli). Quattro test lo presidiano. scripts/seed-demo.ts crea l'utente , 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
52 lines
2.7 KiB
TypeScript
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);
|
|
});
|
|
});
|