Segnala in modo visibile se il portale CSI cambia formato

Le vittorie in campionato dipendono dal JSON delle partite (non dalla
classifica HTML, come erroneamente documentato prima). Se quel formato cambia,
il parsing fallisce in silenzio: nessun errore, nessuna notifica, le vittorie
restano ferme a 0% finché qualcuno non se ne accorge per caso.

Aggiunta partiteFormatoSospetto() in csi-core.ts: confronta gli eventi grezzi
con il risultato del parsing per distinguere un vero "formato cambiato" da un
legittimo "nessuna gara ancora in programma". La route logga l'errore server e
il flag arriva fino a /classifica, dove sostituisce la riga "Dati CSI
aggiornati alle..." con un badge discreto color warning - visibile a chi apre
la pagina, senza notifiche invasive.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5 committed 2026-09-08 12:01:32 +02:00
1 parent 8c6fceb682
commit 7e51fe6345
6 files changed
+117 -10

No files matched your search

+29
View File
@@ -7,6 +7,7 @@ import {
isNostraSquadra,
parseClassifica,
partiteDaEventi,
partiteFormatoSospetto,
partiteGiocate,
urlClassifica,
urlPartite,
@@ -96,6 +97,34 @@ assert.deepEqual(trasferta.parziali[0], [21, 25], "anche i parziali");
assert.equal(partiteGiocate(partite).length, 2);
assert.deepEqual(partiteDaEventi("non è un array"), [], "risposta inattesa: nessun crash");
// --- partiteFormatoSospetto: distingue "nessuna gara ancora" da "formato rotto" -------------
assert.equal(
partiteFormatoSospetto(eventi, partite),
false,
"eventi grezzi presenti e riconosciuti: nessun sospetto",
);
assert.equal(
partiteFormatoSospetto([], []),
false,
"nessun evento grezzo: probabilmente solo una stagione senza gare, non un formato rotto",
);
assert.equal(
partiteFormatoSospetto("non è un array", []),
true,
"la risposta non è più un array: il formato è cambiato",
);
const eventiSenzaCampiRiconosciuti = [
{ id: 1, quando: "2025-11-12", squadraCasa: "C.R.A.P. Volley", squadraOspite: "AMCM" },
];
assert.equal(
partiteFormatoSospetto(
eventiSenzaCampiRiconosciuti,
partiteDaEventi(eventiSenzaCampiRiconosciuti),
),
true,
"eventi presenti ma con campi rinominati: nessuno riconosciuto, sospetto fondato",
);
if (process.env["CSI_LIVE"]) {
const [html, json] = await Promise.all([
fetch(urlClassifica()).then((r) => r.text()),