@patternfly/react-core 5.2.0-prerelease.30 → 5.2.0-prerelease.31

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.
Files changed (144) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/package.json +1 -1
  119. package/dist/esm/components/Toolbar/ToolbarToggleGroup.js +1 -1
  120. package/dist/esm/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
  121. package/dist/esm/components/TreeView/TreeViewListItem.js +1 -1
  122. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  123. package/dist/js/components/Toolbar/ToolbarToggleGroup.js +1 -1
  124. package/dist/js/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
  125. package/dist/js/components/TreeView/TreeViewListItem.js +1 -1
  126. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  127. package/dist/umd/react-core.min.js +1 -1
  128. package/helpers/package.json +1 -1
  129. package/layouts/package.json +1 -1
  130. package/next/package.json +1 -1
  131. package/package.json +2 -2
  132. package/src/components/Toolbar/ToolbarToggleGroup.tsx +1 -1
  133. package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +0 -1
  134. package/src/components/TreeView/TreeViewListItem.tsx +1 -1
  135. package/src/components/TreeView/__tests__/TreeView.test.tsx +295 -221
  136. package/src/components/TreeView/__tests__/TreeViewList.test.tsx +52 -0
  137. package/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +708 -0
  138. package/src/components/TreeView/__tests__/TreeViewRoot.test.tsx +87 -0
  139. package/src/components/TreeView/__tests__/TreeViewSearch.test.tsx +93 -0
  140. package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +103 -3407
  141. package/src/components/TreeView/__tests__/__snapshots__/TreeViewList.test.tsx.snap +29 -0
  142. package/src/components/TreeView/__tests__/__snapshots__/TreeViewListItem.test.tsx.snap +83 -0
  143. package/src/components/TreeView/__tests__/__snapshots__/TreeViewRoot.test.tsx.snap +16 -0
  144. package/src/components/TreeView/__tests__/__snapshots__/TreeViewSearch.test.tsx.snap +38 -0
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.2.0-prerelease.29","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.2.0-prerelease.30","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.2.0-prerelease.29","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.2.0-prerelease.30","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.2.0-prerelease.29","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.2.0-prerelease.30","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.2.0-prerelease.30",
3
+ "version": "5.2.0-prerelease.31",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -71,5 +71,5 @@
71
71
  "react": "^17 || ^18",
72
72
  "react-dom": "^17 || ^18"
73
73
  },
74
- "gitHead": "e112034cf060e8917e5ba47079af4850a4f12d1a"
74
+ "gitHead": "3fa692ce5af87f73509c3131c53dd9669d504794"
75
75
  }
