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";
12 configure({ adapter: new Adapter() });
14 describe("<DataTable />", () => {
15 it("shows only selected columns", () => {
16 const columns: DataColumns<string> = [
19 render: () => <span />,
24 render: () => <span />,
29 render: () => <span />,
33 const dataTable = mount(<DataTable
36 onFiltersChange={jest.fn()}
37 onRowClick={jest.fn()}
38 onRowContextMenu={jest.fn()}
39 onSortToggle={jest.fn()} />);
40 expect(dataTable.find(TableHead).find(TableCell)).toHaveLength(2);
43 it("renders column name", () => {
44 const columns: DataColumns<string> = [
47 render: () => <span />,
51 const dataTable = mount(<DataTable
54 onFiltersChange={jest.fn()}
55 onRowClick={jest.fn()}
56 onRowContextMenu={jest.fn()}
57 onSortToggle={jest.fn()} />);
58 expect(dataTable.find(TableHead).find(TableCell).text()).toBe("Column 1");
61 it("uses renderHeader instead of name prop", () => {
62 const columns: DataColumns<string> = [
65 renderHeader: () => <span>Column Header</span>,
66 render: () => <span />,
70 const dataTable = mount(<DataTable
73 onFiltersChange={jest.fn()}
74 onRowClick={jest.fn()}
75 onRowContextMenu={jest.fn()}
76 onSortToggle={jest.fn()} />);
77 expect(dataTable.find(TableHead).find(TableCell).text()).toBe("Column Header");
80 it("passes column key prop to corresponding cells", () => {
81 const columns: DataColumns<string> = [
85 render: () => <span />,
89 const dataTable = mount(<DataTable
92 onFiltersChange={jest.fn()}
93 onRowClick={jest.fn()}
94 onRowContextMenu={jest.fn()}
95 onSortToggle={jest.fn()} />);
96 expect(dataTable.find(TableHead).find(TableCell).key()).toBe("column-1-key");
97 expect(dataTable.find(TableBody).find(TableCell).key()).toBe("column-1-key");
100 it("shows information that items array is empty", () => {
101 const columns: DataColumns<string> = [
104 render: () => <span />,
108 const dataTable = mount(<DataTable
111 onFiltersChange={jest.fn()}
112 onRowClick={jest.fn()}
113 onRowContextMenu={jest.fn()}
114 onSortToggle={jest.fn()} />);
115 expect(dataTable.find(Typography).text()).toBe("No items");
118 it("renders items", () => {
119 const columns: DataColumns<string> = [
122 render: (item) => <Typography>{item}</Typography>,
127 render: (item) => <Button>{item}</Button>,
131 const dataTable = mount(<DataTable
134 onFiltersChange={jest.fn()}
135 onRowClick={jest.fn()}
136 onRowContextMenu={jest.fn()}
137 onSortToggle={jest.fn()} />);
138 expect(dataTable.find(TableBody).find(Typography).text()).toBe("item 1");
139 expect(dataTable.find(TableBody).find(Button).text()).toBe("item 1");
142 it("passes sorting props to <TableSortLabel />", () => {
143 const columns: DataColumns<string> = [{
145 sortDirection: "asc",
147 render: (item) => <Typography>{item}</Typography>
149 const onSortToggle = jest.fn();
150 const dataTable = mount(<DataTable
153 onFiltersChange={jest.fn()}
154 onRowClick={jest.fn()}
155 onRowContextMenu={jest.fn()}
156 onSortToggle={onSortToggle}/>);
157 expect(dataTable.find(TableSortLabel).prop("active")).toBeTruthy();
158 dataTable.find(TableSortLabel).at(0).simulate("click");
159 expect(onSortToggle).toHaveBeenCalledWith(columns[0]);
162 it("passes filter props to <DataTableFilter />", () => {
163 const columns: DataColumns<string> = [{
165 sortDirection: "asc",
167 filters: [{name: "Filter 1", selected: true}],
168 render: (item) => <Typography>{item}</Typography>
170 const onFiltersChange = jest.fn();
171 const dataTable = mount(<DataTable
174 onFiltersChange={onFiltersChange}
175 onRowClick={jest.fn()}
176 onRowContextMenu={jest.fn()}
177 onSortToggle={jest.fn()}/>);
178 expect(dataTable.find(DataTableFilters).prop("filters")).toBe(columns[0].filters);
179 dataTable.find(DataTableFilters).prop("onChange")([]);
180 expect(onFiltersChange).toHaveBeenCalledWith([], columns[0]);