@@ -8,6 +8,8 @@ import DataTable, {
8
8
TableHead ,
9
9
TableHeader ,
10
10
TableRow ,
11
+ TableSelectAll ,
12
+ TableSelectRow ,
11
13
TableToolbar ,
12
14
TableToolbarAction ,
13
15
TableToolbarContent ,
@@ -16,9 +18,15 @@ import DataTable, {
16
18
import { sortStates } from '../state/sorting' ;
17
19
import { mount } from 'enzyme' ;
18
20
21
+ // Test helpers
19
22
const getHeaderAt = ( wrapper , index ) =>
20
23
wrapper . find ( 'TableHeader button' ) . at ( index ) ;
24
+ const getRowAt = ( wrapper , index ) => wrapper . find ( 'tbody tr' ) . at ( index ) ;
21
25
const getFilterInput = wrapper => wrapper . find ( 'TableToolbarSearch input' ) ;
26
+ const getSelectAll = wrapper =>
27
+ wrapper . find ( 'TableSelectAll input[type="checkbox"]' ) ;
28
+ const getLastCallFor = mocker =>
29
+ mocker . mock . calls [ mocker . mock . calls . length - 1 ] ;
22
30
23
31
describe ( 'DataTable' , ( ) => {
24
32
let mockProps ;
@@ -164,4 +172,107 @@ describe('DataTable', () => {
164
172
) ;
165
173
} ) ;
166
174
} ) ;
175
+
176
+ describe ( 'selection' , ( ) => {
177
+ let mockProps ;
178
+
179
+ beforeEach ( ( ) => {
180
+ mockProps = {
181
+ rows : [
182
+ {
183
+ id : 'b' ,
184
+ fieldA : 'Field 2:A' ,
185
+ fieldB : 'Field 2:B' ,
186
+ } ,
187
+ {
188
+ id : 'a' ,
189
+ fieldA : 'Field 1:A' ,
190
+ fieldB : 'Field 1:B' ,
191
+ } ,
192
+ {
193
+ id : 'c' ,
194
+ fieldA : 'Field 3:A' ,
195
+ fieldB : 'Field 3:B' ,
196
+ } ,
197
+ ] ,
198
+ headers : [
199
+ {
200
+ key : 'fieldA' ,
201
+ header : 'Field A' ,
202
+ } ,
203
+ {
204
+ key : 'fieldB' ,
205
+ header : 'Field B' ,
206
+ } ,
207
+ ] ,
208
+ locale : 'en' ,
209
+ render : jest . fn (
210
+ ( { rows, headers, getHeaderProps, getSelectionProps } ) => (
211
+ < TableContainer title = "DataTable with selection" >
212
+ < Table >
213
+ < TableHead >
214
+ < TableRow >
215
+ < TableSelectAll { ...getSelectionProps ( ) } />
216
+ { headers . map ( header => (
217
+ < TableHeader { ...getHeaderProps ( { header } ) } >
218
+ { header . header }
219
+ </ TableHeader >
220
+ ) ) }
221
+ </ TableRow >
222
+ </ TableHead >
223
+ < TableBody >
224
+ { rows . map ( row => (
225
+ < TableRow key = { row . id } >
226
+ < TableSelectRow { ...getSelectionProps ( { row } ) } />
227
+ { row . cells . map ( cell => (
228
+ < TableCell key = { cell . id } > { cell . value } </ TableCell >
229
+ ) ) }
230
+ </ TableRow >
231
+ ) ) }
232
+ </ TableBody >
233
+ </ Table >
234
+ </ TableContainer >
235
+ )
236
+ ) ,
237
+ } ;
238
+ } ) ;
239
+
240
+ it ( 'should render' , ( ) => {
241
+ const wrapper = mount ( < DataTable { ...mockProps } /> ) ;
242
+ expect ( wrapper ) . toMatchSnapshot ( ) ;
243
+ } ) ;
244
+
245
+ it ( 'should have select-all default to un-checked if no rows are present' , ( ) => {
246
+ const wrapper = mount ( < DataTable { ...mockProps } rows = { [ ] } /> ) ;
247
+ expect ( wrapper ) . toMatchSnapshot ( ) ;
248
+ } ) ;
249
+
250
+ it ( 'should select all rows if a user interacts with select all' , ( ) => {
251
+ const wrapper = mount ( < DataTable { ...mockProps } /> ) ;
252
+ expect ( getSelectAll ( wrapper ) . prop ( 'checked' ) ) . toBe ( false ) ;
253
+
254
+ getSelectAll ( wrapper ) . simulate ( 'click' ) ;
255
+
256
+ expect ( getSelectAll ( wrapper ) . prop ( 'checked' ) ) . toBe ( true ) ;
257
+
258
+ const { selectedRows } = getLastCallFor ( mockProps . render ) [ 0 ] ;
259
+ expect ( selectedRows . length ) . toBe ( mockProps . rows . length ) ;
260
+ } ) ;
261
+
262
+ it ( 'should select a specific row when a user interacts with select row' , ( ) => {
263
+ const wrapper = mount ( < DataTable { ...mockProps } /> ) ;
264
+ expect ( getSelectAll ( wrapper ) . prop ( 'checked' ) ) . toBe ( false ) ;
265
+
266
+ const beforeInput = getRowAt ( wrapper , 0 ) . find ( 'input[type="checkbox"]' ) ;
267
+ expect ( beforeInput . prop ( 'checked' ) ) . toBe ( false ) ;
268
+
269
+ beforeInput . simulate ( 'click' ) ;
270
+
271
+ const afterInput = getRowAt ( wrapper , 0 ) . find ( 'input[type="checkbox"]' ) ;
272
+ expect ( afterInput . prop ( 'checked' ) ) . toBe ( true ) ;
273
+
274
+ const { selectedRows } = getLastCallFor ( mockProps . render ) [ 0 ] ;
275
+ expect ( selectedRows . length ) . toBe ( 1 ) ;
276
+ } ) ;
277
+ } ) ;
167
278
} ) ;
0 commit comments