@@ -149,7 +149,7 @@ class ToolbarToggleGroup extends React.Component<ToolbarToggleGroupProps> {
149
149
  aria-label="Show Filters"
150
150
  {...(_isExpanded && { 'aria-expanded': true })}
151
151
  aria-haspopup={_isExpanded && this.isContentPopup()}
152
- aria-controls={expandableContentId}
152
+ aria-controls={_isExpanded ? expandableContentId : undefined}
153
153
  ref={this.toggleRef}
154
154
  >
155
155
  {toggleIcon}
@@ -69,7 +69,6 @@ exports[`Toolbar should render with custom chip content 1`] = `
69
69
  class="pf-v5-c-toolbar__toggle"
70
70
  >
71
71
  <button
72
- aria-controls="toolbar-with-filter-expandable-content-3"
73
72
  aria-disabled="false"
74
73
  aria-haspopup="false"
75
74
  aria-label="Show Filters"
@@ -198,7 +198,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
198
198
  <li
199
199
  id={id}
200
200
  className={css(styles.treeViewListItem, internalIsExpanded && styles.modifiers.expanded)}
201
- {...(internalIsExpanded && { 'aria-expanded': 'true' })}
201
+ aria-expanded={internalIsExpanded}
202
202
  role="treeitem"
203
203
  tabIndex={-1}
204
204
  >
@@ -1,242 +1,316 @@
1
1
  import React from 'react';
2
- import { render, screen, fireEvent } from '@testing-library/react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
3
4
  import { TreeView } from '../TreeView';
4
- import { Button } from '@patternfly/react-core';
5
- import FolderIcon from '@patternfly/react-icons/dist/esm/icons/folder-icon';
6
- import FolderOpenIcon from '@patternfly/react-icons/dist/esm/icons/folder-open-icon';
7
- import { TreeViewSearch } from '../TreeViewSearch';
8
-
9
- const options = [
10
- {
11
- name: 'ApplicationLauncher',
12
- id: 'AppLaunch',
13
- children: [
14
- {
15
- name: 'Application 1',
16
- id: 'App1',
17
- children: [
18
- { name: 'Settings', id: 'App1Settings' },
19
- { name: 'Current', id: 'App1Current' }
20
- ]
21
- },
22
- {
23
- name: 'Application 2',
24
- id: 'App2',
25
- children: [
26
- { name: 'Settings', id: 'App2Settings' },
27
- {
28
- name: 'Loader',
29
- id: 'App2Loader',
30
- children: [
31
- { name: 'Loading App 1', id: 'LoadApp1' },
32
- { name: 'Loading App 2', id: 'LoadApp2' },
33
- { name: 'Loading App 3', id: 'LoadApp3' }
34
- ]
35
- }
36
- ]
37
- }
38
- ],
39
- defaultExpanded: true
40
- },
41
- {
42
- name: 'Cost Management',
43
- id: 'Cost',
44
- children: [
45
- {
46
- name: 'Application 3',
47
- id: 'App3',
48
- children: [
49
- { name: 'Settings', id: 'App3Settings' },
50
- { name: 'Current', id: 'App3Current' }
51
- ]
52
- }
53
- ]
54
- },
55
- {
56
- name: 'Sources',
57
- id: 'Sources',
58
- children: [{ name: 'Application 4', id: 'App4', children: [{ name: 'Settings', id: 'App4Settings' }] }]
59
- },
60
- {
61
- name: 'Really really really long folder name that overflows the container it is in',
62
- id: 'Long',
63
- children: [{ name: 'Application 5', id: 'App5' }]
64
- }
65
- ];
66
-
67
- const flagOptions = [
68
- {
69
- name: 'ApplicationLauncher',
70
- id: 'AppLaunch',
71
- hasCheckbox: true,
72
- icon: <FolderIcon />,
73
- expandedIcon: <FolderOpenIcon />,
74
- children: [
75
- {
76
- name: 'Application 1',
77
- id: 'App1',
78
- children: [
79
- { name: 'Settings', id: 'App1Settings' },
80
- { name: 'Current', id: 'App1Current' }
81
- ]
82
- },
83
- {
84
- name: 'Application 2',
85
- id: 'App2',
86
- hasBadge: true,
87
- children: [
88
- { name: 'Settings', id: 'App2Settings', hasCheckbox: true },
89
- {
90
- name: 'Loader',
91
- id: 'App2Loader',
92
- children: [
93
- { name: 'Loading App 1', id: 'LoadApp1' },
94
- { name: 'Loading App 2', id: 'LoadApp2' },
95
- { name: 'Loading App 3', id: 'LoadApp3' }
96
- ]
97
- }
98
- ]
99
- }
100
- ],
101
- defaultExpanded: true
102
- },
103
- {
104
- name: 'Cost Management',
105
- id: 'Cost',
106
- hasBadge: true,
107
- action: (
108
- <Button variant="plain" aria-label="Folder action">
109
- <FolderIcon />
110
- </Button>
111
- ),
112
- children: [
113
- {
114
- name: 'Application 3',
115
- id: 'App3',
116
- children: [
117
- { name: 'Settings', id: 'App3Settings' },
118
- { name: 'Current', id: 'App3Current' }
119
- ]
120
- }
121
- ]
122
- },
123
- {
124
- name: 'Sources',
125
- id: 'Sources',
126
- children: [{ name: 'Application 4', id: 'App4', children: [{ name: 'Settings', id: 'App4Settings' }] }]
127
- },
128
- {
129
- name: 'Really really really long folder name that overflows the container it is in',
130
- id: 'Long',
131
- children: [{ name: 'Application 5', id: 'App5' }]
132
- }
133
- ];
134
-
135
- const active = [
136
- {
137
- name: 'Application 1',
138
- id: 'App1',
139
- children: [
140
- { name: 'Settings', id: 'App1Settings' },
141
- { name: 'Current', id: 'App1Current' }
142
- ]
143
- }
144
- ];
145
-
146
- describe('tree view', () => {
147
- test('renders basic successfully', () => {
148
- const { asFragment } = render(<TreeView data={options} onSelect={jest.fn()} />);
149
- expect(asFragment()).toMatchSnapshot();
150
- });
151
5
 
152
- test('calls onExpand and onCollapse appropriately', () => {
153
- const onExpand = jest.fn();
154
- const onCollapse = jest.fn();
155
- render(<TreeView data={options} onSelect={jest.fn()} onExpand={onExpand} onCollapse={onCollapse} />);
156
- expect(onExpand).not.toHaveBeenCalled();
157
- expect(onCollapse).not.toHaveBeenCalled();
158
- expect(screen.queryByText('Application 3')).toBeNull();
159
- expect(screen.getByText('Cost Management')).toBeInTheDocument();
160
- fireEvent(
161
- screen.getByText('Cost Management'),
162
- new MouseEvent('click', {
163
- bubbles: true,
164
- cancelable: true
165
- })
166
- );
167
- expect(onExpand).toHaveBeenCalled();
168
- expect(onCollapse).not.toHaveBeenCalled();
169
- expect(screen.getByText('Application 3')).toBeInTheDocument();
170
- fireEvent(
171
- screen.getByText('Cost Management'),
172
- new MouseEvent('click', {
173
- bubbles: true,
174
- cancelable: true
175
- })
176
- );
177
- expect(onCollapse).toHaveBeenCalled();
178
- expect(screen.queryByText('Application 3')).toBeNull();
179
- });
6
+ jest.mock('../TreeViewList', () => ({
7
+ TreeViewList: ({ children, isNested, toolbar }) => (
8
+ <div data-testid="TreeViewList-mock">
9
+ <p>{`TreeViewList isNested: ${isNested}`}</p>
10
+ <p>{`TreeViewList toolbar: ${toolbar}`}</p>
11
+ <div data-testid="TreeViewList-children">{children}</div>
12
+ </div>
13
+ )
14
+ }));
15
+ jest.mock('../TreeViewListItem', () => ({
16
+ TreeViewListItem: ({
17
+ action,
18
+ activeItems,
19
+ badgeProps,
20
+ checkProps,
21
+ children,
22
+ compareItems,
23
+ customBadgeContent,
24
+ defaultExpanded,
25
+ expandedIcon,
26
+ hasBadge,
27
+ hasCheckbox,
28
+ icon,
29
+ id,
30
+ isCompact,
31
+ isExpanded,
32
+ isSelectable,
33
+ itemData,
34
+ name,
35
+ onCheck,
36
+ onSelect,
37
+ onExpand,
38
+ onCollapse,
39
+ parentItem,
40
+ title,
41
+ useMemo
42
+ }) => (
43
+ <div data-testid="TreeViewListItem-mock">
44
+ <p>{`TreeViewListItem action: ${action}`}</p>
45
+ <div data-testid="TreeViewListItem-activeItems">{activeItems && activeItems[0].name}</div>
46
+ <p>{`TreeViewListItem badgeProps: ${badgeProps?.id}`}</p>
47
+ <p>{`TreeViewListItem checkProps: ${checkProps?.checked}`}</p>
48
+ <p>{`TreeViewListItem customBadgeContent: ${customBadgeContent}`}</p>
49
+ <p>{`TreeViewListItem defaultExpanded: ${defaultExpanded}`}</p>
50
+ <p>{`TreeViewListItem expandedIcon: ${expandedIcon}`}</p>
51
+ <p>{`TreeViewListItem hasBadge: ${hasBadge}`}</p>
52
+ <p>{`TreeViewListItem hasCheckbox: ${hasCheckbox}`}</p>
53
+ <p>{`TreeViewListItem icon: ${icon}`}</p>
54
+ <p>{`TreeViewListItem id: ${id}`}</p>
55
+ <p>{`TreeViewListItem isCompact: ${isCompact}`}</p>
56
+ <p>{`TreeViewListItem isExpanded: ${isExpanded}`}</p>
57
+ <p>{`TreeViewListItem isSelectable: ${isSelectable}`}</p>
58
+ <p>{`TreeViewListItem itemData: ${itemData.name}`}</p>
59
+ <p>{`TreeViewListItem name: ${name}`}</p>
60
+ <p>{`TreeViewListItem parentItem: ${parentItem?.name}`}</p>
61
+ <p>{`TreeViewListItem title: ${title}`}</p>
62
+ <p>{`TreeViewListItem useMemo: ${useMemo}`}</p>
63
+ <button onClick={compareItems}>compareItems clicker</button>
64
+ <button onClick={onCheck}>onCheck clicker</button>
65
+ <button onClick={onSelect}>onSelect clicker</button>
66
+ <button onClick={onExpand}>onExpand clicker</button>
67
+ <button onClick={onCollapse}>onCollapse clicker</button>
68
+ <div data-testid="TreeViewListItem-children">{children}</div>
69
+ </div>
70
+ )
71
+ }));
72
+ jest.mock('../TreeViewRoot', () => ({
73
+ TreeViewRoot: ({ children, hasCheckboxes, hasGuides, hasSelectableNodes, variant, className }) => (
74
+ <div data-testid="TreeViewRoot-mock">
75
+ <p>{`TreeViewRoot hasCheckboxes: ${hasCheckboxes}`}</p>
76
+ <p>{`TreeViewRoot hasGuides: ${hasGuides}`}</p>
77
+ <p>{`TreeViewRoot hasSelectableNodes: ${hasSelectableNodes}`}</p>
78
+ <p>{`TreeViewRoot variant: ${variant}`}</p>
79
+ <p>{`TreeViewRoot className: ${className}`}</p>
80
+ <div data-testid="TreeViewRoot-children">{children}</div>
81
+ </div>
82
+ )
83
+ }));
180
84
 
181
- test('renders active successfully', () => {
182
- const { asFragment } = render(<TreeView data={options} activeItems={active} onSelect={jest.fn()} />);
183
- expect(asFragment()).toMatchSnapshot();
184
- });
85
+ const basicData = {
86
+ name: 'Basic data name'
87
+ };
185
88
 
186
- test('renders search successfully', () => {
187
- const { asFragment } = render(
188
- <TreeViewSearch onSearch={jest.fn()} id="input-search" name="search-input" aria-label="Search input example" />
189
- );
190
- expect(asFragment()).toMatchSnapshot();
191
- });
89
+ test('Passes hasSelectableNodes to TreeViewRoot', () => {
90
+ render(<TreeView hasSelectableNodes data={[basicData]} />);
91
+
92
+ expect(screen.getByText('TreeViewRoot hasSelectableNodes: true')).toBeVisible();
93
+ });
94
+ test('Passes hasCheckboxes to TreeViewRoot', () => {
95
+ render(<TreeView hasCheckboxes data={[basicData]} />);
96
+
97
+ expect(screen.getByText('TreeViewRoot hasCheckboxes: true')).toBeVisible();
98
+ });
99
+ test('Passes hasGuides to TreeViewRoot', () => {
100
+ render(<TreeView hasGuides data={[basicData]} />);
101
+
102
+ expect(screen.getByText('TreeViewRoot hasGuides: true')).toBeVisible();
103
+ });
104
+ test('Passes variant to TreeViewRoot', () => {
105
+ render(<TreeView variant="compact" data={[basicData]} />);
106
+
107
+ expect(screen.getByText('TreeViewRoot variant: compact')).toBeVisible();
108
+ });
109
+ test('Passes className to TreeViewRoot', () => {
110
+ render(<TreeView className="test-class" data={[basicData]} />);
111
+
112
+ expect(screen.getByText('TreeViewRoot className: test-class')).toBeVisible();
113
+ });
114
+ test('Passes data as children TreeViewRoot', () => {
115
+ render(<TreeView data={[basicData]} />);
116
+
117
+ expect(screen.getByTestId('TreeViewRoot-children')).toContainHTML('TreeViewListItem name: Basic data name');
118
+ });
119
+ test('Does not render TreeViewRoot when parentItem is passed', () => {
120
+ render(<TreeView data={[basicData]} parentItem={{ name: 'Parent name' }} />);
121
+
122
+ expect(screen.queryByTestId('TreeViewRoot-mock')).not.toBeInTheDocument();
123
+ });
124
+
125
+ test('Passes isNested to TreeViewList', () => {
126
+ render(<TreeView isNested data={[basicData]} />);
127
+
128
+ expect(screen.getByText('TreeViewList isNested: true')).toBeVisible();
129
+ });
130
+ test('Passes toolbar to TreeViewList', () => {
131
+ render(<TreeView toolbar="Toolbar content" data={[basicData]} />);
132
+
133
+ expect(screen.getByText('TreeViewList toolbar: Toolbar content')).toBeVisible();
134
+ });
135
+ test('Passes data as children TreeViewList', () => {
136
+ render(<TreeView data={[basicData]} />);
192
137
 
193
- test('renders toolbar successfully', () => {
194
- const { asFragment } = render(
195
- <TreeView data={options} activeItems={active} onSelect={jest.fn()} toolbar={<div>test</div>} />
196
- );
197
- expect(asFragment()).toMatchSnapshot();
138
+ expect(screen.getByTestId('TreeViewList-children')).toContainHTML('TreeViewListItem name: Basic data name');
139
+ });
140
+
141
+ test('Passes data action to TreeViewListItem', () => {
142
+ render(<TreeView data={[{ ...basicData, action: 'Item action' }]} />);
143
+
144
+ expect(screen.getByText('TreeViewListItem action: Item action')).toBeVisible();
145
+ });
146
+ test('Passes activeItems to TreeViewListItem', () => {
147
+ render(<TreeView data={[basicData]} activeItems={[{ name: 'Active item name' }]} />);
148
+
149
+ expect(screen.getByTestId('TreeViewListItem-activeItems')).toHaveTextContent('Active item name');
150
+ });
151
+ test('Passes data badgeProps to TreeViewListItem', () => {
152
+ render(<TreeView data={[{ ...basicData, badgeProps: { id: 'test-id' } }]} />);
153
+
154
+ expect(screen.getByText('TreeViewListItem badgeProps: test-id')).toBeVisible();
155
+ });
156
+ test('Passes data checkProps to TreeViewListItem', () => {
157
+ render(<TreeView data={[{ ...basicData, checkProps: { checked: true } }]} />);
158
+
159
+ expect(screen.getByText('TreeViewListItem checkProps: true')).toBeVisible();
160
+ });
161
+ test('Passes data customBadgeContent to TreeViewListItem', () => {
162
+ render(<TreeView data={[{ ...basicData, customBadgeContent: 'Custom badge' }]} />);
163
+
164
+ expect(screen.getByText('TreeViewListItem customBadgeContent: Custom badge')).toBeVisible();
165
+ });
166
+ test('Passes data defaultExpanded to TreeViewListItem', () => {
167
+ render(<TreeView data={[{ ...basicData, defaultExpanded: true }]} />);
168
+
169
+ expect(screen.getByText('TreeViewListItem defaultExpanded: true')).toBeVisible();
170
+ });
171
+ test('Passes defaultAllExpanded to TreeViewListItem', () => {
172
+ render(<TreeView data={[basicData]} defaultAllExpanded />);
173
+
174
+ expect(screen.getByText('TreeViewListItem defaultExpanded: true')).toBeVisible();
175
+ });
176
+ test('Passes data expandedIcon to TreeViewListItem', () => {
177
+ render(<TreeView data={[{ ...basicData, expandedIcon: 'Expanded icon' }]} />);
178
+
179
+ expect(screen.getByText('TreeViewListItem expandedIcon: Expanded icon')).toBeVisible();
180
+ });
181
+ test('Passes expandedIcon to TreeViewListItem', () => {
182
+ render(<TreeView data={[basicData]} expandedIcon="Expanded icon" />);
183
+
184
+ expect(screen.getByText('TreeViewListItem expandedIcon: Expanded icon')).toBeVisible();
185
+ });
186
+ test('Passes data hasBadge to TreeViewListItem', () => {
187
+ render(<TreeView data={[{ ...basicData, hasBadge: true }]} />);
188
+
189
+ expect(screen.getByText('TreeViewListItem hasBadge: true')).toBeVisible();
190
+ });
191
+ test('Passes hasBadges to TreeViewListItem', () => {
192
+ render(<TreeView data={[basicData]} hasBadges={true} />);
193
+
194
+ expect(screen.getByText('TreeViewListItem hasBadge: true')).toBeVisible();
195
+ });
196
+ test('Passes data hasCheckbox to TreeViewListItem', () => {
197
+ render(<TreeView data={[{ ...basicData, hasCheckbox: true }]} />);
198
+
199
+ expect(screen.getByText('TreeViewListItem hasCheckbox: true')).toBeVisible();
200
+ });
201
+ test('Passes hasCheckboxes to TreeViewListItem', () => {
202
+ render(<TreeView data={[basicData]} hasCheckboxes={true} />);
203
+
204
+ expect(screen.getByText('TreeViewListItem hasCheckbox: true')).toBeVisible();
205
+ });
206
+ test('Passes data icon to TreeViewListItem', () => {
207
+ render(<TreeView data={[{ ...basicData, icon: 'Icon content' }]} />);
208
+
209
+ expect(screen.getByText('TreeViewListItem icon: Icon content')).toBeVisible();
210
+ });
211
+ test('Passes icon to TreeViewListItem', () => {
212
+ render(<TreeView data={[basicData]} icon="Icon content" />);
213
+
214
+ expect(screen.getByText('TreeViewListItem icon: Icon content')).toBeVisible();
215
+ });
216
+ test('Passes data id to TreeViewListItem', () => {
217
+ render(<TreeView data={[{ ...basicData, id: 'test-id' }]} />);
218
+
219
+ expect(screen.getByText('TreeViewListItem id: test-id')).toBeVisible();
220
+ });
221
+
222
+ ['default', 'compact', 'compactNoBackground'].forEach((variant) => {
223
+ test(`Passes isCompact to TreeViewListItem when variant=${variant}`, () => {
224
+ render(<TreeView data={[basicData]} variant={variant as 'default' | 'compact' | 'compactNoBackground'} />);
225
+
226
+ expect(screen.getByText(`TreeViewListItem isCompact: ${variant === 'default' ? 'false' : 'true'}`)).toBeVisible();
198
227
  });
228
+ });
229
+
230
+ test('Passes allExpanded to TreeViewListItem isExpanded prop', () => {
231
+ render(<TreeView data={[basicData]} allExpanded />);
232
+
233
+ expect(screen.getByText('TreeViewListItem isExpanded: true')).toBeVisible();
234
+ });
235
+ test('Passes hasSelectableNodes to TreeViewListItem isSelectable prop', () => {
236
+ render(<TreeView data={[basicData]} hasSelectableNodes />);
237
+
238
+ expect(screen.getByText('TreeViewListItem isSelectable: true')).toBeVisible();
239
+ });
240
+ test('Passes data to TreeViewListItem itemData prop', () => {
241
+ render(<TreeView data={[{ name: 'itemData name' }]} />);
242
+
243
+ expect(screen.getByText('TreeViewListItem itemData: itemData name')).toBeVisible();
244
+ });
245
+ test('Passes data.name to TreeViewListItem name prop', () => {
246
+ render(<TreeView data={[basicData]} />);
199
247
 
200
- test('renders checkboxes successfully', () => {
201
- const { asFragment } = render(<TreeView data={options} activeItems={active} onSelect={jest.fn()} hasCheckboxes />);
202
- expect(asFragment()).toMatchSnapshot();
248
+ expect(screen.getByText('TreeViewListItem name: Basic data name')).toBeVisible();
249
+ });
250
+ test('Passes parentItem to TreeViewListItem', () => {
251
+ render(<TreeView data={[basicData]} parentItem={{ name: 'Parent name' }} />);
252
+
253
+ expect(screen.getByText('TreeViewListItem parentItem: Parent name')).toBeVisible();
254
+ });
255
+ test('Passes data.title to TreeViewListItem', () => {
256
+ render(<TreeView data={[{ ...basicData, title: 'Basic data title' }]} />);
257
+
258
+ expect(screen.getByText('TreeViewListItem title: Basic data title')).toBeVisible();
259
+ });
260
+ test('Passes useMemo to TreeViewListItem', () => {
261
+ render(<TreeView data={[basicData]} useMemo={true} />);
262
+
263
+ expect(screen.getByText('TreeViewListItem useMemo: true')).toBeVisible();
264
+ });
265
+ test('Passes data.children to TreeViewListItem', () => {
266
+ render(<TreeView data={[{ ...basicData, children: [{ name: 'Child 1' }] }]} />);
267
+
268
+ expect(screen.getByText('TreeViewListItem name: Child 1')).toBeVisible();
269
+ });
270
+
271
+ describe('Passes callback props to TreeViewListItem', () => {
272
+ const user = userEvent.setup();
273
+ const callbackMock = jest.fn();
274
+
275
+ test('Passes compareItems', async () => {
276
+ render(<TreeView data={[basicData]} compareItems={callbackMock} />);
277
+
278
+ await user.click(screen.getByRole('button', { name: 'compareItems clicker' }));
279
+
280
+ expect(callbackMock).toHaveBeenCalledTimes(1);
203
281
  });
282
+ test('Passes onCheck', async () => {
283
+ render(<TreeView data={[basicData]} onCheck={callbackMock} />);
284
+
285
+ await user.click(screen.getByRole('button', { name: 'onCheck clicker' }));
204
286
 
205
- test('renders icons successfully', () => {
206
- const { asFragment } = render(
207
- <TreeView
208
- data={options}
209
- activeItems={active}
210
- onSelect={jest.fn()}
211
- icon={<FolderIcon />}
212
- expandedIcon={<FolderOpenIcon />}
213
- />
214
- );
215
- expect(asFragment()).toMatchSnapshot();
287
+ expect(callbackMock).toHaveBeenCalledTimes(1);
216
288
  });
289
+ test('Passes onSelect', async () => {
290
+ render(<TreeView data={[basicData]} onSelect={callbackMock} />);
217
291
 
218
- test('renders badges successfully', () => {
219
- const { asFragment } = render(<TreeView data={options} activeItems={active} onSelect={jest.fn()} hasBadges />);
220
- expect(asFragment()).toMatchSnapshot();
292
+ await user.click(screen.getByRole('button', { name: 'onSelect clicker' }));
293
+
294
+ expect(callbackMock).toHaveBeenCalledTimes(1);
221
295
  });
296
+ test('Passes onExpand', async () => {
297
+ render(<TreeView data={[basicData]} onExpand={callbackMock} />);
298
+
299
+ await user.click(screen.getByRole('button', { name: 'onExpand clicker' }));
222
300
 
223
- test('renders individual flag options successfully', () => {
224
- const { asFragment } = render(<TreeView data={flagOptions} activeItems={active} onSelect={jest.fn()} />);
225
- expect(asFragment()).toMatchSnapshot();
301
+ expect(callbackMock).toHaveBeenCalledTimes(1);
226
302
  });
227
- });
303
+ test('Passes onCollapse', async () => {
304
+ render(<TreeView data={[basicData]} onCollapse={callbackMock} />);
228
305
 
229
- test('renders guides successfully', () => {
230
- const { asFragment } = render(<TreeView data={options} onSelect={jest.fn()} hasGuides={true} />);
231
- expect(asFragment()).toMatchSnapshot();
232
- });
306
+ await user.click(screen.getByRole('button', { name: 'onCollapse clicker' }));
233
307
 
234
- test('renders compact successfully', () => {
235
- const { asFragment } = render(<TreeView data={options} onSelect={jest.fn()} variant="compact" />);
236
- expect(asFragment()).toMatchSnapshot();
308
+ expect(callbackMock).toHaveBeenCalledTimes(1);
309
+ });
237
310
  });
238
311
 
239
- test('renders compact no background successfully', () => {
240
- const { asFragment } = render(<TreeView data={options} onSelect={jest.fn()} variant="compactNoBackground" />);
312
+ test('Matches snapshot', () => {
313
+ const { asFragment } = render(<TreeView data={[basicData]} />);
314
+
241
315
  expect(asFragment()).toMatchSnapshot();
242
316
  });
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { TreeViewList } from '../TreeViewList';
4
+ import styles from '@patternfly/react-styles/css/components/TreeView/tree-view';
5
+
6
+ test(`Renders with class ${styles.treeView}__list by default`, () => {
7
+ render(<TreeViewList>Content</TreeViewList>);
8
+
9
+ expect(screen.getByRole('tree')).toHaveClass(`${styles.treeView}__list`, { exact: true });
10
+ });
11
+
12
+ test(`Renders with role="tree" by default`, () => {
13
+ render(<TreeViewList>Content</TreeViewList>);
14
+
15
+ expect(screen.getByRole('tree')).toHaveTextContent('Content');
16
+ });
17
+
18
+ test(`Renders with role="group" when isNested is true`, () => {
19
+ render(<TreeViewList isNested>Content</TreeViewList>);
20
+
21
+ expect(screen.getByRole('group')).toHaveTextContent('Content');
22
+ });
23
+
24
+ test(`Spreads additional props`, () => {
25
+ render(<TreeViewList id="test-id">Content</TreeViewList>);
26
+
27
+ expect(screen.getByRole('tree')).toHaveAttribute('id', 'test-id');
28
+ });
29
+
30
+ test(`Renders toolbar content when toolbar prop is passed`, () => {
31
+ render(<TreeViewList toolbar="Toolbar content">Content</TreeViewList>);
32
+
33
+ expect(screen.getByText('Toolbar content')).toBeInTheDocument();
34
+ });
35
+
36
+ test(`Does not render toolbar content when toolbar prop is not passed`, () => {
37
+ render(<TreeViewList>Content</TreeViewList>);
38
+
39
+ expect(screen.queryByRole('separator')).not.toBeInTheDocument();
40
+ });
41
+
42
+ test('Matches snapshot by default', () => {
43
+ const { asFragment } = render(<TreeViewList>Content</TreeViewList>);
44
+
45
+ expect(asFragment()).toMatchSnapshot();
46
+ });
47
+
48
+ test('Matches snapshot when toolbar is passed', () => {
49
+ const { asFragment } = render(<TreeViewList toolbar={<div>Toolbar content</div>}>Content</TreeViewList>);
50
+
51
+ expect(asFragment()).toMatchSnapshot();
52
+ });