import assert from "node:assert/strict";
import test from "node:test";
import {
assertPlausibleChange,
formatChanges,
getChanges,
getGuildMembers,
parseGuildMembers,
} from "../src/features/membersChecker.js";
const guildPage = (members) => `
-
${members
.map(
(member) =>
`${member}`,
)
.join("")}
`;
test("parseGuildMembers extrait et nettoie les noms", () => {
assert.deepEqual(parseGuildMembers(guildPage([" Alpha ", "Beta"])), ["Alpha", "Beta"]);
});
test("parseGuildMembers refuse une page sans membres", () => {
assert.throws(() => parseGuildMembers(""), /Aucun membre trouvé/);
});
test("parseGuildMembers refuse les doublons", () => {
assert.throws(() => parseGuildMembers(guildPage(["Alpha", "Alpha"])), /double/);
});
test("getChanges détecte les arrivées et départs", () => {
assert.deepEqual(getChanges(["Alpha", "Beta"], ["Beta", "Gamma"]), {
added: ["Gamma"],
removed: ["Alpha"],
});
});
test("assertPlausibleChange refuse une chute brutale de l'effectif", () => {
const oldMembers = Array.from({ length: 20 }, (_, index) => `Membre-${index}`);
assert.throws(
() => assertPlausibleChange(oldMembers, ["Membre-0", "Membre-1"]),
/Extraction suspecte/,
);
});
test("formatChanges produit le message Discord", () => {
assert.equal(
formatChanges({ added: ["Gamma"], removed: ["Alpha"] }),
"⚔️ **Changement dans la liste des membres :**\n" +
"➕ Nouveaux membres : Gamma\n" +
"➖ Membres partis : Alpha",
);
});
test("getGuildMembers refuse une erreur HTTP", async () => {
const fakeFetch = async () => ({ ok: false, status: 503 });
await assert.rejects(getGuildMembers("https://example.test", fakeFetch), /HTTP 503/);
});