1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from "react";
6 import { mount, configure } from "enzyme";
7 import { pipe } from "lodash/fp";
8 import { TableHead, TableCell, Typography, TableBody, Button, TableSortLabel } from "@material-ui/core";
9 import Adapter from "enzyme-adapter-react-16";
10 import { DataTable, DataColumns } from "./data-table";
11 import { SortDirection, createDataColumn } from "./data-column";
12 import { DataTableFiltersPopover } from "components/data-table-filters/data-table-filters-popover";
13 import { createTree, setNode, initTreeNode } from "models/tree";
14 import { DataTableFilterItem } from "components/data-table-filters/data-table-filters-tree";
16 configure({ adapter: new Adapter() });
18 describe("<DataTable />", () => {
19 it("shows only selected columns", () => {
20 const columns: DataColumns<string, string> = [
23 render: () => <span />,
29 render: () => <span />,
35 render: () => <span />,
40 const dataTable = mount(
43 items={[{ key: "1", name: "item 1" }]}
44 onFiltersChange={jest.fn()}
45 onRowClick={jest.fn()}
46 onRowDoubleClick={jest.fn()}
47 onContextMenu={jest.fn()}
48 onSortToggle={jest.fn()}
49 setCheckedListOnStore={jest.fn()}
53 expect(dataTable.find(TableHead).find(TableCell)).toHaveLength(3);
56 it("renders column name", () => {
57 const columns: DataColumns<string, string> = [
60 render: () => <span />,
65 const dataTable = mount(
69 onFiltersChange={jest.fn()}
70 onRowClick={jest.fn()}
71 onRowDoubleClick={jest.fn()}
72 onContextMenu={jest.fn()}
73 onSortToggle={jest.fn()}
74 setCheckedListOnStore={jest.fn()}
78 expect(dataTable.find(TableHead).find(TableCell).last().text()).toBe("Column 1");
81 it("uses renderHeader instead of name prop", () => {
82 const columns: DataColumns<string, string> = [
85 renderHeader: () => <span>Column Header</span>,
86 render: () => <span />,
91 const dataTable = mount(
95 onFiltersChange={jest.fn()}
96 onRowClick={jest.fn()}
97 onRowDoubleClick={jest.fn()}
98 onContextMenu={jest.fn()}
99 onSortToggle={jest.fn()}
100 setCheckedListOnStore={jest.fn()}
104 expect(dataTable.find(TableHead).find(TableCell).last().text()).toBe("Column Header");
107 it("passes column key prop to corresponding cells", () => {
108 const columns: DataColumns<string, string> = [
112 render: () => <span />,
117 const dataTable = mount(
122 onFiltersChange={jest.fn()}
123 onRowClick={jest.fn()}
124 onRowDoubleClick={jest.fn()}
125 onContextMenu={jest.fn()}
126 onSortToggle={jest.fn()}
127 setCheckedListOnStore={jest.fn()}
132 expect(dataTable.find(TableBody).find(TableCell).last().key()).toBe("column-1-key");
136 it("renders items", () => {
137 const columns: DataColumns<string, string> = [
140 render: item => <Typography>{item}</Typography>,
146 render: item => <Button>{item}</Button>,
151 const dataTable = mount(
156 onFiltersChange={jest.fn()}
157 onRowClick={jest.fn()}
158 onRowDoubleClick={jest.fn()}
159 onContextMenu={jest.fn()}
160 onSortToggle={jest.fn()}
161 setCheckedListOnStore={jest.fn()}
166 expect(dataTable.find(TableBody).find(Typography).last().text()).toBe("item 1");
167 expect(dataTable.find(TableBody).find(Button).last().text()).toBe("item 1");
171 it("passes sorting props to <TableSortLabel />", () => {
172 const columns: DataColumns<string, string> = [
175 sort: { direction: SortDirection.ASC, field: "length" },
178 render: item => <Typography>{item}</Typography>,
181 const onSortToggle = jest.fn();
182 const dataTable = mount(
186 onFiltersChange={jest.fn()}
187 onRowClick={jest.fn()}
188 onRowDoubleClick={jest.fn()}
189 onContextMenu={jest.fn()}
190 onSortToggle={onSortToggle}
191 setCheckedListOnStore={jest.fn()}
195 expect(dataTable.find(TableSortLabel).prop("active")).toBeTruthy();
196 dataTable.find(TableSortLabel).at(0).simulate("click");
197 expect(onSortToggle).toHaveBeenCalledWith(columns[1]);
200 it("does not display <DataTableFiltersPopover /> if there is no filters provided", () => {
201 const columns: DataColumns<string, string> = [
207 render: item => <Typography>{item}</Typography>,
210 const onFiltersChange = jest.fn();
211 const dataTable = mount(
215 onFiltersChange={onFiltersChange}
216 onRowClick={jest.fn()}
217 onRowDoubleClick={jest.fn()}
218 onSortToggle={jest.fn()}
219 onContextMenu={jest.fn()}
220 setCheckedListOnStore={jest.fn()}
224 expect(dataTable.find(DataTableFiltersPopover)).toHaveLength(0);
227 it("passes filter props to <DataTableFiltersPopover />", () => {
228 const filters = pipe(() => createTree<DataTableFilterItem>(), setNode(initTreeNode({ id: "filter", value: { name: "filter" } })));
229 const columns: DataColumns<string, string> = [
235 render: item => <Typography>{item}</Typography>,
238 const onFiltersChange = jest.fn();
239 const dataTable = mount(
243 onFiltersChange={onFiltersChange}
244 onRowClick={jest.fn()}
245 onRowDoubleClick={jest.fn()}
246 onSortToggle={jest.fn()}
247 onContextMenu={jest.fn()}
248 setCheckedListOnStore={jest.fn()}
252 expect(dataTable.find(DataTableFiltersPopover).prop("filters")).toBe(columns[1].filters);
253 dataTable.find(DataTableFiltersPopover).prop("onChange")([]);
254 expect(onFiltersChange).toHaveBeenCalledWith([], columns[1]);