Documenta e copre con test l'obiettivo "Continuità di squadra"

Il target 12 non è un valore arbitrario da scalare con la rosa come gli altri
target fissi: è il minimo di giocatori per schierare due sestetti (6vs6) in
allenamento, confermato intenzionale. Documentato in
docs/modules/obiettivi-squadra.md.

Non aveva alcun test. Aggiunti unit test (rosa vuota, confine >= 3, target
fisso) e un integration test end-to-end che scrive tre allenamenti e presenze
reali sul database locale, calcola serieConsecutiva() (la stessa funzione pura
usata da useRosa() in produzione) sui dati riletti, e verifica il conteggio.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 11:34:50 +02:00
co-authored by Claude Sonnet 5
parent 0dadabfea6
commit 8c6fceb682
3 changed files with 110 additions and 7 deletions
+23
View File
@@ -302,6 +302,29 @@ assert.equal(
"il conteggio somma i voti di più match_id, non solo dell'ultima",
);
// --- o11: continuità di squadra (giocatori con serieAllenamenti >= 3) --------
{
assert.equal(
trova(obiettiviSquadra([], contestoVuoto), "o11").valore,
0,
"rosa vuota: nessuno può essere in serie",
);
// Target 12 su una rosa di 17: il minimo per schierare due sestetti (6vs6), non un
// valore arbitrario — vedi docs/modules/obiettivi-squadra.md.
assert.equal(trova(vuoti, "o11").target, 12, "il target resta 12: minimo per un 6vs6");
// Il confine è >= 3, non > 3: 2 non basta, 3 sì.
const rosaConfine = giocatori
.slice(0, 3)
.map((g, i) => ({ ...g, serieAllenamenti: [2, 3, 10][i]! }));
assert.equal(
trova(obiettiviSquadra(rosaConfine, contestoVuoto), "o11").valore,
2,
"conta solo chi ha almeno 3 allenamenti consecutivi (2 non basta, 3 sì)",
);
}
// --- progressoObiettivo ------------------------------------------------------
const o = (valore: number, target: number): ObiettivoSquadra => ({
id: "x",