@@ -74,7 +74,7 @@ describe('DataTable', () => {
74
74
);
75
75
}
76
76
77
- const createComponent = (Component, props = {}) => {
77
+ const createComponent = ({ Component = DataTable, ... props } = {}) => {
78
78
const wrapper = mount(
79
79
<Component columns={fakeColumns} rows={fakeRows} {...props} />,
80
80
@@ -87,8 +87,8 @@ describe('DataTable', () => {
87
87
};
88
88
89
89
it('sets appropriate table attributes', () => {
90
- const wrapper = createComponent(DataTable );
91
- const interactiveWrapper = createComponent(DataTable, {
90
+ const wrapper = createComponent();
91
+ const interactiveWrapper = createComponent({
92
92
onSelectRow: sinon.stub(),
93
93
});
94
94
const outer = wrapper.find('Table');
@@ -105,7 +105,7 @@ describe('DataTable', () => {
105
105
106
106
describe('table columns', () => {
107
107
it('renders a column header for each column', () => {
108
- const wrapper = createComponent(DataTable );
108
+ const wrapper = createComponent();
109
109
const tableHead = wrapper.find('TableHead');
110
110
111
111
assert.equal(tableHead.find('th').length, 3);
@@ -115,7 +115,7 @@ describe('DataTable', () => {
115
115
});
116
116
117
117
it('applies extra column classes', () => {
118
- const wrapper = createComponent(DataTable );
118
+ const wrapper = createComponent();
119
119
const tableHead = wrapper.find('TableHead');
120
120
121
121
assert.isTrue(tableHead.find('th').at(0).hasClass('w-[50%]'));
@@ -124,15 +124,15 @@ describe('DataTable', () => {
124
124
125
125
describe('table rows', () => {
126
126
it('renders one table row per row provided', () => {
127
- const wrapper = createComponent(DataTable );
127
+ const wrapper = createComponent();
128
128
assert.equal(
129
129
wrapper.find('TableBody').find('TableRow').length,
130
130
fakeRows.length,
131
131
);
132
132
});
133
133
134
134
it('renders fields that are defined by columns', () => {
135
- const wrapper = createComponent(DataTable );
135
+ const wrapper = createComponent();
136
136
const firstRow = wrapper.find('TableBody').find('TableRow').first();
137
137
138
138
assert.equal(firstRow.find('td').at(0).text(), 'Chocolate Cake');
@@ -157,7 +157,7 @@ describe('DataTable', () => {
157
157
158
158
const rows = [fakeRows[3]];
159
159
160
- const wrapper = createComponent(DataTable, {
160
+ const wrapper = createComponent({
161
161
renderItem: formatCell,
162
162
rows,
163
163
columns,
@@ -177,7 +177,7 @@ describe('DataTable', () => {
177
177
describe('interacting with row data', () => {
178
178
it('invokes `onSelectRow` callback when row is clicked', () => {
179
179
const onSelectRow = sinon.stub();
180
- const wrapper = createComponent(DataTable, {
180
+ const wrapper = createComponent({
181
181
onSelectRow,
182
182
});
183
183
@@ -188,7 +188,8 @@ describe('DataTable', () => {
188
188
189
189
it('invokes `onSelectRows` callback when rows are clicked', () => {
190
190
const onSelectRows = sinon.stub();
191
- const wrapper = createComponent(MultiSelectDataTable, {
191
+ const wrapper = createComponent({
192
+ Component: MultiSelectDataTable,
192
193
onSelectRows,
193
194
});
194
195
@@ -212,7 +213,7 @@ describe('DataTable', () => {
212
213
213
214
it('invokes `onSelectRow` when row is selected with arrow keys', () => {
214
215
const onSelectRow = sinon.stub();
215
- const wrapper = createComponent(DataTable, {
216
+ const wrapper = createComponent({
216
217
onSelectRow,
217
218
});
218
219
@@ -229,7 +230,8 @@ describe('DataTable', () => {
229
230
230
231
it('invokes `onSelectRows` callback when rows are selected with arrow keys', () => {
231
232
const onSelectRows = sinon.stub();
232
- const wrapper = createComponent(MultiSelectDataTable, {
233
+ const wrapper = createComponent({
234
+ Component: MultiSelectDataTable,
233
235
onSelectRows,
234
236
});
235
237
@@ -252,7 +254,7 @@ describe('DataTable', () => {
252
254
253
255
it('invokes `onConfirmRow` callback when row is double-clicked', () => {
254
256
const onConfirmRow = sinon.stub();
255
- const wrapper = createComponent(DataTable, {
257
+ const wrapper = createComponent({
256
258
onConfirmRow,
257
259
});
258
260
@@ -263,7 +265,7 @@ describe('DataTable', () => {
263
265
264
266
it('invokes `onConfirmRow` callback when `Enter` is pressed on a row', () => {
265
267
const onConfirmRow = sinon.stub();
266
- const wrapper = createComponent(DataTable, {
268
+ const wrapper = createComponent({
267
269
onConfirmRow,
268
270
});
269
271
@@ -275,46 +277,46 @@ describe('DataTable', () => {
275
277
276
278
context('when loading', () => {
277
279
it('renders a loading spinner', () => {
278
- const wrapper = createComponent(DataTable, { loading: true });
280
+ const wrapper = createComponent({ loading: true });
279
281
assert.isTrue(wrapper.find('SpinnerSpokesIcon').exists());
280
282
});
281
283
282
284
it('does not render any data', () => {
283
- const wrapper = createComponent(DataTable, { loading: true });
285
+ const wrapper = createComponent({ loading: true });
284
286
// One row, which holds the spinner
285
287
assert.equal(wrapper.find('tbody tr').length, 1);
286
288
});
287
289
288
290
it('still renders headings', () => {
289
- const wrapper = createComponent(DataTable, { loading: true });
291
+ const wrapper = createComponent({ loading: true });
290
292
assert.equal(wrapper.find('thead tr th').length, 3);
291
293
});
292
294
293
295
it('does not render a TableFoot', () => {
294
- const wrapper = createComponent(DataTable, { loading: true });
296
+ const wrapper = createComponent({ loading: true });
295
297
assert.isFalse(wrapper.find('[data-component="TableFoot"]').exists());
296
298
});
297
299
});
298
300
299
301
context('when empty', () => {
300
302
it('shows an empty message if provided', () => {
301
- const wrapper = createComponent(DataTable, {
303
+ const wrapper = createComponent({
302
304
emptyMessage: <strong>Nope</strong>,
303
305
rows: [],
304
306
});
305
307
assert.equal(wrapper.find('tbody tr td').at(0).text(), 'Nope');
306
308
});
307
309
308
310
it('still renders headings', () => {
309
- const wrapper = createComponent(DataTable, {
311
+ const wrapper = createComponent({
310
312
emptyMessage: <strong>Nope</strong>,
311
313
rows: [],
312
314
});
313
315
assert.equal(wrapper.find('thead tr th').length, 3);
314
316
});
315
317
316
318
it('does not render a TableFoot', () => {
317
- const wrapper = createComponent(DataTable, {
319
+ const wrapper = createComponent({
318
320
rows: [],
319
321
});
320
322
assert.isFalse(wrapper.find('[data-component="TableFoot"]').exists());
@@ -412,7 +414,7 @@ describe('DataTable', () => {
412
414
{ direction: 'descending', expectedArrow: 'ArrowDownIcon' },
413
415
].forEach(({ direction, expectedArrow }) => {
414
416
it('shows initial active order', () => {
415
- const wrapper = createComponent(DataTable, {
417
+ const wrapper = createComponent({
416
418
order: { field: 'color', direction },
417
419
});
418
420
const colorTableCell = wrapper.find('TableCell').at(1);
@@ -425,7 +427,7 @@ describe('DataTable', () => {
425
427
[
426
428
// Clicking the same column when initially ascending, transitions to descending
427
429
{
428
- initialOrder : { field: 'name', direction: 'ascending' },
430
+ startingOrder : { field: 'name', direction: 'ascending' },
429
431
clickedColumn: 'name',
430
432
expectedNewOrder: {
431
433
field: 'name',
@@ -434,26 +436,57 @@ describe('DataTable', () => {
434
436
},
435
437
// Clicking the same column when initially descending, transitions to ascending
436
438
{
437
- initialOrder : { field: 'name', direction: 'descending' },
439
+ startingOrder : { field: 'name', direction: 'descending' },
438
440
clickedColumn: 'name',
439
441
expectedNewOrder: { field: 'name', direction: 'ascending' },
440
442
},
441
443
// Clicking another column sets direction as ascending
442
444
{
443
- initialOrder : { field: 'name', direction: 'ascending' },
445
+ startingOrder : { field: 'name', direction: 'ascending' },
444
446
clickedColumn: 'consistency',
445
447
expectedNewOrder: {
446
448
field: 'consistency',
447
449
direction: 'ascending',
448
450
},
449
451
},
450
- ].forEach(({ initialOrder, clickedColumn, expectedNewOrder }) => {
452
+ // Change sort column to a column with no initial order specified
453
+ {
454
+ startingOrder: { field: 'name', direction: 'ascending' },
455
+ clickedColumn: 'color',
456
+ expectedNewOrder: {
457
+ field: 'color',
458
+ direction: 'descending',
459
+ },
460
+ },
461
+ // Change sort column to a column with no initial order specified
462
+ {
463
+ startingOrder: undefined,
464
+ clickedColumn: 'consistency',
465
+ expectedNewOrder: {
466
+ field: 'consistency',
467
+ direction: 'ascending',
468
+ },
469
+ },
470
+ // Change sort column to a column with an initial order specified
471
+ {
472
+ startingOrder: undefined,
473
+ clickedColumn: 'color',
474
+ expectedNewOrder: {
475
+ field: 'color',
476
+ direction: 'descending',
477
+ },
478
+ },
479
+ ].forEach(({ startingOrder, clickedColumn, expectedNewOrder }) => {
451
480
it('can update order by clicking columns', () => {
452
481
const onOrderChange = sinon.stub();
453
- const wrapper = createComponent(DataTable, {
482
+ const wrapper = createComponent({
454
483
onOrderChange,
455
- order: initialOrder,
456
- orderableColumns: ['name', 'color', 'consistency'],
484
+ order: startingOrder,
485
+ orderableColumns: {
486
+ name: 'ascending',
487
+ color: 'descending',
488
+ consistency: 'ascending',
489
+ },
457
490
});
458
491
459
492
wrapper
@@ -471,7 +504,7 @@ describe('DataTable', () => {
471
504
undefined,
472
505
].forEach(orderableColumns => {
473
506
it('can restrict which columns are orderable', () => {
474
- const wrapper = createComponent(DataTable, {
507
+ const wrapper = createComponent({
475
508
onOrderChange: sinon.stub(),
476
509
orderableColumns,
477
510
});
0 commit comments