content }]}
items={[{ id: "row" }]}
locale={locale}
title="Datos"
/>
);
const cell = html.match(/| ]*>([\s\S]*?)<\/td>/)?.[1];
assert.equal(cell, expected);
}
}
});
test("las columnas opcionales empiezan ocultas sin ocultar identificación ni acciones obligatorias", () => {
const html = renderToStaticMarkup(
item.name,
render: (item) => item.name,
},
{
id: "detail",
label: "Detalle opcional",
defaultVisible: false,
value: (item) => item.detail,
render: (item) => item.detail,
},
{
id: "actions",
label: "Acciones",
defaultVisible: false,
render: () => ,
},
]}
items={[{ id: "one", name: "Equipo", detail: "Información adicional" }]}
title="Activos"
/>
);
assert.ok(html.includes("Equipo"));
assert.ok(html.includes("Editar"));
assert.equal(html.includes("Información adicional"), false);
assert.equal(html.includes("Detalle opcional"), false);
});
test("Nombre ordena sin tildes ni mayúsculas antes de paginar, en español e inglés", () => {
const names = [
"Zorro",
"Úrsula",
"Óscar",
"María",
"Luis",
"Íñigo",
"Hugo",
"Gabriel",
"Félix",
"Érica",
"David",
"Celia",
"Bruno",
"Álvaro",
];
const expected = [
"Álvaro",
"Bruno",
"Celia",
"David",
"Érica",
"Félix",
"Gabriel",
"Hugo",
"Íñigo",
"Luis",
];
for (const locale of ["es", "en"]) {
const html = renderToStaticMarkup(
({ id: String(index), name }))}
locale={locale}
title="Personas"
/>
);
let previous = -1;
for (const name of expected) {
const position = html.indexOf(`>${name}<`);
assert.ok(position > previous, `${locale}: ${name} debe respetar el orden alfabético`);
previous = position;
}
assert.equal(html.includes(">Zorro<"), false);
assert.equal(html.includes(">María<"), false);
}
});
test("Nombre tiene prioridad inicial aunque otra columna comparable aparezca antes", () => {
const html = renderToStaticMarkup(
item.id, render: (item) => item.id },
...columns,
]}
items={[
{ id: "1", name: "Zoe" },
{ id: "2", name: "álvaro" },
{ id: "3", name: "Bruno" },
]}
title="Personas"
/>
);
assert.ok(html.indexOf(">álvaro<") < html.indexOf(">Bruno<"));
assert.ok(html.indexOf(">Bruno<") < html.indexOf(">Zoe<"));
});
test("Nombre conserva empates entre acentos, mayúsculas y Unicode compuesto al ordenar descendente", () => {
const html = renderToStaticMarkup(
item.name,
render: (item) => item.id,
},
]}
items={[
{ id: "accent-first", name: "Álvaro" },
{ id: "plain-second", name: "alvaro" },
{ id: "unicode-third", name: "A\u0301LVARO" },
{ id: "last-alphabetically", name: "Zoe" },
{ id: "middle-alphabetically", name: "Érica" },
]}
title="Personas"
/>
);
const expected = [
"last-alphabetically",
"middle-alphabetically",
"accent-first",
"plain-second",
"unicode-third",
];
let previous = -1;
for (const id of expected) {
const position = html.indexOf(`>${id}<`);
assert.ok(position > previous);
previous = position;
}
assert.ok(html.includes('aria-sort="descending"'));
});
test("paginación por cursor: navegación accesible y límites sin inventar totales", () => {
const html = renderToStaticMarkup(
undefined}
onPrevious={() => undefined}
onRestart={() => undefined}
pending={false}
previousLabel="Anterior"
restartLabel="Primera página"
/>
);
assert.ok(html.includes(" |