longevity: correzioni passo 3 su #13 unità B — scarto alternative e nota
testIdScartatiDalleAlternative: una sezione senza scelta in `scelte` (radio assente dal form) non scarta più nulla, invece di ripiegare in silenzio sulla prima alternativa (perdeva campi come f_plank_sec senza alt_core). API checkup.ts: la nota operatore si valida (lunghezza max 5000, TESTO_MAX esportato da giornale.ts) PRIMA di salvare il check-up, non più dopo — una nota troppo lunga non faceva più fallire aggiungiVoce in silenzio ma perdeva comunque la nota col check-up già scritto. maxlength sulla textarea in checkup.astro. Suite: 314 verdi, 4 rossi di piattaforma (baseline, invariati). tsc e build puliti. Refs #13 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,7 +31,7 @@ beforeAll(() => {
|
||||
lg = getLongevityDb();
|
||||
seedRegistro(lg);
|
||||
seedPesi(lg, MODEL_VERSION);
|
||||
for (const code of ['ISL-0001', 'ISL-0002', 'ISL-0003', 'ISL-0004', 'ISL-0005']) {
|
||||
for (const code of ['ISL-0001', 'ISL-0002', 'ISL-0003', 'ISL-0004', 'ISL-0005', 'ISL-0006']) {
|
||||
lg.prepare(`INSERT INTO soggetti (client_code, sesso) VALUES (?, 'F')`).run(code);
|
||||
}
|
||||
});
|
||||
@@ -67,23 +67,21 @@ describe('API checkup.ts, sezioni ad alternative e nota operatore (#13)', () =>
|
||||
expect(ids).not.toContain('f_panca_bil_rip');
|
||||
});
|
||||
|
||||
it('senza radio inviata, vince la prima alternativa dell\'elenco: i campi delle altre si scartano lo stesso', async () => {
|
||||
it('senza radio inviata (nessun alt_*), non si scarta nulla: un campo di un\'alternativa non-prima resta salvato (correzione passo 3, #13)', async () => {
|
||||
const { POST } = await import('../../src/pages/api/longevity/gestionale/checkup');
|
||||
const form = new FormData();
|
||||
form.set('client_code', 'ISL-0002');
|
||||
form.set('data', OGGI);
|
||||
// nessun alt_spinta: la prima alternativa di "Forza spinta" è 'manubri'
|
||||
form.set('f_panca_man_carico_kg', '20');
|
||||
form.set('f_panca_man_rip', '5');
|
||||
form.set('f_pushup_rip', '15'); // non è la prima alternativa: va scartato
|
||||
// nessun alt_core: 'ginocchia' è la prima alternativa di "Core", f_plank_sec è 'pieno'
|
||||
// (la seconda) — prima della correzione questo campo veniva scartato in silenzio.
|
||||
form.set('f_plank_sec', '90');
|
||||
const richiesta = new Request('http://localhost/api/longevity/gestionale/checkup', { method: 'POST', body: form });
|
||||
|
||||
const res = await POST({ request: richiesta, locals: { user: { username: 'nicola' } } } as any);
|
||||
const sessioneId = Number(new URL(res.headers.get('Location')!, 'http://localhost').searchParams.get('salvato'));
|
||||
const ids = (lg.prepare(`SELECT test_id FROM misure WHERE sessione_id = ?`).all(sessioneId) as { test_id: string }[])
|
||||
.map((r) => r.test_id);
|
||||
expect(ids).toContain('f_panca_man_carico_kg');
|
||||
expect(ids).not.toContain('f_pushup_rip');
|
||||
expect(ids).toContain('f_plank_sec');
|
||||
});
|
||||
|
||||
it('nota operatore non vuota: aggiunge una voce di giornale con la data del check-up e l\'operatore come autore', async () => {
|
||||
@@ -137,4 +135,22 @@ describe('API checkup.ts, sezioni ad alternative e nota operatore (#13)', () =>
|
||||
await POST({ request: richiesta, locals: { user: { username: 'nicola' } } } as any);
|
||||
expect(vociDelGiornale(lg, 'ISL-0005').length).toBe(0);
|
||||
});
|
||||
|
||||
it('nota oltre 5000 caratteri: errore PRIMA di salvare, nessuna sessione né voce di giornale (correzione passo 3, #13)', async () => {
|
||||
const { POST } = await import('../../src/pages/api/longevity/gestionale/checkup');
|
||||
const form = new FormData();
|
||||
form.set('client_code', 'ISL-0006');
|
||||
form.set('data', OGGI);
|
||||
form.set('f_peso_kg', '70');
|
||||
form.set('nota', 'x'.repeat(5001));
|
||||
const richiesta = new Request('http://localhost/api/longevity/gestionale/checkup', { method: 'POST', body: form });
|
||||
|
||||
const res = await POST({ request: richiesta, locals: { user: { username: 'nicola' } } } as any);
|
||||
expect(res.status).toBe(303);
|
||||
expect(res.headers.get('Location')).toMatch(/errore=/);
|
||||
|
||||
const sessioni = lg.prepare(`SELECT COUNT(*) AS n FROM sessioni WHERE client_code = ?`).get('ISL-0006') as { n: number };
|
||||
expect(sessioni.n).toBe(0); // niente scritto: né la sessione né la misura f_peso_kg
|
||||
expect(vociDelGiornale(lg, 'ISL-0006').length).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user