99ed2daffb52ab5c1c0cf051205eb5ac28e96806
[arvados-workbench2.git] / src / components / data-table / data-table.test.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
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";
12
13 configure({ adapter: new Adapter() });
14
15 describe("<DataTable />", () => {
16     it("shows only selected columns", () => {
17         const columns: DataColumns<string> = [
18             {
19                 name: "Column 1",
20                 render: () => <span />,
21                 selected: true
22             },
23             {
24                 name: "Column 2",
25                 render: () => <span />,
26                 selected: true
27             },
28             {
29                 name: "Column 3",
30                 render: () => <span />,
31                 selected: false
32             }
33         ];
34         const dataTable = mount(<DataTable
35             columns={columns}
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);
43     });
44
45     it("renders column name", () => {
46         const columns: DataColumns<string> = [
47             {
48                 name: "Column 1",
49                 render: () => <span />,
50                 selected: true
51             }
52         ];
53         const dataTable = mount(<DataTable
54             columns={columns}
55             items={["item 1"]}
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");
62     });
63
64     it("uses renderHeader instead of name prop", () => {
65         const columns: DataColumns<string> = [
66             {
67                 name: "Column 1",
68                 renderHeader: () => <span>Column Header</span>,
69                 render: () => <span />,
70                 selected: true
71             }
72         ];
73         const dataTable = mount(<DataTable
74             columns={columns}
75             items={[]}
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");
82     });
83
84     it("passes column key prop to corresponding cells", () => {
85         const columns: DataColumns<string> = [
86             {
87                 name: "Column 1",
88                 key: "column-1-key",
89                 render: () => <span />,
90                 selected: true
91             }
92         ];
93         const dataTable = mount(<DataTable
94             columns={columns}
95             items={["item 1"]}
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");
103     });
104
105     it("renders items", () => {
106         const columns: DataColumns<string> = [
107             {
108                 name: "Column 1",
109                 render: (item) => <Typography>{item}</Typography>,
110                 selected: true
111             },
112             {
113                 name: "Column 2",
114                 render: (item) => <Button>{item}</Button>,
115                 selected: true
116             }
117         ];
118         const dataTable = mount(<DataTable
119             columns={columns}
120             items={["item 1"]}
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");
128     });
129
130     it("passes sorting props to <TableSortLabel />", () => {
131         const columns: DataColumns<string> = [{
132             name: "Column 1",
133             sortDirection: SortDirection.ASC,
134             selected: true,
135             render: (item) => <Typography>{item}</Typography>
136         }];
137         const onSortToggle = jest.fn();
138         const dataTable = mount(<DataTable
139             columns={columns}
140             items={["item 1"]}
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]);
149     });
150
151     it("passes filter props to <DataTableFilter />", () => {
152         const columns: DataColumns<string> = [{
153             name: "Column 1",
154             sortDirection: SortDirection.ASC,
155             selected: true,
156             filters: [{ name: "Filter 1", selected: true }],
157             render: (item) => <Typography>{item}</Typography>
158         }];
159         const onFiltersChange = jest.fn();
160         const dataTable = mount(<DataTable
161             columns={columns}
162             items={[]}
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]);
171     });
172 });