longevity test: motivazione corretta per il caso 'test disattivato', e media verificata numericamente

Il commento del test 'un test disattivato non entra nel calcolo' diceva
che q_attivita fosse l'unica voce del sotto-dominio questionario_lifestyle:
falso, ne ha sei (q_attivita, q_alimentazione, q_sigarette, q_alcol_life,
q_luce, q_schermi). Il motivo vero per cui il test funziona e' che il
fixture ne compila solo una delle sei, quindi disattivarla svuota il
sotto-dominio. Corretto il commento a dire il motivo vero, con nota su
cosa succederebbe se il fixture cambiasse.

Aggiunto anche il test mancante sulla regola della media: q_attivita(3)=65
e q_alimentazione(6)=60, stesso sotto-dominio, verificano che il valore
dell'asse "Stile di Vita & Sonno" sia la loro media (62.5), diversa sia
dalla somma (125) sia da ciascun addendo (65, 60) — nessun test esistente
controllava il VALORE della media, solo lo stato.
This commit is contained in:
2026-08-22 10:02:59 +02:00
parent f238984828
commit ac8b377f84
+30 -4
View File
@@ -49,10 +49,17 @@ describe('il motore legge le curve dal registro', () => {
// ancora una voce nel registro): siccome un asse insufficiente non porta
// 'valore' nel tipo Punteggio, il JSON prima/dopo risultava IDENTICO — la
// suite lo ha confermato (verificato eseguendo il test: fallisce con le due
// stringhe uguali). Corretto qui usando 'q_attivita', l'unica voce del
// sotto-dominio 'questionario_lifestyle' che pesa 1.00 dentro "Stile di Vita
// & Sonno": disattivarla fa cadere la copertura di quell'asse da 1.00 a 0 e
// lo stato passa da 'ok' a 'insufficiente' — una differenza vera e osservabile.
// stringhe uguali). Corretto qui usando 'q_attivita': NON e' l'unica voce
// del sotto-dominio 'questionario_lifestyle' (ne ha sei: q_attivita,
// q_alimentazione, q_sigarette, q_alcol_life, q_luce, q_schermi), ma in
// QUESTO fixture e' l'unica delle sei a cui si risponde. Disattivarla
// svuota davvero il sotto-dominio (nessun'altra voce lifestyle compilata a
// sostituirla), la copertura dell'asse "Stile di Vita & Sonno" (peso 1.00
// su quel solo sotto-dominio) cade da 1.00 a 0 e lo stato passa da 'ok' a
// 'insufficiente' — una differenza vera e osservabile. Se in futuro il
// fixture compilasse anche un'altra risposta lifestyle, questo test
// andrebbe aggiornato: la disattivazione non svuoterebbe piu' il
// sotto-dominio da sola.
const db = dbPronto();
salvaCompilazione(db, {
client_code: 'ISL-0001', data: '2026-08-22', eta: 35,
@@ -68,6 +75,25 @@ describe('il motore legge le curve dal registro', () => {
expect(dopo.assi['Stile di Vita & Sonno'].stato).toBe('insufficiente');
expect(JSON.stringify(prima)).not.toBe(JSON.stringify(dopo));
});
it('due test dello stesso sotto-dominio danno la MEDIA dei punteggi, non la somma ne un singolo valore', () => {
// q_attivita e q_alimentazione condividono il sotto-dominio 'questionario_lifestyle',
// che pesa 1.00 (unico elemento) dentro l'asse "Stile di Vita & Sonno": il valore
// dell'asse coincide col valore del sotto-dominio, quindi la media si legge diretta.
const db = dbPronto();
salvaCompilazione(db, {
client_code: 'ISL-0001', data: '2026-08-22', eta: 35,
// q_attivita curva incstep, steps [[0,20],[2,50],[4,80],[999,100]]: valore 3 ->
// lerp fra (2,50) e (4,80) a meta' strada -> punteggio 65.
// q_alimentazione curva x10: valore 6 -> punteggio 60.
// media = (65+60)/2 = 62.5: diversa dalla somma (125) e da ciascun addendo (65, 60).
risposte: { q_attivita: 3, q_alimentazione: 6 },
});
const r = calcolaSessione(db, 1);
const asse = r.assi['Stile di Vita & Sonno'];
expect(asse.stato).toBe('ok');
if (asse.stato === 'ok') expect(asse.valore).toBe(62.5);
});
});
describe('calcolo e congelamento di una sessione', () => {