mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 21:47:20 +00:00
## #20535 ~https://github.com/user-attachments/assets/4c39bd5d-3d75-46f0-9f39-05ec36dac0d0~ ### Improved solution: **Flow**:  **Just loading state:** <img width="1617" alt="Screenshot 2024-08-19 at 11 50 18 AM" src="https://github.com/user-attachments/assets/df429956-0699-4e73-a017-4022013ccce4"> **** - [x] Changes file added for user-visible changes in `changes/` - [x] Manual QA for all new/changed functionality --------- Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
233 lines
6.1 KiB
TypeScript
233 lines
6.1 KiB
TypeScript
import React from "react";
|
|
import { render, screen } from "@testing-library/react";
|
|
import { noop } from "lodash";
|
|
import DataTable from "./DataTable";
|
|
|
|
const DEFAULT_PAGE_SIZE = 20;
|
|
|
|
describe("DataTable - component", () => {
|
|
it("renders a data table based on the columns and data passed in", () => {
|
|
const columns = [
|
|
{
|
|
title: "Name",
|
|
Header: "Name",
|
|
accessor: "name",
|
|
disableHidden: false,
|
|
},
|
|
];
|
|
|
|
const data = [{ name: "Test User", id: 1 }];
|
|
|
|
render(
|
|
<DataTable
|
|
columns={columns}
|
|
data={data}
|
|
sortHeader="name"
|
|
sortDirection="desc"
|
|
isLoading={false}
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
/>
|
|
);
|
|
|
|
const nameHeader = screen.getByText("Name");
|
|
const nameDataCell = screen.getByText("Test User");
|
|
expect(nameHeader).toBeInTheDocument();
|
|
expect(nameDataCell).toBeInTheDocument();
|
|
});
|
|
|
|
it("renders correctly given a sort header", () => {
|
|
const columns = [
|
|
{
|
|
title: "Name",
|
|
Header: "Name",
|
|
accessor: "name",
|
|
disableHidden: false,
|
|
},
|
|
{
|
|
title: "Address",
|
|
Header: "Address",
|
|
accessor: "address",
|
|
disableHidden: false,
|
|
},
|
|
];
|
|
|
|
// 'name' attribute is how we want to sort the data
|
|
const { rerender } = render(
|
|
<DataTable
|
|
columns={columns}
|
|
data={[
|
|
{ name: "foo user", address: "biz address" },
|
|
{ name: "bar user", address: "daz address" },
|
|
]}
|
|
sortHeader="name"
|
|
sortDirection="desc"
|
|
isLoading={false}
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
/>
|
|
);
|
|
|
|
let dataCells = screen.getAllByRole("cell");
|
|
let firstNameInTableCell = dataCells[0];
|
|
let secondNameInTableCell = dataCells[2];
|
|
expect(firstNameInTableCell).toHaveTextContent("foo user");
|
|
expect(secondNameInTableCell).toHaveTextContent("bar user");
|
|
|
|
// now want to sort on 'address' attribute
|
|
rerender(
|
|
<DataTable
|
|
columns={columns}
|
|
data={[
|
|
{ name: "foo user", address: "biz address" },
|
|
{ name: "bar user", address: "daz address" },
|
|
]}
|
|
sortHeader="address"
|
|
sortDirection="desc"
|
|
isLoading={false}
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
/>
|
|
);
|
|
|
|
dataCells = screen.getAllByRole("cell");
|
|
firstNameInTableCell = dataCells[1];
|
|
secondNameInTableCell = dataCells[3];
|
|
expect(firstNameInTableCell).toHaveTextContent("daz address");
|
|
expect(secondNameInTableCell).toHaveTextContent("biz address");
|
|
});
|
|
|
|
it("renders correctly given a sortDirection", () => {
|
|
const columns = [
|
|
{
|
|
title: "Name",
|
|
Header: "Name",
|
|
accessor: "name",
|
|
disableHidden: false,
|
|
},
|
|
];
|
|
|
|
// testing 'desc' data
|
|
const { rerender } = render(
|
|
<DataTable
|
|
columns={columns}
|
|
data={[{ name: "foo user" }, { name: "bar user" }]}
|
|
sortHeader="name"
|
|
sortDirection="desc"
|
|
isLoading={false}
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
/>
|
|
);
|
|
|
|
let dataCells = screen.getAllByRole("cell");
|
|
let firstNameInTableCell = dataCells[0];
|
|
let secondNameInTableCell = dataCells[1];
|
|
expect(firstNameInTableCell).toHaveTextContent("foo user");
|
|
expect(secondNameInTableCell).toHaveTextContent("bar user");
|
|
|
|
// testing 'asc' data
|
|
rerender(
|
|
<DataTable
|
|
columns={columns}
|
|
data={[{ name: "foo user" }, { name: "bar user" }]}
|
|
sortHeader="name"
|
|
sortDirection="asc"
|
|
isLoading={false}
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
/>
|
|
);
|
|
|
|
dataCells = screen.getAllByRole("cell");
|
|
firstNameInTableCell = dataCells[0];
|
|
secondNameInTableCell = dataCells[1];
|
|
expect(firstNameInTableCell).toHaveTextContent("bar user");
|
|
expect(secondNameInTableCell).toHaveTextContent("foo user");
|
|
});
|
|
|
|
it("does not render help text when no rows are present", () => {
|
|
const columns = [
|
|
{
|
|
title: "Name",
|
|
Header: "Name",
|
|
accessor: "name",
|
|
disableHidden: false,
|
|
},
|
|
];
|
|
|
|
const data: any = [];
|
|
|
|
render(
|
|
<DataTable
|
|
columns={columns}
|
|
data={data}
|
|
sortHeader="name"
|
|
sortDirection="desc"
|
|
isLoading
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
renderTableHelpText={() => <div>Help text</div>}
|
|
/>
|
|
);
|
|
|
|
const helpText = screen.queryByText("Help text");
|
|
expect(helpText).toBeNull();
|
|
});
|
|
it("renders help text when rows are present", () => {
|
|
const columns = [
|
|
{
|
|
title: "Name",
|
|
Header: "Name",
|
|
accessor: "name",
|
|
disableHidden: false,
|
|
},
|
|
];
|
|
|
|
const data = [{ name: "Gabe" }];
|
|
|
|
render(
|
|
<DataTable
|
|
columns={columns}
|
|
data={data}
|
|
sortHeader="name"
|
|
sortDirection="desc"
|
|
isLoading={false}
|
|
onSort={noop}
|
|
showMarkAllPages={false}
|
|
isAllPagesSelected={false}
|
|
resultsTitle="users"
|
|
defaultPageSize={DEFAULT_PAGE_SIZE}
|
|
disableMultiRowSelect={false}
|
|
renderTableHelpText={() => <div>Help text</div>}
|
|
/>
|
|
);
|
|
|
|
const helpText = screen.getByText("Help text");
|
|
expect(helpText).toBeInTheDocument();
|
|
});
|
|
});
|