Confrontando le funzioni esportate di src/lib/ con i riferimenti in test/, le uniche funzioni pure ancora scoperte erano i conteggi presenze, tre funzioni del calendario, i titoli MVP e i rifiuti della guardia notifiche. - unit: contaPresenzeGiocatore e totaliEventiGiocatore, compleanniEventi, convocatiEvento, eventoVuoto, mvpVintiPerGiocatore, e il nuovo auth-route.test.ts sui 401 di richiediAdmin (DD-024); - integration/permessi: badge_social_voti, che mancava tra le tabelle di M11, e le deroghe "Gli admin gestiscono tutti/e ...", mai verificate finora. Due modifiche al codice servivano per poter scrivere i test: - presenze.ts: i conteggi leggevano la data da dataOggi() e non erano verificabili; ora accettano oggi come parametro opzionale, come già facevano serieConsecutiva e serieConferme. Toglie anche la dipendenza dall'orologio che avrebbe cambiato i risultati dei test delle serie dal 10 settembre in poi; - auth-route.server.ts: "Bearer .." passava il pre-check con tre segmenti vuoti e arrivava fino alla chiamata di rete; ora i segmenti devono essere non vuoti. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
/** Check dei voti MVP: `bun test/unit/mvp-voti.test.ts`. */
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
conteggioPartita,
|
|
mioVoto,
|
|
mvpVintiPerGiocatore,
|
|
vincitoriMvp,
|
|
type VotoMvp,
|
|
} from "@/lib/mvp-voti";
|
|
|
|
const v = (
|
|
match_id: string,
|
|
votante_id: string,
|
|
votato_id: string,
|
|
votato_nome: string,
|
|
): VotoMvp => ({
|
|
match_id,
|
|
votante_id,
|
|
votato_id,
|
|
votato_nome,
|
|
});
|
|
|
|
// --- conteggioPartita --------------------------------------------------------
|
|
const partita = [
|
|
v("m1", "g1", "g2", "Bruno"),
|
|
v("m1", "g3", "g2", "Bruno"),
|
|
v("m1", "g4", "g5", "Anna"),
|
|
v("m2", "g1", "g5", "Anna"),
|
|
];
|
|
|
|
assert.deepEqual(conteggioPartita(partita, "m1"), [
|
|
{ id: "g2", nome: "Bruno", voti: 2 },
|
|
{ id: "g5", nome: "Anna", voti: 1 },
|
|
]);
|
|
assert.deepEqual(conteggioPartita(partita, "inesistente"), []);
|
|
|
|
// A parità di voti l'ordine è alfabetico, così la UI è stabile.
|
|
const pari = [v("m3", "g1", "g9", "Zeno"), v("m3", "g2", "g8", "Anna")];
|
|
assert.deepEqual(
|
|
conteggioPartita(pari, "m3").map((c) => c.nome),
|
|
["Anna", "Zeno"],
|
|
);
|
|
|
|
// --- vincitoriMvp: la parità non assegna nessun MVP --------------------------
|
|
assert.deepEqual(vincitoriMvp(partita), { m1: "Bruno", m2: "Anna" });
|
|
assert.deepEqual(vincitoriMvp(pari), {}, "due voti pari: MVP non assegnato");
|
|
assert.deepEqual(vincitoriMvp([]), {});
|
|
assert.deepEqual(
|
|
vincitoriMvp([v("m4", "g1", "g2", "Solo")]),
|
|
{ m4: "Solo" },
|
|
"un solo votante basta se non c'è concorrenza",
|
|
);
|
|
|
|
// --- mioVoto -----------------------------------------------------------------
|
|
assert.equal(mioVoto(partita, "m1", "g1")?.votato_nome, "Bruno");
|
|
assert.equal(mioVoto(partita, "m1", "g9"), null, "chi non ha votato non ha voto");
|
|
assert.equal(mioVoto(partita, "m9", "g1"), null);
|
|
|
|
// --- mvpVintiPerGiocatore: una vittoria per partita, la parità non conta -----
|
|
assert.deepEqual(
|
|
mvpVintiPerGiocatore(partita),
|
|
{ g2: 1, g5: 1 },
|
|
"m1 la vince g2, m2 g5: un titolo a testa",
|
|
);
|
|
assert.deepEqual(
|
|
mvpVintiPerGiocatore([...partita, ...pari]),
|
|
{ g2: 1, g5: 1 },
|
|
"la parità non assegna",
|
|
);
|
|
assert.deepEqual(
|
|
mvpVintiPerGiocatore([...partita, v("m5", "g1", "g2", "Bruno")]),
|
|
{ g2: 2, g5: 1 },
|
|
"i titoli si sommano su partite diverse",
|
|
);
|
|
assert.deepEqual(mvpVintiPerGiocatore([]), {});
|
|
|
|
console.log("mvp-voti: ok");
|