Audit dedicato su tutti i 16 badge: s-tiebreak non applicava la soglia minima di voti pagella di Pagellone sullo stesso campo mediaVoto (corretto), s-cacche prometteva "partite di campionato" senza che il codice lo verificasse mai (corretta la descrizione, comportamento invariato). Aggiunti test unit e integration end-to-end mancanti su badge segreti e social, con dati scritti a database anche per i cinque segreti che prima ne erano privi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
97 lines
3.8 KiB
TypeScript
97 lines
3.8 KiB
TypeScript
/** Check dei badge social: `bun test/unit/badge-social.test.ts`. */
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
badgeSocialVinti,
|
|
categorieSocial,
|
|
conteggioCategoria,
|
|
mioVotoSocial,
|
|
vincitoreCategoria,
|
|
type VotoSocial,
|
|
} from "@/lib/badge-social";
|
|
|
|
const v = (
|
|
match_id: string,
|
|
categoria: string,
|
|
votante_id: string,
|
|
votato_id: string,
|
|
votato_nome: string,
|
|
): VotoSocial => ({ match_id, categoria, votante_id, votato_id, votato_nome });
|
|
|
|
const voti: VotoSocial[] = [
|
|
v("m1", "affidabile", "g1", "g2", "Bruno"),
|
|
v("m1", "affidabile", "g3", "g2", "Bruno"),
|
|
v("m1", "affidabile", "g4", "g5", "Anna"),
|
|
v("m1", "meme", "g1", "g5", "Anna"),
|
|
v("m2", "affidabile", "g1", "g2", "Bruno"),
|
|
];
|
|
|
|
// --- conteggioCategoria: match e categoria isolati ---------------------------
|
|
assert.deepEqual(conteggioCategoria(voti, "m1", "affidabile"), [
|
|
{ id: "g2", nome: "Bruno", voti: 2 },
|
|
{ id: "g5", nome: "Anna", voti: 1 },
|
|
]);
|
|
assert.deepEqual(conteggioCategoria(voti, "m1", "meme"), [{ id: "g5", nome: "Anna", voti: 1 }]);
|
|
assert.deepEqual(conteggioCategoria(voti, "m1", "cuore"), [], "categoria senza voti");
|
|
assert.deepEqual(conteggioCategoria(voti, "m9", "affidabile"), []);
|
|
|
|
// --- vincitoreCategoria: serve un vantaggio netto ----------------------------
|
|
assert.equal(vincitoreCategoria(voti, "m1", "affidabile")?.nome, "Bruno");
|
|
assert.equal(vincitoreCategoria(voti, "m1", "cuore"), null, "nessun voto, nessun vincitore");
|
|
const pari = [v("m3", "meme", "g1", "g2", "Bruno"), v("m3", "meme", "g2", "g5", "Anna")];
|
|
assert.equal(vincitoreCategoria(pari, "m3", "meme"), null, "parità: nessun vincitore");
|
|
|
|
// Un solo voto totale: vince comunque, non serve concorrenza per avere un vantaggio netto.
|
|
const votoSingolo = [v("m4", "cuore", "g1", "g9", "Zoe")];
|
|
assert.equal(
|
|
vincitoreCategoria(votoSingolo, "m4", "cuore")?.nome,
|
|
"Zoe",
|
|
"un voto solo basta se non c'è nessun altro candidato",
|
|
);
|
|
|
|
// Tre candidati: i primi due pari in testa, il terzo staccato. Il pareggio conta comunque,
|
|
// non basta che qualcun altro sia sotto per assegnare la categoria.
|
|
const triplaPari = [
|
|
v("m5", "spirito", "g1", "g8", "Uno"),
|
|
v("m5", "spirito", "g2", "g7", "Due"),
|
|
v("m5", "spirito", "g3", "g6", "Tre"),
|
|
];
|
|
assert.equal(
|
|
vincitoreCategoria(triplaPari, "m5", "spirito"),
|
|
null,
|
|
"primo e secondo pari: nessun vincitore anche con un terzo staccato",
|
|
);
|
|
|
|
// --- mioVotoSocial -----------------------------------------------------------
|
|
assert.equal(mioVotoSocial(voti, "m1", "affidabile", "g1")?.votato_id, "g2");
|
|
assert.equal(mioVotoSocial(voti, "m1", "meme", "g3"), null, "non ho votato questa categoria");
|
|
|
|
// --- badgeSocialVinti: quante volte ho vinto ciascuna categoria --------------
|
|
assert.deepEqual(badgeSocialVinti(voti, "g2"), { affidabile: 2 }, "vinta in m1 e m2");
|
|
assert.deepEqual(badgeSocialVinti(voti, "g5"), { meme: 1 });
|
|
assert.deepEqual(badgeSocialVinti(voti, "g9"), {}, "chi non vince non ha badge");
|
|
assert.deepEqual(badgeSocialVinti(pari, "g2"), {}, "una parità non assegna badge");
|
|
assert.deepEqual(badgeSocialVinti([], "g2"), {});
|
|
|
|
// Categorie e partite diverse non si mischiano: g2 vince "affidabile" in m1/m2 (già sopra) e
|
|
// "fairplay" in m2, un'altra categoria nella stessa partita — i due conteggi restano separati.
|
|
const conAltraCategoria: VotoSocial[] = [
|
|
...voti,
|
|
v("m2", "fairplay", "g3", "g2", "Bruno"),
|
|
v("m2", "fairplay", "g4", "g2", "Bruno"),
|
|
];
|
|
assert.deepEqual(
|
|
badgeSocialVinti(conAltraCategoria, "g2"),
|
|
{ affidabile: 2, fairplay: 1 },
|
|
"vittorie in categorie diverse, anche nella stessa partita, si contano separate",
|
|
);
|
|
|
|
// --- invarianti sulle categorie ----------------------------------------------
|
|
assert.equal(
|
|
new Set(categorieSocial.map((c) => c.id)).size,
|
|
categorieSocial.length,
|
|
"id categoria unici",
|
|
);
|
|
for (const c of categorieSocial) assert.ok(c.nome && c.descrizione && c.emoji);
|
|
|
|
console.log("badge-social: ok");
|