@dhis2-ui/select 10.9.2 → 10.10.0-alpha.2

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 (150) hide show
  1. package/build/cjs/index.js +18 -4
  2. package/build/cjs/locales/en/translations.json +7 -5
  3. package/build/cjs/simple-single-select/__stories__/DefaultPosition.js +38 -0
  4. package/build/cjs/simple-single-select/__stories__/Dense.js +22 -0
  5. package/build/cjs/simple-single-select/__stories__/Empty.js +20 -0
  6. package/build/cjs/simple-single-select/__stories__/EmptyWithEmptyNode.js +28 -0
  7. package/build/cjs/simple-single-select/__stories__/EmptyWithEmptyText.js +21 -0
  8. package/build/cjs/simple-single-select/__stories__/FlippedPosition.js +37 -0
  9. package/build/cjs/simple-single-select/__stories__/InfiniteLoading.js +61 -0
  10. package/build/cjs/simple-single-select/__stories__/Loading.js +20 -0
  11. package/build/cjs/simple-single-select/__stories__/ShiftedIntoView.js +28 -0
  12. package/build/cjs/simple-single-select/__stories__/WithClearButton.js +25 -0
  13. package/build/cjs/simple-single-select/__stories__/WithCustomLowMaxHeight.js +22 -0
  14. package/build/cjs/simple-single-select/__stories__/WithCustomOptions.js +48 -0
  15. package/build/cjs/simple-single-select/__stories__/WithDisabledOption.js +28 -0
  16. package/build/cjs/simple-single-select/__stories__/WithFilterField.js +36 -0
  17. package/build/cjs/simple-single-select/__stories__/WithInitialFocus.js +38 -0
  18. package/build/cjs/simple-single-select/__stories__/WithManyOptions.js +24 -0
  19. package/build/cjs/simple-single-select/__stories__/WithNoMatchText.js +30 -0
  20. package/build/cjs/simple-single-select/__stories__/WithOnBlur.js +23 -0
  21. package/build/cjs/simple-single-select/__stories__/WithOnFocus.js +23 -0
  22. package/build/cjs/simple-single-select/__stories__/WithOptionsAndDisabled.js +22 -0
  23. package/build/cjs/simple-single-select/__stories__/WithOptionsAndLoading.js +34 -0
  24. package/build/cjs/simple-single-select/__stories__/WithOptionsAndLoadingText.js +35 -0
  25. package/build/cjs/simple-single-select/__stories__/WithPlaceholder.js +23 -0
  26. package/build/cjs/simple-single-select/__stories__/WithPlaceholderAndSelection.js +25 -0
  27. package/build/cjs/simple-single-select/__stories__/WithPrefix.js +22 -0
  28. package/build/cjs/simple-single-select/__stories__/WithPrefixAndSelection.js +25 -0
  29. package/build/cjs/simple-single-select/__stories__/WithRTL.js +34 -0
  30. package/build/cjs/simple-single-select/__stories__/WithScrollingParent.js +36 -0
  31. package/build/cjs/simple-single-select/__stories__/WithSelection.js +24 -0
  32. package/build/cjs/simple-single-select/__stories__/WithSelectionAndDisabled.js +25 -0
  33. package/build/cjs/simple-single-select/__stories__/WithoutOptionsAndLoading.js +21 -0
  34. package/build/cjs/simple-single-select/__stories__/WithoutSelection.js +22 -0
  35. package/build/cjs/simple-single-select/__stories__/options.js +77 -0
  36. package/build/cjs/simple-single-select/features/keyboard-interactions.test.e2e.js +441 -0
  37. package/build/cjs/simple-single-select/features/menu-positioning.test.e2e.js +152 -0
  38. package/build/cjs/simple-single-select/index.js +19 -0
  39. package/build/cjs/simple-single-select/is-option-hidden.js +22 -0
  40. package/build/cjs/simple-single-select/menu/empty.js +26 -0
  41. package/build/cjs/simple-single-select/menu/filter.js +60 -0
  42. package/build/cjs/simple-single-select/menu/index.js +12 -0
  43. package/build/cjs/simple-single-select/menu/loading.js +30 -0
  44. package/build/cjs/simple-single-select/menu/menu.js +158 -0
  45. package/build/cjs/simple-single-select/menu/no-match.js +28 -0
  46. package/build/cjs/simple-single-select/menu/option.js +120 -0
  47. package/build/cjs/simple-single-select/menu/options-list.js +97 -0
  48. package/build/cjs/simple-single-select/selected-value/clear-button.js +74 -0
  49. package/build/cjs/simple-single-select/selected-value/container.js +100 -0
  50. package/build/cjs/simple-single-select/selected-value/index.js +12 -0
  51. package/build/cjs/simple-single-select/selected-value/placeholder.js +30 -0
  52. package/build/cjs/simple-single-select/selected-value/prefix.js +30 -0
  53. package/build/cjs/simple-single-select/selected-value/selected-value.js +119 -0
  54. package/build/cjs/simple-single-select/shared-prop-types.js +14 -0
  55. package/build/cjs/simple-single-select/simple-single-select.e2e.stories.js +156 -0
  56. package/build/cjs/simple-single-select/simple-single-select.js +319 -0
  57. package/build/cjs/simple-single-select/simple-single-select.prod.stories.js +235 -0
  58. package/build/cjs/simple-single-select/simple-single-select.test.js +1106 -0
  59. package/build/cjs/simple-single-select/use-handle-key-press/index.js +19 -0
  60. package/build/cjs/simple-single-select/use-handle-key-press/use-focus-option.js +24 -0
  61. package/build/cjs/simple-single-select/use-handle-key-press/use-handle-key-press-on-combobox.js +183 -0
  62. package/build/cjs/simple-single-select/use-handle-key-press/use-handle-key-press-on-filter-input.js +106 -0
  63. package/build/cjs/simple-single-select/use-handle-key-press/use-handle-typing.js +81 -0
  64. package/build/cjs/simple-single-select/use-handle-key-press/use-highlight-first-option-on-previous-page.js +50 -0
  65. package/build/cjs/simple-single-select/use-handle-key-press/use-highlight-first-visible-option.js +30 -0
  66. package/build/cjs/simple-single-select/use-handle-key-press/use-highlight-last-option-on-next-page.js +50 -0
  67. package/build/cjs/simple-single-select/use-handle-key-press/use-highlight-last-visible-option.js +42 -0
  68. package/build/cjs/simple-single-select/use-handle-key-press/use-page-down.js +45 -0
  69. package/build/cjs/simple-single-select/use-handle-key-press/use-page-up.js +44 -0
  70. package/build/cjs/simple-single-select/use-handle-key-press/utils.js +46 -0
  71. package/build/cjs/simple-single-select-field/index.js +12 -0
  72. package/build/cjs/simple-single-select-field/simple-single-select-field.js +138 -0
  73. package/build/cjs/simple-single-select-field/simple-single-select-field.prod.stories.js +188 -0
  74. package/build/cjs/simple-single-select-field/simple-single-select-field.test.js +133 -0
  75. package/build/es/index.js +2 -0
  76. package/build/es/locales/en/translations.json +7 -5
  77. package/build/es/simple-single-select/__stories__/DefaultPosition.js +29 -0
  78. package/build/es/simple-single-select/__stories__/Dense.js +13 -0
  79. package/build/es/simple-single-select/__stories__/Empty.js +11 -0
  80. package/build/es/simple-single-select/__stories__/EmptyWithEmptyNode.js +19 -0
  81. package/build/es/simple-single-select/__stories__/EmptyWithEmptyText.js +12 -0
  82. package/build/es/simple-single-select/__stories__/FlippedPosition.js +28 -0
  83. package/build/es/simple-single-select/__stories__/InfiniteLoading.js +53 -0
  84. package/build/es/simple-single-select/__stories__/Loading.js +12 -0
  85. package/build/es/simple-single-select/__stories__/ShiftedIntoView.js +18 -0
  86. package/build/es/simple-single-select/__stories__/WithClearButton.js +16 -0
  87. package/build/es/simple-single-select/__stories__/WithCustomLowMaxHeight.js +13 -0
  88. package/build/es/simple-single-select/__stories__/WithCustomOptions.js +38 -0
  89. package/build/es/simple-single-select/__stories__/WithDisabledOption.js +19 -0
  90. package/build/es/simple-single-select/__stories__/WithFilterField.js +27 -0
  91. package/build/es/simple-single-select/__stories__/WithInitialFocus.js +29 -0
  92. package/build/es/simple-single-select/__stories__/WithManyOptions.js +15 -0
  93. package/build/es/simple-single-select/__stories__/WithNoMatchText.js +21 -0
  94. package/build/es/simple-single-select/__stories__/WithOnBlur.js +14 -0
  95. package/build/es/simple-single-select/__stories__/WithOnFocus.js +14 -0
  96. package/build/es/simple-single-select/__stories__/WithOptionsAndDisabled.js +13 -0
  97. package/build/es/simple-single-select/__stories__/WithOptionsAndLoading.js +25 -0
  98. package/build/es/simple-single-select/__stories__/WithOptionsAndLoadingText.js +26 -0
  99. package/build/es/simple-single-select/__stories__/WithPlaceholder.js +14 -0
  100. package/build/es/simple-single-select/__stories__/WithPlaceholderAndSelection.js +16 -0
  101. package/build/es/simple-single-select/__stories__/WithPrefix.js +13 -0
  102. package/build/es/simple-single-select/__stories__/WithPrefixAndSelection.js +16 -0
  103. package/build/es/simple-single-select/__stories__/WithRTL.js +25 -0
  104. package/build/es/simple-single-select/__stories__/WithScrollingParent.js +27 -0
  105. package/build/es/simple-single-select/__stories__/WithSelection.js +15 -0
  106. package/build/es/simple-single-select/__stories__/WithSelectionAndDisabled.js +16 -0
  107. package/build/es/simple-single-select/__stories__/WithoutOptionsAndLoading.js +12 -0
  108. package/build/es/simple-single-select/__stories__/WithoutSelection.js +13 -0
  109. package/build/es/simple-single-select/__stories__/options.js +71 -0
  110. package/build/es/simple-single-select/features/keyboard-interactions.test.e2e.js +439 -0
  111. package/build/es/simple-single-select/features/menu-positioning.test.e2e.js +150 -0
  112. package/build/es/simple-single-select/index.js +2 -0
  113. package/build/es/simple-single-select/is-option-hidden.js +16 -0
  114. package/build/es/simple-single-select/menu/empty.js +19 -0
  115. package/build/es/simple-single-select/menu/filter.js +53 -0
  116. package/build/es/simple-single-select/menu/index.js +1 -0
  117. package/build/es/simple-single-select/menu/loading.js +23 -0
  118. package/build/es/simple-single-select/menu/menu.js +149 -0
  119. package/build/es/simple-single-select/menu/no-match.js +21 -0
  120. package/build/es/simple-single-select/menu/option.js +111 -0
  121. package/build/es/simple-single-select/menu/options-list.js +88 -0
  122. package/build/es/simple-single-select/selected-value/clear-button.js +68 -0
  123. package/build/es/simple-single-select/selected-value/container.js +91 -0
  124. package/build/es/simple-single-select/selected-value/index.js +1 -0
  125. package/build/es/simple-single-select/selected-value/placeholder.js +23 -0
  126. package/build/es/simple-single-select/selected-value/prefix.js +23 -0
  127. package/build/es/simple-single-select/selected-value/selected-value.js +112 -0
  128. package/build/es/simple-single-select/shared-prop-types.js +7 -0
  129. package/build/es/simple-single-select/simple-single-select.e2e.stories.js +142 -0
  130. package/build/es/simple-single-select/simple-single-select.js +310 -0
  131. package/build/es/simple-single-select/simple-single-select.prod.stories.js +37 -0
  132. package/build/es/simple-single-select/simple-single-select.test.js +1103 -0
  133. package/build/es/simple-single-select/use-handle-key-press/index.js +2 -0
  134. package/build/es/simple-single-select/use-handle-key-press/use-focus-option.js +18 -0
  135. package/build/es/simple-single-select/use-handle-key-press/use-handle-key-press-on-combobox.js +177 -0
  136. package/build/es/simple-single-select/use-handle-key-press/use-handle-key-press-on-filter-input.js +100 -0
  137. package/build/es/simple-single-select/use-handle-key-press/use-handle-typing.js +75 -0
  138. package/build/es/simple-single-select/use-handle-key-press/use-highlight-first-option-on-previous-page.js +44 -0
  139. package/build/es/simple-single-select/use-handle-key-press/use-highlight-first-visible-option.js +24 -0
  140. package/build/es/simple-single-select/use-handle-key-press/use-highlight-last-option-on-next-page.js +44 -0
  141. package/build/es/simple-single-select/use-handle-key-press/use-highlight-last-visible-option.js +36 -0
  142. package/build/es/simple-single-select/use-handle-key-press/use-page-down.js +39 -0
  143. package/build/es/simple-single-select/use-handle-key-press/use-page-up.js +38 -0
  144. package/build/es/simple-single-select/use-handle-key-press/utils.js +36 -0
  145. package/build/es/simple-single-select-field/index.js +1 -0
  146. package/build/es/simple-single-select-field/simple-single-select-field.js +131 -0
  147. package/build/es/simple-single-select-field/simple-single-select-field.prod.stories.js +172 -0
  148. package/build/es/simple-single-select-field/simple-single-select-field.test.js +130 -0
  149. package/package.json +15 -15
  150. package/types/index.d.ts +184 -1
