1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from "react";
6 import { mount, configure } from "enzyme";
7 import { TableHead, TableCell, Typography, TableBody, Button, TableSortLabel } from "@material-ui/core";
8 import * as Adapter from "enzyme-adapter-react-16";
9 import { DataTable, DataColumns } from "./data-table";
10 import { DataTableFilters } from "../data-table-filters/data-table-filters";
11 import { SortDirection } from "./data-column";
13 configure({ adapter: new Adapter() });
15 describe("<DataTable />", () => {
16 it("shows only selected columns", () => {
17 const columns: DataColumns<string> = [
20 render: () => <span />,
25 render: () => <span />,
30 render: () => <span />,
34 const dataTable = mount(<DataTable
36 items={[{ key: "1", name: "item 1" }]}
37 onFiltersChange={jest.fn()}
38 onRowClick={jest.fn()}
39 onRowDoubleClick={jest.fn()}
40 onContextMenu={jest.fn()}
41 onSortToggle={jest.fn()} />);
42 expect(dataTable.find(TableHead).find(TableCell)).toHaveLength(2);
45 it("renders column name", () => {
46 const columns: DataColumns<string> = [
49 render: () => <span />,
53 const dataTable = mount(<DataTable
56 onFiltersChange={jest.fn()}
57 onRowClick={jest.fn()}
58 onRowDoubleClick={jest.fn()}
59 onContextMenu={jest.fn()}
60 onSortToggle={jest.fn()} />);
61 expect(dataTable.find(TableHead).find(TableCell).text()).toBe("Column 1");
64 it("uses renderHeader instead of name prop", () => {
65 const columns: DataColumns<string> = [
68 renderHeader: () => <span>Column Header</span>,
69 render: () => <span />,
73 const dataTable = mount(<DataTable
76 onFiltersChange={jest.fn()}
77 onRowClick={jest.fn()}
78 onRowDoubleClick={jest.fn()}
79 onContextMenu={jest.fn()}
80 onSortToggle={jest.fn()} />);
81 expect(dataTable.find(TableHead).find(TableCell).text()).toBe("Column Header");
84 it("passes column key prop to corresponding cells", () => {
85 const columns: DataColumns<string> = [
89 render: () => <span />,
93 const dataTable = mount(<DataTable
96 onFiltersChange={jest.fn()}
97 onRowClick={jest.fn()}
98 onRowDoubleClick={jest.fn()}
99 onContextMenu={jest.fn()}
100 onSortToggle={jest.fn()} />);
101 expect(dataTable.find(TableHead).find(TableCell).key()).toBe("column-1-key");
102 expect(dataTable.find(TableBody).find(TableCell).key()).toBe("column-1-key");
105 it("renders items", () => {
106 const columns: DataColumns<string> = [
109 render: (item) => <Typography>{item}</Typography>,
114 render: (item) => <Button>{item}</Button>,
118 const dataTable = mount(<DataTable
121 onFiltersChange={jest.fn()}
122 onRowClick={jest.fn()}
123 onRowDoubleClick={jest.fn()}
124 onContextMenu={jest.fn()}
125 onSortToggle={jest.fn()} />);
126 expect(dataTable.find(TableBody).find(Typography).text()).toBe("item 1");
127 expect(dataTable.find(TableBody).find(Button).text()).toBe("item 1");
130 it("passes sorting props to <TableSortLabel />", () => {
131 const columns: DataColumns<string> = [{
133 sortDirection: SortDirection.ASC,
135 render: (item) => <Typography>{item}</Typography>
137 const onSortToggle = jest.fn();
138 const dataTable = mount(<DataTable
141 onFiltersChange={jest.fn()}
142 onRowClick={jest.fn()}
143 onRowDoubleClick={jest.fn()}
144 onContextMenu={jest.fn()}
145 onSortToggle={onSortToggle} />);
146 expect(dataTable.find(TableSortLabel).prop("active")).toBeTruthy();
147 dataTable.find(TableSortLabel).at(0).simulate("click");
148 expect(onSortToggle).toHaveBeenCalledWith(columns[0]);
151 it("passes filter props to <DataTableFilter />", () => {
152 const columns: DataColumns<string> = [{
154 sortDirection: SortDirection.ASC,
156 filters: [{ name: "Filter 1", selected: true }],
157 render: (item) => <Typography>{item}</Typography>
159 const onFiltersChange = jest.fn();
160 const dataTable = mount(<DataTable
163 onFiltersChange={onFiltersChange}
164 onRowClick={jest.fn()}
165 onRowDoubleClick={jest.fn()}
166 onSortToggle={jest.fn()}
167 onContextMenu={jest.fn()} />);
168 expect(dataTable.find(DataTableFilters).prop("filters")).toBe(columns[0].filters);
169 dataTable.find(DataTableFilters).prop("onChange")([]);
170 expect(onFiltersChange).toHaveBeenCalledWith([], columns[0]);