73 lines
2.7 KiB
TypeScript
73 lines
2.7 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import * as XLSX from "xlsx";
|
|
import { parseAssociationDirectoryWorkbook, resolveAssociationDirectoryImportRows } from "./associationDirectory";
|
|
|
|
function createWorkbookBuffer(rows: unknown[][]) {
|
|
const worksheet = XLSX.utils.aoa_to_sheet(rows);
|
|
const workbook = XLSX.utils.book_new();
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, "Associations");
|
|
return XLSX.write(workbook, { type: "buffer", bookType: "xlsx" });
|
|
}
|
|
|
|
describe("association directory import parser", () => {
|
|
it("parses valid workbook rows", () => {
|
|
const buffer = createWorkbookBuffer([
|
|
["Nom association", "Email officiel", "Ville"],
|
|
["Association A", "asso-a@example.com", "Kourou"],
|
|
["Association B", "asso-b@example.com", "Sinnamary"],
|
|
]);
|
|
|
|
const result = parseAssociationDirectoryWorkbook(buffer, "bordereau.xlsx");
|
|
|
|
expect(result.totalRows).toBe(2);
|
|
expect(result.validRows).toBe(2);
|
|
expect(result.missingEmailRows).toBe(0);
|
|
expect(result.duplicateEmailRows).toBe(0);
|
|
});
|
|
|
|
it("flags rows without email", () => {
|
|
const buffer = createWorkbookBuffer([
|
|
["Nom association", "Email officiel", "Ville"],
|
|
["Association A", "", "Kourou"],
|
|
]);
|
|
|
|
const result = parseAssociationDirectoryWorkbook(buffer, "bordereau.xlsx");
|
|
|
|
expect(result.totalRows).toBe(1);
|
|
expect(result.validRows).toBe(0);
|
|
expect(result.missingEmailRows).toBe(1);
|
|
});
|
|
|
|
it("flags duplicate emails in the same workbook", () => {
|
|
const buffer = createWorkbookBuffer([
|
|
["Nom association", "Email officiel", "Ville"],
|
|
["Association A", "same@example.com", "Kourou"],
|
|
["Association B", "same@example.com", "Macouria"],
|
|
]);
|
|
|
|
const result = parseAssociationDirectoryWorkbook(buffer, "bordereau.xlsx");
|
|
|
|
expect(result.validRows).toBe(0);
|
|
expect(result.duplicateEmailRows).toBe(2);
|
|
expect(result.duplicateGroups).toHaveLength(1);
|
|
expect(result.duplicateGroups[0]?.options).toHaveLength(2);
|
|
});
|
|
|
|
it("can resolve one row per duplicate email group", () => {
|
|
const buffer = createWorkbookBuffer([
|
|
["Nom association", "Email officiel", "Ville"],
|
|
["Association A", "same@example.com", "Kourou"],
|
|
["Association B", "same@example.com", "Macouria"],
|
|
["Association C", "", "Sinnamary"],
|
|
]);
|
|
|
|
const result = parseAssociationDirectoryWorkbook(buffer, "bordereau.xlsx");
|
|
const resolvedRows = resolveAssociationDirectoryImportRows(result, {
|
|
"same@example.com": 2,
|
|
});
|
|
|
|
expect(resolvedRows).toHaveLength(2);
|
|
expect(resolvedRows.some(row => row.nomAssociation === "Association A")).toBe(true);
|
|
expect(resolvedRows.some(row => row.nomAssociation === "Association C")).toBe(true);
|
|
});
|
|
});
|