63 lines
2.7 KiB
TypeScript
63 lines
2.7 KiB
TypeScript
function assertEqual<T>(actual: T, expected: T, message: string): void {
|
|
if (actual !== expected) throw new Error(`${message}: expected ${String(expected)}, got ${String(actual)}`);
|
|
}
|
|
|
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
import { DataGridEmptyAction, DataGridRowActions } from "../src/components/table/DataGrid";
|
|
import TableActionGroup, { runTableAction } from "../src/components/table/TableActionGroup";
|
|
|
|
function noop() {}
|
|
|
|
function buttonCount(markup: string): number {
|
|
return markup.match(/<button\b/g)?.length ?? 0;
|
|
}
|
|
|
|
function nonSubmittingButtonCount(markup: string): number {
|
|
return markup.match(/<button\b[^>]*\btype="button"/g)?.length ?? 0;
|
|
}
|
|
|
|
const rowActions = renderToStaticMarkup(
|
|
<form>
|
|
<DataGridRowActions onAddBelow={noop} onRemove={noop} onMoveUp={noop} onMoveDown={noop} />
|
|
</form>
|
|
);
|
|
assertEqual(buttonCount(rowActions), 4, "row actions render the expected controls");
|
|
assertEqual(nonSubmittingButtonCount(rowActions), 4, "row actions do not submit an enclosing form");
|
|
|
|
const emptyAction = renderToStaticMarkup(
|
|
<form>
|
|
<DataGridEmptyAction onAdd={noop} />
|
|
</form>
|
|
);
|
|
assertEqual(buttonCount(emptyAction), 1, "empty action renders the expected control");
|
|
assertEqual(nonSubmittingButtonCount(emptyAction), 1, "empty action does not submit an enclosing form");
|
|
|
|
const contextActions = renderToStaticMarkup(
|
|
<TableActionGroup
|
|
actions={[
|
|
{ id: "inspect", label: "Inspect", icon: <span>I</span>, onClick: noop },
|
|
{ id: "edit", label: "Edit", icon: <span>E</span>, applicable: false, onClick: noop },
|
|
{ id: "remove", label: "Remove", icon: <span>R</span>, disabled: true, onClick: noop }
|
|
]}
|
|
/>
|
|
);
|
|
assertEqual(buttonCount(contextActions), 2, "table action groups omit actions that do not apply");
|
|
assertEqual(nonSubmittingButtonCount(contextActions), 2, "table action groups do not submit an enclosing form");
|
|
assertEqual(contextActions.includes('aria-label="Inspect"'), true, "table actions expose an accessible label");
|
|
assertEqual(contextActions.includes('title="Inspect"'), true, "table actions expose a native tooltip");
|
|
assertEqual(contextActions.includes('aria-hidden="true"'), true, "table action icons stay decorative");
|
|
|
|
let propagationStopped = false;
|
|
let actionCalled = false;
|
|
runTableAction(
|
|
{ stopPropagation: () => { propagationStopped = true; } },
|
|
() => { actionCalled = true; }
|
|
);
|
|
assertEqual(propagationStopped, true, "table actions do not trigger clickable row handlers");
|
|
assertEqual(actionCalled, true, "table actions still invoke their handler");
|
|
|
|
const noReorderActions = renderToStaticMarkup(
|
|
<DataGridRowActions onAddBelow={noop} onRemove={noop} />
|
|
);
|
|
assertEqual(buttonCount(noReorderActions), 2, "row actions omit reorder controls when ordering does not apply");
|