Skip to content

Commit c1ba240

Browse files
committed
fix(react-tree): move unit test to appropriate location
1 parent 39857ff commit c1ba240

3 files changed

Lines changed: 41 additions & 49 deletions

File tree

packages/react-components/react-tree/library/src/components/Tree/Tree.test.tsx

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import * as React from 'react';
2-
import { render } from '@testing-library/react';
2+
import { render, screen } from '@testing-library/react';
33
import { isConformant } from '../../testing/isConformant';
44
import { Tree } from './Tree';
55
import { TreeItem } from '../TreeItem/TreeItem';
6+
import { TreeItemLayout } from '../TreeItemLayout/TreeItemLayout';
7+
import { TreeItemPersonaLayout } from '../TreeItemPersonaLayout/TreeItemPersonaLayout';
68

79
describe('Tree', () => {
810
isConformant({
@@ -37,4 +39,40 @@ describe('Tree', () => {
3739

3840
expect(handleOpenChange).toHaveBeenNthCalledWith(2, expect.any(Object), expect.objectContaining({ open: false }));
3941
});
42+
43+
describe('selection control accessibility', () => {
44+
it.each([
45+
{
46+
case: 'multiselect',
47+
selectionMode: 'multiselect',
48+
role: 'checkbox',
49+
layout: <TreeItemLayout>Item 1</TreeItemLayout>,
50+
accessibleName: 'Item 1',
51+
},
52+
{
53+
case: 'single',
54+
selectionMode: 'single',
55+
role: 'radio',
56+
layout: <TreeItemLayout>Item 1</TreeItemLayout>,
57+
accessibleName: 'Item 1',
58+
},
59+
{
60+
case: 'TreeItemPersonaLayout',
61+
selectionMode: 'multiselect',
62+
role: 'checkbox',
63+
layout: <TreeItemPersonaLayout>Jane Doe</TreeItemPersonaLayout>,
64+
accessibleName: 'Jane Doe',
65+
},
66+
] as const)('exposes a named $role selector ($case)', ({ selectionMode, role, layout, accessibleName }) => {
67+
render(
68+
<Tree aria-label="Tree" selectionMode={selectionMode}>
69+
<TreeItem itemType="leaf" value="item1">
70+
{layout}
71+
</TreeItem>
72+
</Tree>,
73+
);
74+
75+
expect(screen.getByRole(role, { name: accessibleName })).toBeTruthy();
76+
});
77+
});
4078
});

packages/react-components/react-tree/library/src/components/TreeItemLayout/TreeItemLayout.test.tsx

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import * as React from 'react';
2-
import { render, screen } from '@testing-library/react';
2+
import { render } from '@testing-library/react';
33
import { TreeItemLayout } from './TreeItemLayout';
44
import { isConformant } from '../../testing/isConformant';
55
import { TreeItemProvider } from '../../contexts';
6-
import { Tree } from '../../Tree';
7-
import { TreeItem } from '../TreeItem/TreeItem';
86

97
const Wrapper: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
108
<TreeItemProvider
@@ -51,31 +49,4 @@ describe('TreeItemLayout', () => {
5149
const result = render(<TreeItemLayout>Default TreeItemLayout</TreeItemLayout>);
5250
expect(result.container).toMatchSnapshot();
5351
});
54-
55-
// Regression tests for the accessibility fix that exposes the selection control to assistive
56-
// technologies (e.g. Voice Access). The selector must not be `aria-hidden` (so it is found by
57-
// role) and must have an accessible name derived from the item content. See MAS 4.3.1.
58-
it('exposes the multiselect selection control with an accessible name', () => {
59-
render(
60-
<Tree aria-label="Tree" selectionMode="multiselect">
61-
<TreeItem itemType="leaf" value="item1">
62-
<TreeItemLayout>Item 1</TreeItemLayout>
63-
</TreeItem>
64-
</Tree>,
65-
);
66-
67-
expect(screen.getByRole('checkbox', { name: 'Item 1' })).toBeTruthy();
68-
});
69-
70-
it('exposes the single-selection control with an accessible name', () => {
71-
render(
72-
<Tree aria-label="Tree" selectionMode="single">
73-
<TreeItem itemType="leaf" value="item1">
74-
<TreeItemLayout>Item 1</TreeItemLayout>
75-
</TreeItem>
76-
</Tree>,
77-
);
78-
79-
expect(screen.getByRole('radio', { name: 'Item 1' })).toBeTruthy();
80-
});
8152
});

packages/react-components/react-tree/library/src/components/TreeItemPersonaLayout/TreeItemPersonaLayout.test.tsx

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import * as React from 'react';
2-
import { render, screen } from '@testing-library/react';
2+
import { render } from '@testing-library/react';
33
import { TreeItemPersonaLayout } from './TreeItemPersonaLayout';
44
import { isConformant } from '../../testing/isConformant';
55
import { TreeItemProvider } from '../../contexts';
6-
import { Tree } from '../../Tree';
7-
import { TreeItem } from '../TreeItem/TreeItem';
86

97
const Wrapper: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
108
<TreeItemProvider
@@ -52,19 +50,4 @@ describe('TreeItemPersonaLayout', () => {
5250
const result = render(<TreeItemPersonaLayout>Default TreeItemPersonaLayout</TreeItemPersonaLayout>);
5351
expect(result.container).toMatchSnapshot();
5452
});
55-
56-
// Regression test: the persona layout shares the selection control via TreeItemLayout, so it
57-
// must also expose a named selector. The content id is carried onto its `main` slot so the
58-
// selector's `aria-labelledby` resolves here too. See MAS 4.3.1.
59-
it('exposes the selection control with an accessible name', () => {
60-
render(
61-
<Tree aria-label="Tree" selectionMode="multiselect">
62-
<TreeItem itemType="leaf" value="item1">
63-
<TreeItemPersonaLayout>Jane Doe</TreeItemPersonaLayout>
64-
</TreeItem>
65-
</Tree>,
66-
);
67-
68-
expect(screen.getByRole('checkbox', { name: 'Jane Doe' })).toBeTruthy();
69-
});
7053
});

0 commit comments

Comments
 (0)