Skip to content

Commit a4bfa0f

Browse files
committed
add tests + fix bugs
1 parent 28d0092 commit a4bfa0f

File tree

4 files changed

+72
-11
lines changed

4 files changed

+72
-11
lines changed

packages/gamut/src/DataList/Tables/Rows/TableHeaderRow.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,18 @@ export const TableHeaderRow: HeaderComponent = ({
6363
const renderKey = prefixId(`header-col-${rowProperty}`);
6464
const columnText = String(header || key);
6565
const sortDirection = headerRowDirections?.[rowProperty] ?? 'none';
66+
const ariaSortDirection =
67+
sortDirection === 'none'
68+
? 'none'
69+
: sortDirection === 'asc'
70+
? 'ascending'
71+
: 'descending';
6672

6773
return (
6874
<ListCol
6975
key={renderKey}
7076
{...colProps}
71-
aria-sort={
72-
!sortable || sortDirection === 'none'
73-
? 'none'
74-
: sortDirection === 'asc'
75-
? 'ascending'
76-
: 'descending'
77-
}
77+
aria-sort={sortable ? ariaSortDirection : undefined}
7878
columnHeader
7979
dataTablePadding={dataTablePadding}
8080
>

packages/gamut/src/DataList/__tests__/DataGrid.test.tsx

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,10 @@ describe('DataGrid', () => {
232232
it('renders the column header with an ascending label when sorted', () => {
233233
renderView({
234234
columns: [{ key: 'name', sortable: true }],
235-
query: { sort: {} },
235+
query: { sort: { name: 'asc' } },
236236
});
237237

238-
expect(screen.queryByText('ascending')).toBeNull();
238+
screen.getByLabelText('ascending');
239239
});
240240
it('renders the column header with an descending label when sorted', () => {
241241
renderView({
@@ -328,6 +328,68 @@ describe('DataGrid', () => {
328328
},
329329
});
330330
});
331+
332+
it('sets aria-sort="ascending" on column header when sorted ascending', () => {
333+
renderView({
334+
columns: [{ key: 'name', sortable: true }],
335+
query: { sort: { name: 'asc' } },
336+
});
337+
338+
const nameHeader = screen.getByRole('columnheader', { name: /name/i });
339+
expect(nameHeader.tagName).toBe('TH');
340+
expect(nameHeader).toHaveAttribute('aria-sort', 'ascending');
341+
});
342+
343+
it('sets aria-sort="descending" on column header when sorted descending', () => {
344+
renderView({
345+
columns: [{ key: 'name', sortable: true }],
346+
query: { sort: { name: 'desc' } },
347+
});
348+
349+
const nameHeader = screen.getByRole('columnheader', { name: /name/i });
350+
expect(nameHeader.tagName).toBe('TH');
351+
expect(nameHeader).toHaveAttribute('aria-sort', 'descending');
352+
});
353+
354+
it('sets aria-sort="none" on column header when not sorted', () => {
355+
renderView({
356+
columns: [{ key: 'name', sortable: true }],
357+
query: { sort: {} },
358+
});
359+
360+
const nameHeader = screen.getByRole('columnheader', { name: /name/i });
361+
expect(nameHeader.tagName).toBe('TH');
362+
expect(nameHeader).toHaveAttribute('aria-sort', 'none');
363+
});
364+
365+
it('does not set aria-sort attribute on non-sortable column headers', () => {
366+
renderView({
367+
columns: [{ key: 'name', sortable: false }],
368+
query: { sort: {} },
369+
});
370+
371+
const nameHeader = screen.getByRole('columnheader', { name: /name/i });
372+
expect(nameHeader.tagName).toBe('TH');
373+
expect(nameHeader).not.toHaveAttribute('aria-sort');
374+
});
375+
376+
it('sets correct aria-sort values on multiple sortable columns', () => {
377+
renderView({
378+
columns: [
379+
{ key: 'name', sortable: true },
380+
{ key: 'sin', sortable: true },
381+
],
382+
query: { sort: { name: 'asc', sin: 'desc' } },
383+
});
384+
385+
const nameHeader = screen.getByRole('columnheader', { name: /name/i });
386+
const sinHeader = screen.getByRole('columnheader', { name: /sin/i });
387+
388+
expect(nameHeader.tagName).toBe('TH');
389+
expect(sinHeader.tagName).toBe('TH');
390+
expect(nameHeader).toHaveAttribute('aria-sort', 'ascending');
391+
expect(sinHeader).toHaveAttribute('aria-sort', 'descending');
392+
});
331393
});
332394

333395
describe('Filtering', () => {

packages/gamut/src/List/ListCol.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const ListCol = forwardRef<HTMLDivElement, ListColProps>(
2727
<ColEl
2828
{...activeVariants}
2929
{...rest}
30-
aria-sort={!sticky && ariaSort ? ariaSort : undefined}
30+
aria-sort={!sticky ? ariaSort : undefined}
3131
as={colEl}
3232
columnHeader={columnHeader}
3333
delimiter={sticky && activeVariants.variant === 'table'}

packages/styleguide/src/lib/Organisms/Lists & Tables/DataTable/DataTable.stories.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ const meta: Meta<typeof DataTable> = {
9292
header: 'Rank',
9393
key: 'a very important role',
9494
size: 'lg',
95-
sortable: true,
9695
},
9796
{ header: 'Ship', key: 'ship', size: 'lg', sortable: true },
9897
{ header: 'Age', key: 'age', size: 'sm', sortable: true },

0 commit comments

Comments
 (0)