@@ -0,0 +1,1106 @@
1
+ "use strict";
2
+
3
+ require("@testing-library/jest-dom");
4
+ var _react = require("@testing-library/react");
5
+ var _react2 = _interopRequireDefault(require("react"));
6
+ var _simpleSingleSelect = require("./simple-single-select.js");
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ describe('<SimpleSingleSelect />', () => {
9
+ beforeAll(() => {
10
+ const consoleError = console.error;
11
+ jest.spyOn(console, 'error').mockImplementation(function () {
12
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
13
+ args[_key] = arguments[_key];
14
+ }
15
+ const [message, dynamicContent] = args;
16
+ if (message.startsWith('Warning: An update to %s inside a test was not wrapped in act(...)') && dynamicContent === 'Popper') {
17
+ return;
18
+ }
19
+ consoleError(...args);
20
+ });
21
+ });
22
+ afterAll(() => {
23
+ console.error.mockRestore();
24
+ });
25
+ it('should accept an onBlur handler', () => {
26
+ const onBlur = jest.fn();
27
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
28
+ onBlur: onBlur,
29
+ name: "simple",
30
+ selected: {
31
+ value: 'foo',
32
+ label: 'Foo'
33
+ },
34
+ onChange: () => null,
35
+ options: [{
36
+ value: 'foo',
37
+ label: 'Foo'
38
+ }]
39
+ }));
40
+ _react.fireEvent.blur(_react.screen.getByRole('combobox'));
41
+
42
+ // first argument passed to onBlur is a react event
43
+ //
44
+ // Reg. eslint: Eslint complains about using hasOwnProperty,
45
+ // but accessing `.nativeEvent` directly causes react to log an error
46
+ // eslint-disable-next-line no-prototype-builtins
47
+ expect(onBlur.mock.calls[0][0].hasOwnProperty('nativeEvent')).toBe(true);
48
+ expect(onBlur).toHaveBeenCalledTimes(1);
49
+ });
50
+ it('should accept an onFocus handler', () => {
51
+ const onFocus = jest.fn();
52
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
53
+ onFocus: onFocus,
54
+ name: "simple",
55
+ selected: {
56
+ value: 'foo',
57
+ label: 'Foo'
58
+ },
59
+ onChange: () => null,
60
+ options: [{
61
+ value: 'foo',
62
+ label: 'Foo'
63
+ }]
64
+ }));
65
+ _react.fireEvent.focus(_react.screen.getByRole('combobox'));
66
+
67
+ // first argument passed to onFocus is a react event
68
+ //
69
+ // Reg. eslint: Eslint complains about using hasOwnProperty,
70
+ // but accessing `.nativeEvent` directly causes react to log an error
71
+ // eslint-disable-next-line no-prototype-builtins
72
+ expect(onFocus.mock.calls[0][0].hasOwnProperty('nativeEvent')).toBe(true);
73
+ expect(onFocus).toHaveBeenCalledTimes(1);
74
+ });
75
+ it('should accept autoFocus', () => {
76
+ const onFocus = jest.fn();
77
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
78
+ autoFocus: true,
79
+ onFocus: onFocus,
80
+ name: "simple",
81
+ selected: {
82
+ value: 'foo',
83
+ label: 'Foo'
84
+ },
85
+ onChange: () => null,
86
+ options: [{
87
+ value: 'foo',
88
+ label: 'Foo'
89
+ }]
90
+ }));
91
+ expect(onFocus).toHaveBeenCalledTimes(1);
92
+ });
93
+ it('should accept loading', () => {
94
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
95
+ loading: true,
96
+ name: "simple",
97
+ selected: {
98
+ value: 'foo',
99
+ label: 'Foo'
100
+ },
101
+ onChange: () => null,
102
+ options: [{
103
+ value: 'foo',
104
+ label: 'Foo'
105
+ }]
106
+ }));
107
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
108
+ const loadingIndicator = _react.screen.getByRole('progressbar');
109
+ expect(loadingIndicator).toBeTruthy();
110
+ });
111
+ it('should display a loading text', () => {
112
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
113
+ loading: true,
114
+ menuLoadingText: "Loading text",
115
+ name: "simple",
116
+ selected: {
117
+ value: 'foo',
118
+ label: 'Foo'
119
+ },
120
+ onChange: () => null,
121
+ options: [{
122
+ value: 'foo',
123
+ label: 'Foo'
124
+ }]
125
+ }));
126
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
127
+ const loadingIndicator = _react.screen.getByRole('progressbar');
128
+ expect(loadingIndicator).toBeTruthy();
129
+ const loadingText = _react.screen.getByText('Loading text');
130
+ expect(loadingText).toBeTruthy();
131
+ });
132
+ it('should accept a max height', () => {
133
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
134
+ menuMaxHeight: "100px",
135
+ name: "simple",
136
+ selected: {
137
+ value: 'foo',
138
+ label: 'Foo'
139
+ },
140
+ onChange: () => null,
141
+ options: [{
142
+ value: 'foo',
143
+ label: 'Foo'
144
+ }]
145
+ }));
146
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
147
+ const listbox = _react.screen.getByRole('listbox');
148
+ const menu = listbox.parentNode.parentNode.parentNode;
149
+ expect(menu.style.maxHeight).toBe('100px');
150
+ });
151
+ it('should accept a placeholder', () => {
152
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
153
+ name: "simple",
154
+ selected: null,
155
+ placeholder: "Placeholder text",
156
+ onChange: () => null,
157
+ options: [{
158
+ value: 'foo',
159
+ label: 'Foo'
160
+ }]
161
+ }));
162
+ const placeholder = _react.screen.getByText('Placeholder text');
163
+ const dataTestValue = placeholder.attributes.getNamedItem('data-test').value;
164
+ expect(dataTestValue).toBe('dhis2-simplesingleselect-selectedvalue-placeholder');
165
+ });
166
+ it('should accept a prefix', () => {
167
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
168
+ prefix: "Prefix text",
169
+ name: "simple",
170
+ selected: {
171
+ value: 'foo',
172
+ label: 'Foo'
173
+ },
174
+ onChange: () => null,
175
+ options: [{
176
+ value: 'foo',
177
+ label: 'Foo'
178
+ }]
179
+ }));
180
+ const placeholder = _react.screen.getByText('Prefix text');
181
+ const dataTestValue = placeholder.attributes.getNamedItem('data-test').value;
182
+ expect(dataTestValue).toBe('dhis2-simplesingleselect-selectedvalue-prefix');
183
+ });
184
+ it('should allow options to be selected', () => {
185
+ const onChange = jest.fn();
186
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
187
+ name: "simple",
188
+ selected: null,
189
+ onChange: onChange,
190
+ options: [{
191
+ value: '',
192
+ label: 'None'
193
+ }, {
194
+ value: 'foo',
195
+ label: 'Foo'
196
+ }, {
197
+ value: 'bar',
198
+ label: 'Bar'
199
+ }]
200
+ }));
201
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
202
+ const option = _react.screen.getByText('Foo').parentNode;
203
+ expect(option.attributes.getNamedItem('role').value).toBe('option');
204
+ _react.fireEvent.click(option);
205
+ expect(onChange).toHaveBeenCalledTimes(1);
206
+ expect(onChange).toHaveBeenCalledWith({
207
+ value: 'foo',
208
+ label: 'Foo'
209
+ });
210
+ });
211
+ it('should allow custom options to be selected', () => {
212
+ const onChange = jest.fn();
213
+
214
+ // eslint-disable-next-line react/prop-types
215
+ const CustomOption = _ref => {
216
+ let {
217
+ value,
218
+ label
219
+ } = _ref;
220
+ return /*#__PURE__*/_react2.default.createElement("span", {
221
+ "data-test": `custom-option-${value}`
222
+ }, label);
223
+ };
224
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
225
+ name: "simple",
226
+ selected: null,
227
+ optionComponent: CustomOption,
228
+ valueLabel: "",
229
+ onChange: onChange,
230
+ options: [{
231
+ value: '',
232
+ label: 'None'
233
+ }, {
234
+ value: 'foo',
235
+ label: 'Foo'
236
+ }]
237
+ }));
238
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
239
+ const optionComponent = _react.screen.getByTestId('custom-option-foo');
240
+ const option = _react.screen.getByTestId('custom-option-foo').parentNode;
241
+ expect(option.attributes.getNamedItem('role').value).toBe('option');
242
+ _react.fireEvent.click(optionComponent);
243
+ expect(onChange).toHaveBeenCalledTimes(1);
244
+ expect(onChange).toHaveBeenCalledWith({
245
+ value: 'foo',
246
+ label: 'Foo'
247
+ });
248
+ });
249
+ it('should allow individual custom options to be selected', () => {
250
+ const onChange = jest.fn();
251
+
252
+ // eslint-disable-next-line react/prop-types
253
+ const CustomOption = _ref2 => {
254
+ let {
255
+ value,
256
+ label
257
+ } = _ref2;
258
+ return /*#__PURE__*/_react2.default.createElement("span", {
259
+ "data-test": `custom-option-${value}`
260
+ }, label);
261
+ };
262
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
263
+ name: "simple",
264
+ selected: null,
265
+ valueLabel: "",
266
+ onChange: onChange,
267
+ options: [{
268
+ value: '',
269
+ label: 'None'
270
+ }, {
271
+ value: 'foo',
272
+ label: 'Foo',
273
+ component: CustomOption
274
+ }]
275
+ }));
276
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
277
+ const optionComponent = _react.screen.getByTestId('custom-option-foo');
278
+ const option = _react.screen.getByTestId('custom-option-foo').parentNode;
279
+ expect(option.attributes.getNamedItem('role').value).toBe('option');
280
+ _react.fireEvent.click(optionComponent);
281
+ expect(onChange).toHaveBeenCalledTimes(1);
282
+ expect(onChange).toHaveBeenCalledWith({
283
+ value: 'foo',
284
+ label: 'Foo'
285
+ });
286
+ });
287
+ it('should be clearable when there is a selected value', () => {
288
+ const onClear = jest.fn();
289
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
290
+ clearable: true,
291
+ clearText: "Clear simple select",
292
+ name: "simple",
293
+ selected: {
294
+ value: 'foo',
295
+ label: 'Foo'
296
+ },
297
+ valueLabel: "Foo",
298
+ onChange: () => null,
299
+ onClear: onClear,
300
+ options: [{
301
+ value: 'foo',
302
+ label: 'Foo'
303
+ }]
304
+ }));
305
+ const clearButton = _react.screen.getByLabelText('Clear simple select');
306
+ expect(clearButton).toBeInstanceOf(HTMLElement);
307
+ _react.fireEvent.click(clearButton);
308
+ expect(onClear).toHaveBeenCalledTimes(1);
309
+ });
310
+ it('should not be clearable when there is no selected value', () => {
311
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
312
+ clearable: true,
313
+ clearText: "Clear simple select",
314
+ name: "simple",
315
+ selected: null,
316
+ onChange: jest.fn(),
317
+ options: [{
318
+ value: '',
319
+ label: 'None'
320
+ }, {
321
+ value: 'foo',
322
+ label: 'Foo'
323
+ }]
324
+ }));
325
+ const clearButton = _react.screen.queryByLabelText('Clear simple select');
326
+ expect(clearButton).toBeNull();
327
+ });
328
+ it('should be disabled', () => {
329
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
330
+ disabled: true,
331
+ name: "simple",
332
+ selected: {
333
+ value: 'foo',
334
+ label: 'Foo'
335
+ },
336
+ onChange: jest.fn(),
337
+ options: [{
338
+ value: 'foo',
339
+ label: 'Foo'
340
+ }]
341
+ }));
342
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
343
+
344
+ // Element is in the dom, but invisible, which makes it inaccessible
345
+ const listbox = _react.screen.queryByRole('listbox');
346
+ expect(listbox).toBeNull();
347
+ const clearButton = _react.screen.queryByLabelText('Clear simple select');
348
+ expect(clearButton).toBeNull();
349
+ });
350
+ it('should have an empty-text in the menu', () => {
351
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
352
+ empty: "Empty",
353
+ name: "simple",
354
+ selected: null,
355
+ onChange: jest.fn(),
356
+ options: []
357
+ }));
358
+ const emptyTextBeforeOpen = _react.screen.queryByText('Empty');
359
+ expect(emptyTextBeforeOpen).toBeNull();
360
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
361
+ const emptyTextAfterOpen = _react.screen.queryByText('Empty');
362
+ expect(emptyTextAfterOpen).toBeVisible();
363
+ });
364
+ it('should provide updates about the filter value', () => {
365
+ const onFilterChange = jest.fn();
366
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
367
+ filterable: true,
368
+ onFilterChange: onFilterChange,
369
+ noMatchText: "No options found",
370
+ name: "simple",
371
+ selected: {
372
+ value: 'foo',
373
+ label: 'Foo'
374
+ },
375
+ onChange: jest.fn(),
376
+ options: [{
377
+ value: 'foo',
378
+ label: 'Foo'
379
+ }]
380
+ }));
381
+ expect(_react.screen.queryByLabelText('Search options')).toBeNull();
382
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
383
+ const searchInput = _react.screen.getByLabelText('Search options');
384
+ expect(searchInput).toBeInstanceOf(HTMLInputElement);
385
+ expect(searchInput).toBeVisible();
386
+ _react.fireEvent.change(searchInput, {
387
+ target: {
388
+ value: 'Search term'
389
+ }
390
+ });
391
+ expect(onFilterChange).toHaveBeenCalledTimes(1);
392
+ expect(onFilterChange).toHaveBeenCalledWith('Search term');
393
+ });
394
+ it('should apply a custom filter label', () => {
395
+ const onFilterChange = jest.fn();
396
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
397
+ filterable: true,
398
+ filterLabel: "Custom filter label",
399
+ onFilterChange: onFilterChange,
400
+ noMatchText: "No options found",
401
+ name: "simple",
402
+ selected: null,
403
+ valueLabel: "",
404
+ onChange: jest.fn(),
405
+ options: [{
406
+ value: '',
407
+ label: 'None'
408
+ }, {
409
+ value: 'foo',
410
+ label: 'Foo'
411
+ }]
412
+ }));
413
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
414
+ expect(_react.screen.getByLabelText('Custom filter label')).not.toBeNull();
415
+ });
416
+ it('should display the selected option', () => {
417
+ const onChange = jest.fn();
418
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
419
+ name: "simple",
420
+ selected: {
421
+ value: 'bar',
422
+ label: 'Bar'
423
+ },
424
+ onChange: onChange,
425
+ options: [{
426
+ value: 'foo',
427
+ label: 'Foo'
428
+ }, {
429
+ value: 'bar',
430
+ label: 'Bar'
431
+ }]
432
+ }));
433
+ const combobox = _react.screen.getByRole('combobox');
434
+ const withTextBar = _react.screen.getByText('Bar', {
435
+ selector: '.selected-option-label'
436
+ });
437
+ expect(combobox).toContainElement(withTextBar);
438
+ });
439
+
440
+ /***************************
441
+ * *
442
+ * ===================== *
443
+ * Keyboard interactions *
444
+ * ===================== *
445
+ * *
446
+ **************************/
447
+ describe.each([{
448
+ key: ' '
449
+ }, {
450
+ key: 'Enter'
451
+ }, {
452
+ key: 'ArrowDown',
453
+ altKey: true
454
+ }, {
455
+ key: 'ArrowUp',
456
+ altKey: true
457
+ }])('$key ($altKey)', keyDownOptions => {
458
+ test('open the menu', () => {
459
+ const onChange = jest.fn();
460
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
461
+ name: "simple",
462
+ selected: null,
463
+ onChange: onChange,
464
+ options: [{
465
+ value: '',
466
+ label: 'None'
467
+ }, {
468
+ value: 'foo',
469
+ label: 'Foo'
470
+ }, {
471
+ value: 'bar',
472
+ label: 'Bar'
473
+ }]
474
+ }));
475
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), keyDownOptions);
476
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
477
+ expect(onChange).not.toHaveBeenCalled();
478
+ });
479
+ });
480
+ describe.each([{
481
+ key: ' '
482
+ }, {
483
+ key: 'Enter'
484
+ }, {
485
+ key: 'ArrowDown',
486
+ altKey: true
487
+ }, {
488
+ key: 'ArrowUp',
489
+ altKey: true
490
+ }])('disabled & $key ($altKey)', keyDownOptions => {
491
+ test('not open the menu', () => {
492
+ const onChange = jest.fn();
493
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
494
+ disabled: true,
495
+ name: "simple",
496
+ selected: null,
497
+ onChange: onChange,
498
+ options: [{
499
+ value: '',
500
+ label: 'None'
501
+ }, {
502
+ value: 'foo',
503
+ label: 'Foo'
504
+ }, {
505
+ value: 'bar',
506
+ label: 'Bar'
507
+ }]
508
+ }));
509
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), keyDownOptions);
510
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
511
+ expect(onChange).not.toHaveBeenCalled();
512
+ });
513
+ });
514
+ describe.each([{
515
+ key: ' '
516
+ }, {
517
+ key: 'Enter'
518
+ }, {
519
+ key: 'ArrowDown',
520
+ altKey: true
521
+ }, {
522
+ key: 'ArrowUp',
523
+ altKey: true
524
+ }])('$key ($altKey)', keyDownOptions => {
525
+ test('close the menu', () => {
526
+ const onChange = jest.fn();
527
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
528
+ name: "simple",
529
+ selected: null,
530
+ onChange: onChange,
531
+ options: [{
532
+ value: '',
533
+ label: 'None'
534
+ }, {
535
+ value: 'foo',
536
+ label: 'Foo'
537
+ }, {
538
+ value: 'bar',
539
+ label: 'Bar'
540
+ }]
541
+ }));
542
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
543
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
544
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), keyDownOptions);
545
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
546
+ expect(onChange).not.toHaveBeenCalled();
547
+ });
548
+ });
549
+ describe.each([{
550
+ key: 'Escape'
551
+ }, {
552
+ key: 'Enter'
553
+ }, {
554
+ key: 'ArrowDown',
555
+ altKey: true
556
+ }, {
557
+ key: 'ArrowUp',
558
+ altKey: true
559
+ }])('$key ($altKey)', keyDownOptions => {
560
+ test('close the menu and select the highlighted option after having highlighted another option', () => {
561
+ const onChange = jest.fn();
562
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
563
+ name: "simple",
564
+ selected: null,
565
+ onChange: onChange,
566
+ options: [{
567
+ value: '',
568
+ label: 'None'
569
+ }, {
570
+ value: 'foo',
571
+ label: 'Foo'
572
+ }, {
573
+ value: 'bar',
574
+ label: 'Bar'
575
+ }]
576
+ }));
577
+ _react.fireEvent.click(_react.screen.getByRole('combobox'));
578
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
579
+
580
+ // highlighting the next option
581
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
582
+ key: 'ArrowDown'
583
+ });
584
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), keyDownOptions);
585
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
586
+ expect(onChange).toHaveBeenCalledTimes(1);
587
+ expect(onChange).toHaveBeenCalledWith({
588
+ value: 'foo',
589
+ label: 'Foo'
590
+ });
591
+ });
592
+ });
593
+ it('should select the next option when closed and user presses ArrowDown', () => {
594
+ const onChange = jest.fn();
595
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
596
+ name: "simple",
597
+ selected: null,
598
+ onChange: onChange,
599
+ options: [{
600
+ value: '',
601
+ label: 'None'
602
+ }, {
603
+ value: 'foo',
604
+ label: 'Foo'
605
+ }, {
606
+ value: 'bar',
607
+ label: 'Bar'
608
+ }]
609
+ }));
610
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
611
+
612
+ // highlighting the next option
613
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
614
+ key: 'ArrowDown'
615
+ });
616
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
617
+ expect(onChange).toHaveBeenCalledTimes(1);
618
+ expect(onChange).toHaveBeenCalledWith({
619
+ value: 'foo',
620
+ label: 'Foo'
621
+ });
622
+ });
623
+ it('should not select the next option when closed, disabled and user presses ArrowDown', () => {
624
+ const onChange = jest.fn();
625
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
626
+ disabled: true,
627
+ name: "simple",
628
+ selected: null,
629
+ onChange: onChange,
630
+ options: [{
631
+ value: '',
632
+ label: 'None'
633
+ }, {
634
+ value: 'foo',
635
+ label: 'Foo'
636
+ }, {
637
+ value: 'bar',
638
+ label: 'Bar'
639
+ }]
640
+ }));
641
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
642
+
643
+ // highlighting the next option
644
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
645
+ key: 'ArrowDown'
646
+ });
647
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
648
+ expect(onChange).toHaveBeenCalledTimes(0);
649
+ });
650
+ it('should select the second-next option when closed, next option is disabled and user presses ArrowDown', () => {
651
+ const onChange = jest.fn();
652
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
653
+ name: "simple",
654
+ selected: null,
655
+ onChange: onChange,
656
+ options: [{
657
+ value: '',
658
+ label: 'None'
659
+ }, {
660
+ value: 'foo',
661
+ label: 'Foo',
662
+ disabled: true
663
+ }, {
664
+ value: 'bar',
665
+ label: 'Bar'
666
+ }]
667
+ }));
668
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
669
+
670
+ // highlighting the next option
671
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
672
+ key: 'ArrowDown'
673
+ });
674
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
675
+ expect(onChange).toHaveBeenCalledTimes(1);
676
+ expect(onChange).toHaveBeenCalledWith({
677
+ value: 'bar',
678
+ label: 'Bar'
679
+ });
680
+ });
681
+ it('should select the previous option when closed and user presses ArrowUp', () => {
682
+ const onChange = jest.fn();
683
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
684
+ name: "simple",
685
+ selected: {
686
+ value: 'bar',
687
+ label: 'Bar'
688
+ },
689
+ onChange: onChange,
690
+ options: [{
691
+ value: '',
692
+ label: 'None'
693
+ }, {
694
+ value: 'foo',
695
+ label: 'Foo'
696
+ }, {
697
+ value: 'bar',
698
+ label: 'Bar'
699
+ }]
700
+ }));
701
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
702
+
703
+ // highlighting the next option
704
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
705
+ key: 'ArrowUp'
706
+ });
707
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
708
+ expect(onChange).toHaveBeenCalledTimes(1);
709
+ expect(onChange).toHaveBeenCalledWith({
710
+ value: 'foo',
711
+ label: 'Foo'
712
+ });
713
+ });
714
+ it('should not select the previous option when closed, disabled and user presses ArrowUp', () => {
715
+ const onChange = jest.fn();
716
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
717
+ disabled: true,
718
+ name: "simple",
719
+ selected: {
720
+ value: 'bar',
721
+ label: 'Bar'
722
+ },
723
+ onChange: onChange,
724
+ options: [{
725
+ value: '',
726
+ label: 'None'
727
+ }, {
728
+ value: 'foo',
729
+ label: 'Foo'
730
+ }, {
731
+ value: 'bar',
732
+ label: 'Bar'
733
+ }]
734
+ }));
735
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
736
+
737
+ // highlighting the next option
738
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
739
+ key: 'ArrowUp'
740
+ });
741
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
742
+ expect(onChange).toHaveBeenCalledTimes(0);
743
+ });
744
+ it('should select the second-previous option when closed, previous option disabled and user presses ArrowUp', () => {
745
+ const onChange = jest.fn();
746
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
747
+ name: "simple",
748
+ selected: {
749
+ value: 'bar',
750
+ label: 'Bar'
751
+ },
752
+ onChange: onChange,
753
+ options: [{
754
+ value: '',
755
+ label: 'None'
756
+ }, {
757
+ value: 'foo',
758
+ label: 'Foo',
759
+ disabled: true
760
+ }, {
761
+ value: 'bar',
762
+ label: 'Bar'
763
+ }]
764
+ }));
765
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
766
+
767
+ // highlighting the next option
768
+ _react.fireEvent.keyDown(_react.screen.getByRole('combobox'), {
769
+ key: 'ArrowUp'
770
+ });
771
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
772
+ expect(onChange).toHaveBeenCalledTimes(1);
773
+ expect(onChange).toHaveBeenCalledWith({
774
+ value: '',
775
+ label: 'None'
776
+ });
777
+ });
778
+ it('should highlight the next option', () => {
779
+ const onChange = jest.fn();
780
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
781
+ name: "simple",
782
+ selected: null,
783
+ onChange: onChange,
784
+ options: [{
785
+ value: '',
786
+ label: 'None'
787
+ }, {
788
+ value: 'foo',
789
+ label: 'Foo'
790
+ }, {
791
+ value: 'bar',
792
+ label: 'Bar'
793
+ }]
794
+ }));
795
+
796
+ // open the menu
797
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
798
+ const comboBox = _react.screen.getByRole('combobox');
799
+ _react.fireEvent.click(comboBox);
800
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
801
+
802
+ // the first option should be highlighted
803
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
804
+ selected: true
805
+ });
806
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('None');
807
+
808
+ // The second option should be highlighted
809
+ _react.fireEvent.keyDown(comboBox, {
810
+ key: 'ArrowDown'
811
+ });
812
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
813
+ selected: true
814
+ });
815
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('Foo');
816
+ });
817
+ it('should highlight the second next option when the next option is disabled', () => {
818
+ const onChange = jest.fn();
819
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
820
+ name: "simple",
821
+ selected: null,
822
+ onChange: onChange,
823
+ options: [{
824
+ value: '',
825
+ label: 'None'
826
+ }, {
827
+ value: 'foo',
828
+ label: 'Foo',
829
+ disabled: true
830
+ }, {
831
+ value: 'bar',
832
+ label: 'Bar'
833
+ }]
834
+ }));
835
+
836
+ // open the menu
837
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
838
+ const comboBox = _react.screen.getByRole('combobox');
839
+ _react.fireEvent.click(comboBox);
840
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
841
+
842
+ // the first option should be highlighted
843
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
844
+ selected: true
845
+ });
846
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('None');
847
+
848
+ // The second option should be highlighted
849
+ _react.fireEvent.keyDown(comboBox, {
850
+ key: 'ArrowDown'
851
+ });
852
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
853
+ selected: true
854
+ });
855
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('Bar');
856
+ });
857
+ it('should highlight the previous option', () => {
858
+ const onChange = jest.fn();
859
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
860
+ name: "simple",
861
+ selected: {
862
+ value: 'bar',
863
+ label: 'Bar'
864
+ },
865
+ onChange: onChange,
866
+ options: [{
867
+ value: '',
868
+ label: 'None'
869
+ }, {
870
+ value: 'foo',
871
+ label: 'Foo'
872
+ }, {
873
+ value: 'bar',
874
+ label: 'Bar'
875
+ }]
876
+ }));
877
+
878
+ // open the menu
879
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
880
+ const comboBox = _react.screen.getByRole('combobox');
881
+ _react.fireEvent.click(comboBox);
882
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
883
+
884
+ // the last option should be highlighted
885
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
886
+ selected: true
887
+ });
888
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('Bar');
889
+
890
+ // The second option should be highlighted
891
+ _react.fireEvent.keyDown(comboBox, {
892
+ key: 'ArrowUp'
893
+ });
894
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
895
+ selected: true
896
+ });
897
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('Foo');
898
+ });
899
+ it('should highlight the second previous option when previous option is disabled', () => {
900
+ const onChange = jest.fn();
901
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
902
+ name: "simple",
903
+ selected: {
904
+ value: 'bar',
905
+ label: 'Bar'
906
+ },
907
+ onChange: onChange,
908
+ options: [{
909
+ value: '',
910
+ label: 'None'
911
+ }, {
912
+ value: 'foo',
913
+ label: 'Foo',
914
+ disabled: true
915
+ }, {
916
+ value: 'bar',
917
+ label: 'Bar'
918
+ }]
919
+ }));
920
+
921
+ // open the menu
922
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
923
+ const comboBox = _react.screen.getByRole('combobox');
924
+ _react.fireEvent.click(comboBox);
925
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
926
+
927
+ // the last option should be highlighted
928
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
929
+ selected: true
930
+ });
931
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('Bar');
932
+
933
+ // The second option should be highlighted
934
+ _react.fireEvent.keyDown(comboBox, {
935
+ key: 'ArrowUp'
936
+ });
937
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
938
+ selected: true
939
+ });
940
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('None');
941
+ });
942
+ it('should highlight the first option', () => {
943
+ const onChange = jest.fn();
944
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
945
+ name: "simple",
946
+ selected: {
947
+ value: 'bar',
948
+ label: 'Bar'
949
+ },
950
+ onChange: onChange,
951
+ options: [{
952
+ value: '',
953
+ label: 'None'
954
+ }, {
955
+ value: 'foo',
956
+ label: 'Foo'
957
+ }, {
958
+ value: 'bar',
959
+ label: 'Bar'
960
+ }]
961
+ }));
962
+
963
+ // open the menu
964
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
965
+ const comboBox = _react.screen.getByRole('combobox');
966
+ _react.fireEvent.click(comboBox);
967
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
968
+
969
+ // the last option should be highlighted
970
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
971
+ selected: true
972
+ });
973
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('Bar');
974
+
975
+ // The first option should be highlighted
976
+ _react.fireEvent.keyDown(comboBox, {
977
+ key: 'Home'
978
+ });
979
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
980
+ selected: true
981
+ });
982
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('None');
983
+ });
984
+ it('should highlight the first enabled option', () => {
985
+ const onChange = jest.fn();
986
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
987
+ name: "simple",
988
+ selected: {
989
+ value: 'bar',
990
+ label: 'Bar'
991
+ },
992
+ onChange: onChange,
993
+ options: [{
994
+ value: '',
995
+ label: 'None',
996
+ disabled: true
997
+ }, {
998
+ value: 'foo',
999
+ label: 'Foo'
1000
+ }, {
1001
+ value: 'bar',
1002
+ label: 'Bar'
1003
+ }]
1004
+ }));
1005
+
1006
+ // open the menu
1007
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
1008
+ const comboBox = _react.screen.getByRole('combobox');
1009
+ _react.fireEvent.click(comboBox);
1010
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
1011
+
1012
+ // the last option should be highlighted
1013
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
1014
+ selected: true
1015
+ });
1016
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('Bar');
1017
+
1018
+ // The first option should be highlighted
1019
+ _react.fireEvent.keyDown(comboBox, {
1020
+ key: 'Home'
1021
+ });
1022
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
1023
+ selected: true
1024
+ });
1025
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('Foo');
1026
+ });
1027
+ it('should highlight the last option', () => {
1028
+ const onChange = jest.fn();
1029
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
1030
+ name: "simple",
1031
+ selected: null,
1032
+ onChange: onChange,
1033
+ options: [{
1034
+ value: '',
1035
+ label: 'None'
1036
+ }, {
1037
+ value: 'foo',
1038
+ label: 'Foo'
1039
+ }, {
1040
+ value: 'bar',
1041
+ label: 'Bar'
1042
+ }]
1043
+ }));
1044
+
1045
+ // open the menu
1046
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
1047
+ const comboBox = _react.screen.getByRole('combobox');
1048
+ _react.fireEvent.click(comboBox);
1049
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
1050
+
1051
+ // the first option should be highlighted
1052
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
1053
+ selected: true
1054
+ });
1055
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('None');
1056
+
1057
+ // The last option should be highlighted
1058
+ _react.fireEvent.keyDown(comboBox, {
1059
+ key: 'End'
1060
+ });
1061
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
1062
+ selected: true
1063
+ });
1064
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('Bar');
1065
+ });
1066
+ it('should highlight the last enabled option', () => {
1067
+ const onChange = jest.fn();
1068
+ (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_simpleSingleSelect.SimpleSingleSelect, {
1069
+ name: "simple",
1070
+ selected: null,
1071
+ onChange: onChange,
1072
+ options: [{
1073
+ value: '',
1074
+ label: 'None'
1075
+ }, {
1076
+ value: 'foo',
1077
+ label: 'Foo'
1078
+ }, {
1079
+ value: 'bar',
1080
+ label: 'Bar',
1081
+ disabled: true
1082
+ }]
1083
+ }));
1084
+
1085
+ // open the menu
1086
+ expect(_react.screen.queryByRole('listbox')).toBeNull();
1087
+ const comboBox = _react.screen.getByRole('combobox');
1088
+ _react.fireEvent.click(comboBox);
1089
+ expect(_react.screen.queryByRole('listbox')).not.toBeNull();
1090
+
1091
+ // the first option should be highlighted
1092
+ const highlightedOptionBefore = _react.screen.getByRole('option', {
1093
+ selected: true
1094
+ });
1095
+ expect(highlightedOptionBefore.attributes.getNamedItem('aria-label').value).toBe('None');
1096
+
1097
+ // The last option should be highlighted
1098
+ _react.fireEvent.keyDown(comboBox, {
1099
+ key: 'End'
1100
+ });
1101
+ const highlightedOptionAfter = _react.screen.getByRole('option', {
1102
+ selected: true
1103
+ });
1104
+ expect(highlightedOptionAfter.attributes.getNamedItem('aria-label').value).toBe('Foo');
1105
+ });
1106
+ });