@patternfly/react-core 5.2.0-prerelease.30 → 5.2.0-prerelease.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/AboutModal/package.json +1 -1
- package/dist/dynamic/components/Accordion/package.json +1 -1
- package/dist/dynamic/components/ActionList/package.json +1 -1
- package/dist/dynamic/components/Alert/package.json +1 -1
- package/dist/dynamic/components/Avatar/package.json +1 -1
- package/dist/dynamic/components/BackToTop/package.json +1 -1
- package/dist/dynamic/components/Backdrop/package.json +1 -1
- package/dist/dynamic/components/BackgroundImage/package.json +1 -1
- package/dist/dynamic/components/Badge/package.json +1 -1
- package/dist/dynamic/components/Banner/package.json +1 -1
- package/dist/dynamic/components/Brand/package.json +1 -1
- package/dist/dynamic/components/Breadcrumb/package.json +1 -1
- package/dist/dynamic/components/Button/package.json +1 -1
- package/dist/dynamic/components/CalendarMonth/package.json +1 -1
- package/dist/dynamic/components/Card/package.json +1 -1
- package/dist/dynamic/components/Checkbox/package.json +1 -1
- package/dist/dynamic/components/Chip/package.json +1 -1
- package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/DataList/package.json +1 -1
- package/dist/dynamic/components/DatePicker/package.json +1 -1
- package/dist/dynamic/components/DescriptionList/package.json +1 -1
- package/dist/dynamic/components/Divider/package.json +1 -1
- package/dist/dynamic/components/DragDrop/package.json +1 -1
- package/dist/dynamic/components/Drawer/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -1
- package/dist/dynamic/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/components/EmptyState/package.json +1 -1
- package/dist/dynamic/components/ExpandableSection/package.json +1 -1
- package/dist/dynamic/components/FileUpload/package.json +1 -1
- package/dist/dynamic/components/Form/package.json +1 -1
- package/dist/dynamic/components/FormSelect/package.json +1 -1
- package/dist/dynamic/components/HelperText/package.json +1 -1
- package/dist/dynamic/components/Hint/package.json +1 -1
- package/dist/dynamic/components/Icon/package.json +1 -1
- package/dist/dynamic/components/InputGroup/package.json +1 -1
- package/dist/dynamic/components/JumpLinks/package.json +1 -1
- package/dist/dynamic/components/Label/package.json +1 -1
- package/dist/dynamic/components/List/package.json +1 -1
- package/dist/dynamic/components/LoginPage/package.json +1 -1
- package/dist/dynamic/components/Masthead/package.json +1 -1
- package/dist/dynamic/components/Menu/package.json +1 -1
- package/dist/dynamic/components/MenuToggle/package.json +1 -1
- package/dist/dynamic/components/Modal/package.json +1 -1
- package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
- package/dist/dynamic/components/Nav/package.json +1 -1
- package/dist/dynamic/components/NotificationBadge/package.json +1 -1
- package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
- package/dist/dynamic/components/NumberInput/package.json +1 -1
- package/dist/dynamic/components/OverflowMenu/package.json +1 -1
- package/dist/dynamic/components/Page/package.json +1 -1
- package/dist/dynamic/components/Pagination/package.json +1 -1
- package/dist/dynamic/components/Panel/package.json +1 -1
- package/dist/dynamic/components/Popover/package.json +1 -1
- package/dist/dynamic/components/Progress/package.json +1 -1
- package/dist/dynamic/components/ProgressStepper/package.json +1 -1
- package/dist/dynamic/components/Radio/package.json +1 -1
- package/dist/dynamic/components/SearchInput/package.json +1 -1
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic/components/Sidebar/package.json +1 -1
- package/dist/dynamic/components/SimpleList/package.json +1 -1
- package/dist/dynamic/components/Skeleton/package.json +1 -1
- package/dist/dynamic/components/SkipToContent/package.json +1 -1
- package/dist/dynamic/components/Slider/package.json +1 -1
- package/dist/dynamic/components/Spinner/package.json +1 -1
- package/dist/dynamic/components/Switch/package.json +1 -1
- package/dist/dynamic/components/Tabs/package.json +1 -1
- package/dist/dynamic/components/Text/package.json +1 -1
- package/dist/dynamic/components/TextArea/package.json +1 -1
- package/dist/dynamic/components/TextInput/package.json +1 -1
- package/dist/dynamic/components/TextInputGroup/package.json +1 -1
- package/dist/dynamic/components/Tile/package.json +1 -1
- package/dist/dynamic/components/TimePicker/package.json +1 -1
- package/dist/dynamic/components/Timestamp/package.json +1 -1
- package/dist/dynamic/components/Title/package.json +1 -1
- package/dist/dynamic/components/ToggleGroup/package.json +1 -1
- package/dist/dynamic/components/Toolbar/package.json +1 -1
- package/dist/dynamic/components/Tooltip/package.json +1 -1
- package/dist/dynamic/components/TreeView/package.json +1 -1
- package/dist/dynamic/components/Truncate/package.json +1 -1
- package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
- package/dist/dynamic/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
- package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
- package/dist/dynamic/deprecated/components/Select/package.json +1 -1
- package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
- package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
- package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
- package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
- package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
- package/dist/dynamic/helpers/constants/package.json +1 -1
- package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
- package/dist/dynamic/helpers/favorites/package.json +1 -1
- package/dist/dynamic/helpers/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/package.json +1 -1
- package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
- package/dist/dynamic/helpers/typeUtils/package.json +1 -1
- package/dist/dynamic/helpers/useInterval/package.json +1 -1
- package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
- package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
- package/dist/dynamic/helpers/util/package.json +1 -1
- package/dist/dynamic/layouts/Bullseye/package.json +1 -1
- package/dist/dynamic/layouts/Flex/package.json +1 -1
- package/dist/dynamic/layouts/Gallery/package.json +1 -1
- package/dist/dynamic/layouts/Grid/package.json +1 -1
- package/dist/dynamic/layouts/Level/package.json +1 -1
- package/dist/dynamic/layouts/Split/package.json +1 -1
- package/dist/dynamic/layouts/Stack/package.json +1 -1
- package/dist/dynamic/next/components/package.json +1 -1
- package/dist/esm/components/Toolbar/ToolbarToggleGroup.js +1 -1
- package/dist/esm/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
- package/dist/esm/components/TreeView/TreeViewListItem.js +1 -1
- package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
- package/dist/js/components/Toolbar/ToolbarToggleGroup.js +1 -1
- package/dist/js/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
- package/dist/js/components/TreeView/TreeViewListItem.js +1 -1
- package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
- package/dist/umd/react-core.min.js +1 -1
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +2 -2
- package/src/components/Select/examples/Select.md +49 -9
- package/src/components/Toolbar/ToolbarToggleGroup.tsx +1 -1
- package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +0 -1
- package/src/components/TreeView/TreeViewListItem.tsx +1 -1
- package/src/components/TreeView/__tests__/TreeView.test.tsx +295 -221
- package/src/components/TreeView/__tests__/TreeViewList.test.tsx +52 -0
- package/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +708 -0
- package/src/components/TreeView/__tests__/TreeViewRoot.test.tsx +87 -0
- package/src/components/TreeView/__tests__/TreeViewSearch.test.tsx +93 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +103 -3407
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewList.test.tsx.snap +29 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewListItem.test.tsx.snap +83 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewRoot.test.tsx.snap +16 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewSearch.test.tsx.snap +38 -0
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import { TreeViewListItem } from '../TreeViewListItem';
|
|
4
|
+
import { TreeView } from '../TreeView';
|
|
5
|
+
import userEvent from '@testing-library/user-event';
|
|
6
|
+
import styles from '@patternfly/react-styles/css/components/TreeView/tree-view';
|
|
7
|
+
|
|
8
|
+
const requiredProps = {
|
|
9
|
+
name: 'Item name',
|
|
10
|
+
title: 'Item title'
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
test(`Renders without children`, () => {
|
|
14
|
+
render(
|
|
15
|
+
<div data-testid="container">
|
|
16
|
+
<TreeViewListItem {...requiredProps} />
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
expect(screen.getByTestId('container').firstChild).toBeVisible();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test(`Does not render children by default`, () => {
|
|
24
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
25
|
+
|
|
26
|
+
expect(screen.queryByText('Content')).not.toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test(`Renders children if defaultExpanded is true`, () => {
|
|
30
|
+
render(
|
|
31
|
+
<TreeViewListItem defaultExpanded={true} {...requiredProps}>
|
|
32
|
+
Content
|
|
33
|
+
</TreeViewListItem>
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
expect(screen.getByText('Content')).toBeVisible();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test(`Renders children if isExpanded is true`, () => {
|
|
40
|
+
render(
|
|
41
|
+
<TreeViewListItem isExpanded={true} {...requiredProps}>
|
|
42
|
+
Content
|
|
43
|
+
</TreeViewListItem>
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
expect(screen.getByText('Content')).toBeVisible();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test(`Renders children when toggle is clicked`, async () => {
|
|
50
|
+
const user = userEvent.setup();
|
|
51
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
52
|
+
|
|
53
|
+
await user.click(screen.getByRole('button'));
|
|
54
|
+
|
|
55
|
+
expect(screen.getByText('Content')).toBeVisible();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test(`Renders with class ${styles.treeViewListItem} and aria-expanded=false by default`, () => {
|
|
59
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
60
|
+
|
|
61
|
+
expect(screen.getByRole('treeitem')).toHaveClass(styles.treeViewListItem, { exact: true });
|
|
62
|
+
expect(screen.getByRole('treeitem')).toHaveAttribute('aria-expanded', 'false');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test(`Renders with class ${styles.modifiers.expanded} and aria-expanded=true when defaultExpanded is true`, () => {
|
|
66
|
+
render(<TreeViewListItem defaultExpanded={true} {...requiredProps} />);
|
|
67
|
+
|
|
68
|
+
expect(screen.getByRole('treeitem')).toHaveClass(styles.modifiers.expanded);
|
|
69
|
+
expect(screen.getByRole('treeitem')).toHaveAttribute('aria-expanded', 'true');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test(`Renders with class ${styles.modifiers.expanded} and aria-expanded=true when isExpanded is true`, () => {
|
|
73
|
+
render(<TreeViewListItem isExpanded={true} {...requiredProps} />);
|
|
74
|
+
|
|
75
|
+
expect(screen.getByRole('treeitem')).toHaveClass(styles.modifiers.expanded);
|
|
76
|
+
expect(screen.getByRole('treeitem')).toHaveAttribute('aria-expanded', 'true');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('Renders with id when passed', () => {
|
|
80
|
+
render(<TreeViewListItem id="test-id" {...requiredProps} />);
|
|
81
|
+
|
|
82
|
+
expect(screen.getByRole('treeitem')).toHaveAttribute('id', 'test-id');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('Does not render expandable toggle if children are not passed', () => {
|
|
86
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
87
|
+
|
|
88
|
+
expect(screen.queryByText(requiredProps.name)?.previousSibling).not.toBeInTheDocument();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test(`Renders expandable toggle with class ${styles.treeViewNodeToggle} if children are passed`, () => {
|
|
92
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
93
|
+
|
|
94
|
+
expect(screen.getByText(requiredProps.name).previousElementSibling).toHaveClass(styles.treeViewNodeToggle);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test(`Renders expandable toggle without aria-labelledby as span by default`, () => {
|
|
98
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
99
|
+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
|
|
100
|
+
|
|
101
|
+
expect(toggle?.tagName).toBe('SPAN');
|
|
102
|
+
expect(toggle).not.toHaveAccessibleName();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test(`Renders expandable toggle as button with aria-labelledby when hasCheckbox is passed`, () => {
|
|
106
|
+
render(
|
|
107
|
+
<TreeViewListItem hasCheckbox {...requiredProps}>
|
|
108
|
+
Content
|
|
109
|
+
</TreeViewListItem>
|
|
110
|
+
);
|
|
111
|
+
const toggle = screen.getByRole('button');
|
|
112
|
+
|
|
113
|
+
expect(toggle).toHaveClass(styles.treeViewNodeToggle);
|
|
114
|
+
expect(toggle).toHaveAccessibleName(requiredProps.name);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test(`Renders expandable toggle as button with aria-labelledby when isSelectable is passed`, () => {
|
|
118
|
+
render(
|
|
119
|
+
<TreeViewListItem isSelectable {...requiredProps}>
|
|
120
|
+
Content
|
|
121
|
+
</TreeViewListItem>
|
|
122
|
+
);
|
|
123
|
+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
|
|
124
|
+
|
|
125
|
+
expect(toggle?.tagName).toBe('BUTTON');
|
|
126
|
+
expect(toggle).toHaveAccessibleName(requiredProps.name);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test(`Renders name prop with class ${styles.treeViewNodeText}`, () => {
|
|
130
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
131
|
+
|
|
132
|
+
expect(screen.getByText(requiredProps.name)).toHaveClass(styles.treeViewNodeText);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test(`Renders name prop in span by default`, () => {
|
|
136
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
137
|
+
|
|
138
|
+
expect(screen.getByText(requiredProps.name).tagName).toBe('SPAN');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test(`Renders name prop in button when isSelectable is passed`, () => {
|
|
142
|
+
render(<TreeViewListItem isSelectable {...requiredProps} />);
|
|
143
|
+
|
|
144
|
+
expect(screen.getByText(requiredProps.name).tagName).toBe('BUTTON');
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('Does not render title prop by default', () => {
|
|
148
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
149
|
+
|
|
150
|
+
expect(screen.queryByText(requiredProps.title)).not.toBeInTheDocument();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test(`Renders title prop with class ${styles.treeViewNodeTitle} when isCompact is passed`, () => {
|
|
154
|
+
render(<TreeViewListItem isCompact {...requiredProps} />);
|
|
155
|
+
|
|
156
|
+
expect(screen.getByText(requiredProps.title)).toHaveClass(styles.treeViewNodeTitle);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test(`Does not render name in ${styles.treeViewNodeContent} wrapper by default`, () => {
|
|
160
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
161
|
+
|
|
162
|
+
expect(screen.getByText(requiredProps.name).parentElement).not.toHaveClass(styles.treeViewNodeContent);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test(`Renders name and title in ${styles.treeViewNodeContent} wrapper when isCompact is passed`, () => {
|
|
166
|
+
render(<TreeViewListItem isCompact {...requiredProps} />);
|
|
167
|
+
|
|
168
|
+
expect(screen.getByText(requiredProps.name).parentElement).toHaveClass(styles.treeViewNodeContent);
|
|
169
|
+
expect(screen.getByText(requiredProps.title).parentElement).toHaveClass(styles.treeViewNodeContent);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('Does not render checkbox by default', () => {
|
|
173
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
174
|
+
|
|
175
|
+
expect(screen.queryByRole('checkbox')).not.toBeInTheDocument();
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test('Renders checkbox when hasCheckbox is passed', () => {
|
|
179
|
+
render(<TreeViewListItem hasCheckbox {...requiredProps} />);
|
|
180
|
+
|
|
181
|
+
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('Passes checkProps to checkbox', () => {
|
|
185
|
+
render(<TreeViewListItem hasCheckbox checkProps={{ checked: true, className: 'test-class' }} {...requiredProps} />);
|
|
186
|
+
|
|
187
|
+
// Want to check that checkProps.checked as well as additional spread props are passed
|
|
188
|
+
expect(screen.getByRole('checkbox')).toBeChecked();
|
|
189
|
+
expect(screen.getByRole('checkbox')).toHaveClass('test-class');
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test('Does not render icon by default', () => {
|
|
193
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
194
|
+
|
|
195
|
+
//
|
|
196
|
+
expect(screen.getByText(requiredProps.name).previousElementSibling).not.toHaveClass(styles.treeViewNodeIcon);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test(`Renders icon with class ${styles.treeViewNodeIcon} when prop is passed`, () => {
|
|
200
|
+
render(
|
|
201
|
+
<TreeViewListItem icon="Icon content" {...requiredProps}>
|
|
202
|
+
Content
|
|
203
|
+
</TreeViewListItem>
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
expect(screen.getByText('Icon content')).toHaveClass(styles.treeViewNodeIcon);
|
|
207
|
+
// Check that previous test isn't a false positive
|
|
208
|
+
expect(screen.getByText(requiredProps.name).previousElementSibling).toHaveClass(styles.treeViewNodeIcon);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test('Does not render expandedIcon if list item is not expanded', () => {
|
|
212
|
+
render(
|
|
213
|
+
<TreeViewListItem expandedIcon="Expanded icon content" icon="Icon content" {...requiredProps}>
|
|
214
|
+
Content
|
|
215
|
+
</TreeViewListItem>
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
expect(screen.queryByText('Expanded icon content')).not.toBeInTheDocument();
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('Renders expandedIcon instead of icon if list item is expanded', () => {
|
|
222
|
+
render(
|
|
223
|
+
<TreeViewListItem
|
|
224
|
+
defaultExpanded={true}
|
|
225
|
+
expandedIcon="Expanded icon content"
|
|
226
|
+
icon="Icon content"
|
|
227
|
+
{...requiredProps}
|
|
228
|
+
>
|
|
229
|
+
Content
|
|
230
|
+
</TreeViewListItem>
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
expect(screen.getByText('Expanded icon content')).toBeInTheDocument();
|
|
234
|
+
expect(screen.queryByText('Icon content')).not.toBeInTheDocument();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('Does not render badge by default', () => {
|
|
238
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
239
|
+
|
|
240
|
+
expect(screen.queryByText(requiredProps.name)?.nextElementSibling).not.toBeInTheDocument();
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test('Does not render badge if hasBadge is passed but children and customBadgeContent are not passed', () => {
|
|
244
|
+
render(<TreeViewListItem hasBadge {...requiredProps} />);
|
|
245
|
+
|
|
246
|
+
expect(screen.queryByText(requiredProps.name)?.nextElementSibling).not.toBeInTheDocument();
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
test('Renders badge with count by default when hasBadge and children are passed', () => {
|
|
250
|
+
render(
|
|
251
|
+
<TreeViewListItem hasBadge {...requiredProps}>
|
|
252
|
+
<TreeView data={[{ name: 'Parent name 1' }, { name: 'Parent name 2' }]} />
|
|
253
|
+
</TreeViewListItem>
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
expect(screen.getByText(requiredProps.name).nextElementSibling).toHaveTextContent('2');
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('Renders badge with customBadgeContent when hasBadge and children are passed', () => {
|
|
260
|
+
render(
|
|
261
|
+
<TreeViewListItem hasBadge customBadgeContent="Custom badge" {...requiredProps}>
|
|
262
|
+
<TreeView data={[{ name: 'Parent name 1' }, { name: 'Parent name 2' }]} />
|
|
263
|
+
</TreeViewListItem>
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
expect(screen.getByText(requiredProps.name).nextElementSibling).toHaveTextContent('Custom badge');
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test('Renders badge with customBadgeContent when hasBadge is passed and children are not passed', () => {
|
|
270
|
+
render(<TreeViewListItem hasBadge customBadgeContent="Custom badge" {...requiredProps} />);
|
|
271
|
+
|
|
272
|
+
expect(screen.getByText(requiredProps.name).nextElementSibling).toHaveTextContent('Custom badge');
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test(`Renders badge with class ${styles.treeViewNodeCount} when hasBadge and children passed`, () => {
|
|
276
|
+
render(
|
|
277
|
+
<TreeViewListItem hasBadge {...requiredProps}>
|
|
278
|
+
<TreeView data={[{ name: 'Parent name 1' }, { name: 'Parent name 2' }]} />
|
|
279
|
+
</TreeViewListItem>
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
expect(screen.getByText('2').parentElement).toHaveClass(styles.treeViewNodeCount);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test(`Renders badge with class ${styles.treeViewNodeCount} when hasBadge is passed and children are not passed`, () => {
|
|
286
|
+
render(<TreeViewListItem hasBadge customBadgeContent="Custom badge" {...requiredProps} />);
|
|
287
|
+
|
|
288
|
+
expect(screen.getByText('Custom badge').parentElement).toHaveClass(styles.treeViewNodeCount);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
test('Passes badgeProps when hasBadge and children are passed', () => {
|
|
292
|
+
render(
|
|
293
|
+
<TreeViewListItem hasBadge badgeProps={{ className: 'test-class' }} {...requiredProps}>
|
|
294
|
+
<TreeView data={[{ name: 'Parent name 1' }, { name: 'Parent name 2' }]} />
|
|
295
|
+
</TreeViewListItem>
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
expect(screen.getByText('2')).toHaveClass('test-class');
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test('Passes badgeProps when hasBadge and customBadgeContent are passed', () => {
|
|
302
|
+
render(
|
|
303
|
+
<TreeViewListItem
|
|
304
|
+
hasBadge
|
|
305
|
+
customBadgeContent="Badge content"
|
|
306
|
+
badgeProps={{ className: 'test-class' }}
|
|
307
|
+
{...requiredProps}
|
|
308
|
+
/>
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
expect(screen.getByText('Badge content')).toHaveClass('test-class');
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
test(`Renders ${styles.treeViewNode} element as button by default`, () => {
|
|
315
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
316
|
+
|
|
317
|
+
expect(screen.getByRole('button')).toHaveClass(styles.treeViewNode);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test(`Renders ${styles.treeViewNode} element as label when hasCheckbox is passed`, () => {
|
|
321
|
+
render(<TreeViewListItem hasCheckbox {...requiredProps} />);
|
|
322
|
+
|
|
323
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
324
|
+
|
|
325
|
+
expect(treeViewNode?.tagName).toBe('LABEL');
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
test(`Renders ${styles.treeViewNode} element as div when isSelectable is passed`, () => {
|
|
329
|
+
render(<TreeViewListItem isSelectable {...requiredProps} />);
|
|
330
|
+
|
|
331
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
332
|
+
|
|
333
|
+
expect(treeViewNode?.tagName).toBe('DIV');
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
test(`Does not render ${styles.treeViewNode} element with for or id attributes by default`, () => {
|
|
337
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
338
|
+
|
|
339
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
340
|
+
|
|
341
|
+
expect(treeViewNode).not.toHaveAttribute('for');
|
|
342
|
+
expect(treeViewNode).not.toHaveAttribute('id');
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
test(`Renders ${styles.treeViewNode} element with for and id attributes when hasCheckbox is passed`, () => {
|
|
346
|
+
render(<TreeViewListItem hasCheckbox {...requiredProps} />);
|
|
347
|
+
|
|
348
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
349
|
+
|
|
350
|
+
expect(treeViewNode).toHaveAttribute('for');
|
|
351
|
+
expect(treeViewNode).toHaveAttribute('id');
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
test(`Renders ${styles.treeViewNode} element with id attribute when isSelectable and children are passed`, () => {
|
|
355
|
+
render(
|
|
356
|
+
<TreeViewListItem isSelectable {...requiredProps}>
|
|
357
|
+
Content
|
|
358
|
+
</TreeViewListItem>
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
362
|
+
|
|
363
|
+
expect(treeViewNode).toHaveAttribute('id');
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
test(`Does not render ${styles.treeViewNode} element with additional classes by default`, () => {
|
|
367
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
368
|
+
|
|
369
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
370
|
+
|
|
371
|
+
expect(treeViewNode).toHaveClass(styles.treeViewNode, { exact: true });
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
test(`Renders ${styles.treeViewNode} element with ${styles.modifiers.selectable} class when hasCheckbox and children are passed`, () => {
|
|
375
|
+
render(
|
|
376
|
+
<TreeViewListItem hasCheckbox {...requiredProps}>
|
|
377
|
+
Content
|
|
378
|
+
</TreeViewListItem>
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
382
|
+
|
|
383
|
+
expect(treeViewNode).toHaveClass(styles.modifiers.selectable);
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
test(`Renders ${styles.treeViewNode} element with ${styles.modifiers.selectable} class when isSelectable and children are passed`, () => {
|
|
387
|
+
render(
|
|
388
|
+
<TreeViewListItem isSelectable {...requiredProps}>
|
|
389
|
+
Content
|
|
390
|
+
</TreeViewListItem>
|
|
391
|
+
);
|
|
392
|
+
|
|
393
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
394
|
+
|
|
395
|
+
expect(treeViewNode).toHaveClass(styles.modifiers.selectable);
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
test(`Does not render ${styles.treeViewNode} element with ${styles.modifiers.selectable} if children are not passed`, () => {
|
|
399
|
+
render(<TreeViewListItem hasCheckbox isSelectable {...requiredProps} />);
|
|
400
|
+
|
|
401
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
402
|
+
|
|
403
|
+
expect(treeViewNode).not.toHaveClass(styles.modifiers.selectable);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
test(`Renders ${styles.treeViewNode} element with ${styles.modifiers.current} class when isSelectable and activeItems are passed`, () => {
|
|
407
|
+
render(
|
|
408
|
+
<TreeViewListItem compareItems={() => true} isSelectable activeItems={[{ name: 'Active item' }]} {...requiredProps}>
|
|
409
|
+
Content
|
|
410
|
+
</TreeViewListItem>
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
414
|
+
|
|
415
|
+
expect(treeViewNode).toHaveClass(styles.modifiers.current);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
test(`Renders ${styles.treeViewNode} element with ${styles.modifiers.current} class when children are not passed`, () => {
|
|
419
|
+
render(<TreeViewListItem compareItems={() => true} activeItems={[{ name: 'Active item' }]} {...requiredProps} />);
|
|
420
|
+
|
|
421
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
422
|
+
|
|
423
|
+
expect(treeViewNode).toHaveClass(styles.modifiers.current);
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
test(`Does not render ${styles.treeViewNode} element with ${styles.modifiers.current} class when children are passed`, () => {
|
|
427
|
+
render(
|
|
428
|
+
<TreeViewListItem compareItems={() => true} activeItems={[{ name: 'Active item' }]} {...requiredProps}>
|
|
429
|
+
Content
|
|
430
|
+
</TreeViewListItem>
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
434
|
+
|
|
435
|
+
expect(treeViewNode).not.toHaveClass(styles.modifiers.current);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
describe('compareItems callback', () => {
|
|
439
|
+
const compareItemsMock = jest.fn();
|
|
440
|
+
const activeItems = [{ name: 'Active item' }];
|
|
441
|
+
const itemData = { name: 'Item data' };
|
|
442
|
+
|
|
443
|
+
test('Not called by default', () => {
|
|
444
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
445
|
+
|
|
446
|
+
expect(compareItemsMock).not.toHaveBeenCalled();
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
test('Called when isSelectable and activeItems are passed', () => {
|
|
450
|
+
render(
|
|
451
|
+
<TreeViewListItem
|
|
452
|
+
compareItems={compareItemsMock}
|
|
453
|
+
isSelectable
|
|
454
|
+
activeItems={activeItems}
|
|
455
|
+
itemData={itemData}
|
|
456
|
+
{...requiredProps}
|
|
457
|
+
>
|
|
458
|
+
Content
|
|
459
|
+
</TreeViewListItem>
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
expect(compareItemsMock).toHaveBeenCalledTimes(1);
|
|
463
|
+
expect(compareItemsMock).toHaveBeenCalledWith(
|
|
464
|
+
expect.objectContaining(activeItems[0]),
|
|
465
|
+
expect.objectContaining(itemData)
|
|
466
|
+
);
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
test('Not called when isSelectable is passed but activeItems is not passed', () => {
|
|
470
|
+
render(
|
|
471
|
+
<TreeViewListItem
|
|
472
|
+
compareItems={compareItemsMock}
|
|
473
|
+
isSelectable
|
|
474
|
+
itemData={{ name: 'Item data' }}
|
|
475
|
+
{...requiredProps}
|
|
476
|
+
>
|
|
477
|
+
Content
|
|
478
|
+
</TreeViewListItem>
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
expect(compareItemsMock).not.toHaveBeenCalled();
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
test('Called when children and activeItems are passed', () => {
|
|
485
|
+
render(
|
|
486
|
+
<TreeViewListItem
|
|
487
|
+
compareItems={compareItemsMock}
|
|
488
|
+
activeItems={activeItems}
|
|
489
|
+
itemData={itemData}
|
|
490
|
+
{...requiredProps}
|
|
491
|
+
/>
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
expect(compareItemsMock).toHaveBeenCalledTimes(1);
|
|
495
|
+
expect(compareItemsMock).toHaveBeenCalledWith(
|
|
496
|
+
expect.objectContaining(activeItems[0]),
|
|
497
|
+
expect.objectContaining(itemData)
|
|
498
|
+
);
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
test('Does not call onCheck by default', async () => {
|
|
503
|
+
const user = userEvent.setup();
|
|
504
|
+
const onCheckMock = jest.fn();
|
|
505
|
+
|
|
506
|
+
render(<TreeViewListItem hasCheckbox {...requiredProps} />);
|
|
507
|
+
|
|
508
|
+
await user.click(screen.getByRole('checkbox'));
|
|
509
|
+
|
|
510
|
+
expect(onCheckMock).not.toHaveBeenCalled();
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test('Calls onCheck callback when checkbox is clicked', async () => {
|
|
514
|
+
const user = userEvent.setup();
|
|
515
|
+
const onCheckMock = jest.fn();
|
|
516
|
+
|
|
517
|
+
render(<TreeViewListItem onCheck={onCheckMock} hasCheckbox {...requiredProps} />);
|
|
518
|
+
|
|
519
|
+
await user.click(screen.getByRole('checkbox'));
|
|
520
|
+
|
|
521
|
+
expect(onCheckMock).toHaveBeenCalledTimes(1);
|
|
522
|
+
expect(onCheckMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
test('Does not call onSelect by default', async () => {
|
|
526
|
+
const user = userEvent.setup();
|
|
527
|
+
const onSelectMock = jest.fn();
|
|
528
|
+
|
|
529
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
530
|
+
|
|
531
|
+
await user.click(screen.getByRole('button'));
|
|
532
|
+
|
|
533
|
+
expect(onSelectMock).not.toHaveBeenCalled();
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
test(`Calls onSelect when ${styles.treeViewNode} is clicked`, async () => {
|
|
537
|
+
const user = userEvent.setup();
|
|
538
|
+
const onSelectMock = jest.fn();
|
|
539
|
+
|
|
540
|
+
render(<TreeViewListItem onSelect={onSelectMock} {...requiredProps} />);
|
|
541
|
+
|
|
542
|
+
await user.click(screen.getByRole('button'));
|
|
543
|
+
|
|
544
|
+
expect(onSelectMock).toHaveBeenCalledTimes(1);
|
|
545
|
+
expect(onSelectMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
test('Does not call onSelect when hasCheckbox is passed', async () => {
|
|
549
|
+
const user = userEvent.setup();
|
|
550
|
+
const onSelectMock = jest.fn();
|
|
551
|
+
|
|
552
|
+
render(<TreeViewListItem onSelect={onSelectMock} hasCheckbox {...requiredProps} />);
|
|
553
|
+
|
|
554
|
+
const treeViewNode = screen.getByRole('treeitem').querySelector(`.${styles.treeViewNode}`);
|
|
555
|
+
await user.click(treeViewNode as Element);
|
|
556
|
+
|
|
557
|
+
expect(onSelectMock).not.toHaveBeenCalled();
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
test('Does not call onExpand by default', async () => {
|
|
561
|
+
const user = userEvent.setup();
|
|
562
|
+
const onExpandMock = jest.fn();
|
|
563
|
+
|
|
564
|
+
render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
565
|
+
|
|
566
|
+
await user.click(screen.getByRole('button'));
|
|
567
|
+
|
|
568
|
+
expect(onExpandMock).not.toHaveBeenCalled();
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
test(`Calls onExpand when ${styles.treeViewNode} is collapsed and clicked`, async () => {
|
|
572
|
+
const user = userEvent.setup();
|
|
573
|
+
const onExpandMock = jest.fn();
|
|
574
|
+
|
|
575
|
+
render(
|
|
576
|
+
<TreeViewListItem onExpand={onExpandMock} {...requiredProps}>
|
|
577
|
+
Content
|
|
578
|
+
</TreeViewListItem>
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
await user.click(screen.getByRole('button'));
|
|
582
|
+
|
|
583
|
+
expect(onExpandMock).toHaveBeenCalledTimes(1);
|
|
584
|
+
expect(onExpandMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test(`Calls onExpand when ${styles.treeViewNodeToggle} is clicked and isSelectable is passed`, async () => {
|
|
588
|
+
const user = userEvent.setup();
|
|
589
|
+
const onExpandMock = jest.fn();
|
|
590
|
+
|
|
591
|
+
render(
|
|
592
|
+
<TreeViewListItem isSelectable onExpand={onExpandMock} {...requiredProps}>
|
|
593
|
+
Content
|
|
594
|
+
</TreeViewListItem>
|
|
595
|
+
);
|
|
596
|
+
|
|
597
|
+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
|
|
598
|
+
await user.click(toggle as Element);
|
|
599
|
+
|
|
600
|
+
expect(onExpandMock).toHaveBeenCalledTimes(1);
|
|
601
|
+
expect(onExpandMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
test(`Calls onExpand when ${styles.treeViewNodeToggle} is clicked and hasCheckbox is passed`, async () => {
|
|
605
|
+
const user = userEvent.setup();
|
|
606
|
+
const onExpandMock = jest.fn();
|
|
607
|
+
|
|
608
|
+
render(
|
|
609
|
+
<TreeViewListItem hasCheckbox onExpand={onExpandMock} {...requiredProps}>
|
|
610
|
+
Content
|
|
611
|
+
</TreeViewListItem>
|
|
612
|
+
);
|
|
613
|
+
|
|
614
|
+
const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling;
|
|
615
|
+
await user.click(toggle as Element);
|
|
616
|
+
|
|
617
|
+
expect(onExpandMock).toHaveBeenCalledTimes(1);
|
|
618
|
+
expect(onExpandMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
test('Does not call onCollapse by default', async () => {
|
|
622
|
+
const user = userEvent.setup();
|
|
623
|
+
const onCollapseMock = jest.fn();
|
|
624
|
+
|
|
625
|
+
render(
|
|
626
|
+
<TreeViewListItem isExpanded {...requiredProps}>
|
|
627
|
+
Content
|
|
628
|
+
</TreeViewListItem>
|
|
629
|
+
);
|
|
630
|
+
|
|
631
|
+
await user.click(screen.getByRole('button'));
|
|
632
|
+
|
|
633
|
+
expect(onCollapseMock).not.toHaveBeenCalled();
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
test(`Calls onCollapse when ${styles.treeViewNode} is expanded and clicked`, async () => {
|
|
637
|
+
const user = userEvent.setup();
|
|
638
|
+
const onCollapseMock = jest.fn();
|
|
639
|
+
|
|
640
|
+
render(
|
|
641
|
+
<TreeViewListItem isExpanded onCollapse={onCollapseMock} {...requiredProps}>
|
|
642
|
+
Content
|
|
643
|
+
</TreeViewListItem>
|
|
644
|
+
);
|
|
645
|
+
|
|
646
|
+
await user.click(screen.getByRole('button'));
|
|
647
|
+
|
|
648
|
+
expect(onCollapseMock).toHaveBeenCalledTimes(1);
|
|
649
|
+
expect(onCollapseMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
test(`Calls onCollapse when ${styles.treeViewNodeToggle} is clicked and isSelectable is passed`, async () => {
|
|
653
|
+
const user = userEvent.setup();
|
|
654
|
+
const onCollapseMock = jest.fn();
|
|
655
|
+
|
|
656
|
+
render(
|
|
657
|
+
<TreeViewListItem isExpanded isSelectable onCollapse={onCollapseMock} {...requiredProps}>
|
|
658
|
+
Content
|
|
659
|
+
</TreeViewListItem>
|
|
660
|
+
);
|
|
661
|
+
|
|
662
|
+
const toggle = screen.getByText(requiredProps.name).previousElementSibling;
|
|
663
|
+
await user.click(toggle as Element);
|
|
664
|
+
|
|
665
|
+
expect(onCollapseMock).toHaveBeenCalledTimes(1);
|
|
666
|
+
expect(onCollapseMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
test(`Calls onCollapse when ${styles.treeViewNodeToggle} is clicked and hasCheckbox is passed`, async () => {
|
|
670
|
+
const user = userEvent.setup();
|
|
671
|
+
const onCollapseMock = jest.fn();
|
|
672
|
+
|
|
673
|
+
render(
|
|
674
|
+
<TreeViewListItem isExpanded hasCheckbox onCollapse={onCollapseMock} {...requiredProps}>
|
|
675
|
+
Content
|
|
676
|
+
</TreeViewListItem>
|
|
677
|
+
);
|
|
678
|
+
|
|
679
|
+
const toggle = screen.getByText(requiredProps.name).previousElementSibling?.previousElementSibling;
|
|
680
|
+
await user.click(toggle as Element);
|
|
681
|
+
|
|
682
|
+
expect(onCollapseMock).toHaveBeenCalledTimes(1);
|
|
683
|
+
expect(onCollapseMock).toHaveBeenCalledWith(expect.any(Object), undefined, undefined);
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
test(`Does not render ${styles.treeViewAction} element by default`, () => {
|
|
687
|
+
render(<TreeViewListItem {...requiredProps} />);
|
|
688
|
+
|
|
689
|
+
expect(screen.queryByRole('treeitem')?.querySelector(`.${styles.treeViewAction}`)).not.toBeInTheDocument();
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
test(`Renders action with ${styles.treeViewAction} class when action is passed`, () => {
|
|
693
|
+
render(<TreeViewListItem action="Action content" {...requiredProps} />);
|
|
694
|
+
|
|
695
|
+
expect(screen.getByText('Action content')).toHaveClass(styles.treeViewAction);
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
test('Matches snapshot without children', () => {
|
|
699
|
+
const { asFragment } = render(<TreeViewListItem {...requiredProps} />);
|
|
700
|
+
|
|
701
|
+
expect(asFragment()).toMatchSnapshot();
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
test('Matches snapshot with children', () => {
|
|
705
|
+
const { asFragment } = render(<TreeViewListItem {...requiredProps}>Content</TreeViewListItem>);
|
|
706
|
+
|
|
707
|
+
expect(asFragment()).toMatchSnapshot();
|
|
708
|
+
});
|