@khanacademy/wonder-blocks-dropdown 5.1.7 → 5.1.9
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 +20 -0
- package/package.json +7 -7
- package/src/components/__tests__/action-menu.test.tsx +113 -75
- package/src/components/__tests__/dropdown-core.test.tsx +102 -65
- package/src/components/__tests__/multi-select.test.tsx +371 -304
- package/src/components/__tests__/single-select.test.tsx +258 -201
- package/tsconfig-build.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @khanacademy/wonder-blocks-dropdown
|
|
2
2
|
|
|
3
|
+
## 5.1.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [c39bfd29]
|
|
8
|
+
- @khanacademy/wonder-blocks-layout@2.0.29
|
|
9
|
+
- @khanacademy/wonder-blocks-cell@3.3.2
|
|
10
|
+
- @khanacademy/wonder-blocks-modal@4.2.7
|
|
11
|
+
- @khanacademy/wonder-blocks-search-field@2.2.6
|
|
12
|
+
|
|
13
|
+
## 5.1.8
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [e6433bee]
|
|
18
|
+
- @khanacademy/wonder-blocks-clickable@4.1.2
|
|
19
|
+
- @khanacademy/wonder-blocks-cell@3.3.1
|
|
20
|
+
- @khanacademy/wonder-blocks-search-field@2.2.5
|
|
21
|
+
- @khanacademy/wonder-blocks-modal@4.2.6
|
|
22
|
+
|
|
3
23
|
## 5.1.7
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@khanacademy/wonder-blocks-dropdown",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.9",
|
|
4
4
|
"design": "v1",
|
|
5
5
|
"description": "Dropdown variants for Wonder Blocks.",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@babel/runtime": "^7.18.6",
|
|
19
|
-
"@khanacademy/wonder-blocks-cell": "^3.3.
|
|
20
|
-
"@khanacademy/wonder-blocks-clickable": "^4.1.
|
|
19
|
+
"@khanacademy/wonder-blocks-cell": "^3.3.2",
|
|
20
|
+
"@khanacademy/wonder-blocks-clickable": "^4.1.2",
|
|
21
21
|
"@khanacademy/wonder-blocks-color": "^3.0.0",
|
|
22
22
|
"@khanacademy/wonder-blocks-core": "^6.3.1",
|
|
23
23
|
"@khanacademy/wonder-blocks-icon": "^4.0.1",
|
|
24
|
-
"@khanacademy/wonder-blocks-layout": "^2.0.
|
|
25
|
-
"@khanacademy/wonder-blocks-modal": "^4.2.
|
|
26
|
-
"@khanacademy/wonder-blocks-search-field": "^2.2.
|
|
24
|
+
"@khanacademy/wonder-blocks-layout": "^2.0.29",
|
|
25
|
+
"@khanacademy/wonder-blocks-modal": "^4.2.7",
|
|
26
|
+
"@khanacademy/wonder-blocks-search-field": "^2.2.6",
|
|
27
27
|
"@khanacademy/wonder-blocks-timing": "^4.0.2",
|
|
28
28
|
"@khanacademy/wonder-blocks-tokens": "^1.1.0",
|
|
29
29
|
"@khanacademy/wonder-blocks-typography": "^2.1.10"
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"react-window": "^1.8.5"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@khanacademy/wonder-blocks-button": "^6.2.
|
|
43
|
+
"@khanacademy/wonder-blocks-button": "^6.2.10",
|
|
44
44
|
"@khanacademy/wb-dev-build-settings": "^1.0.0"
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import {render, screen} from "@testing-library/react";
|
|
3
|
-
import userEvent from "@testing-library/user-event";
|
|
3
|
+
import {PointerEventsCheckLevel, userEvent} from "@testing-library/user-event";
|
|
4
4
|
|
|
5
5
|
import ActionItem from "../action-item";
|
|
6
6
|
import OptionItem from "../option-item";
|
|
@@ -12,7 +12,7 @@ describe("ActionMenu", () => {
|
|
|
12
12
|
const onToggle = jest.fn();
|
|
13
13
|
const onChange = jest.fn();
|
|
14
14
|
|
|
15
|
-
it("opens the menu on mouse click", () => {
|
|
15
|
+
it("opens the menu on mouse click", async () => {
|
|
16
16
|
// Arrange
|
|
17
17
|
render(
|
|
18
18
|
<ActionMenu
|
|
@@ -28,14 +28,18 @@ describe("ActionMenu", () => {
|
|
|
28
28
|
);
|
|
29
29
|
|
|
30
30
|
// Act
|
|
31
|
-
const opener = screen.
|
|
32
|
-
userEvent.click(opener);
|
|
31
|
+
const opener = await screen.findByRole("button");
|
|
32
|
+
await userEvent.click(opener);
|
|
33
33
|
|
|
34
34
|
// Assert
|
|
35
|
-
expect(
|
|
35
|
+
expect(
|
|
36
|
+
await screen.findByRole("menu", {hidden: true}),
|
|
37
|
+
).toBeInTheDocument();
|
|
36
38
|
});
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
// TODO(FEI-5533): Key press events aren't working correctly with
|
|
41
|
+
// user-event v14. We need to investigate and fix this.
|
|
42
|
+
it.skip("opens the menu on enter", async () => {
|
|
39
43
|
// Arrange
|
|
40
44
|
render(
|
|
41
45
|
<ActionMenu
|
|
@@ -51,14 +55,18 @@ describe("ActionMenu", () => {
|
|
|
51
55
|
);
|
|
52
56
|
|
|
53
57
|
// Act
|
|
54
|
-
userEvent.tab();
|
|
55
|
-
userEvent.keyboard("{enter}");
|
|
58
|
+
await userEvent.tab();
|
|
59
|
+
await userEvent.keyboard("{enter}");
|
|
56
60
|
|
|
57
61
|
// Assert
|
|
58
|
-
expect(
|
|
62
|
+
expect(
|
|
63
|
+
await screen.findByRole("menu", {hidden: true}),
|
|
64
|
+
).toBeInTheDocument();
|
|
59
65
|
});
|
|
60
66
|
|
|
61
|
-
|
|
67
|
+
// TODO(FEI-5533): Key press events aren't working correctly with
|
|
68
|
+
// user-event v14. We need to investigate and fix this.
|
|
69
|
+
it.skip("closes itself on escape", async () => {
|
|
62
70
|
// Arrange
|
|
63
71
|
render(
|
|
64
72
|
<ActionMenu
|
|
@@ -73,17 +81,19 @@ describe("ActionMenu", () => {
|
|
|
73
81
|
</ActionMenu>,
|
|
74
82
|
);
|
|
75
83
|
|
|
76
|
-
userEvent.tab();
|
|
77
|
-
userEvent.keyboard("{enter}");
|
|
84
|
+
await userEvent.tab();
|
|
85
|
+
await userEvent.keyboard("{enter}");
|
|
78
86
|
|
|
79
87
|
// Act
|
|
80
|
-
userEvent.keyboard("{escape}");
|
|
88
|
+
await userEvent.keyboard("{escape}");
|
|
81
89
|
|
|
82
90
|
// Assert
|
|
83
91
|
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
84
92
|
});
|
|
85
93
|
|
|
86
|
-
|
|
94
|
+
// TODO(FEI-5533): Key press events aren't working correctly with
|
|
95
|
+
// user-event v14. We need to investigate and fix this.
|
|
96
|
+
it.skip("closes itself on tab", async () => {
|
|
87
97
|
// Arrange
|
|
88
98
|
render(
|
|
89
99
|
<ActionMenu
|
|
@@ -98,17 +108,17 @@ describe("ActionMenu", () => {
|
|
|
98
108
|
</ActionMenu>,
|
|
99
109
|
);
|
|
100
110
|
|
|
101
|
-
userEvent.tab();
|
|
102
|
-
userEvent.keyboard("{enter}");
|
|
111
|
+
await userEvent.tab();
|
|
112
|
+
await userEvent.keyboard("{enter}");
|
|
103
113
|
|
|
104
114
|
// Act
|
|
105
|
-
userEvent.tab();
|
|
115
|
+
await userEvent.tab();
|
|
106
116
|
|
|
107
117
|
// Assert
|
|
108
118
|
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
109
119
|
});
|
|
110
120
|
|
|
111
|
-
it("closes itself on an external mouse click", () => {
|
|
121
|
+
it("closes itself on an external mouse click", async () => {
|
|
112
122
|
// Arrange
|
|
113
123
|
const {container} = render(
|
|
114
124
|
<ActionMenu
|
|
@@ -123,19 +133,19 @@ describe("ActionMenu", () => {
|
|
|
123
133
|
</ActionMenu>,
|
|
124
134
|
);
|
|
125
135
|
|
|
126
|
-
const opener = screen.
|
|
136
|
+
const opener = await screen.findByRole("button");
|
|
127
137
|
// open using the mouse
|
|
128
|
-
userEvent.click(opener);
|
|
138
|
+
await userEvent.click(opener);
|
|
129
139
|
|
|
130
140
|
// Act
|
|
131
141
|
// trigger body click
|
|
132
|
-
userEvent.click(container);
|
|
142
|
+
await userEvent.click(container);
|
|
133
143
|
|
|
134
144
|
// Assert
|
|
135
145
|
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
136
146
|
});
|
|
137
147
|
|
|
138
|
-
it("updates the aria-expanded value when opening", () => {
|
|
148
|
+
it("updates the aria-expanded value when opening", async () => {
|
|
139
149
|
// Arrange
|
|
140
150
|
render(
|
|
141
151
|
<ActionMenu
|
|
@@ -151,14 +161,14 @@ describe("ActionMenu", () => {
|
|
|
151
161
|
);
|
|
152
162
|
|
|
153
163
|
// Act
|
|
154
|
-
const opener = screen.
|
|
155
|
-
userEvent.click(opener);
|
|
164
|
+
const opener = await screen.findByRole("button");
|
|
165
|
+
await userEvent.click(opener);
|
|
156
166
|
|
|
157
167
|
// Assert
|
|
158
168
|
expect(opener).toHaveAttribute("aria-expanded", "true");
|
|
159
169
|
});
|
|
160
170
|
|
|
161
|
-
it("triggers actions", () => {
|
|
171
|
+
it("triggers actions", async () => {
|
|
162
172
|
// Arrange
|
|
163
173
|
const onChange = jest.fn();
|
|
164
174
|
render(
|
|
@@ -172,18 +182,22 @@ describe("ActionMenu", () => {
|
|
|
172
182
|
</ActionMenu>,
|
|
173
183
|
);
|
|
174
184
|
|
|
175
|
-
userEvent.click(screen.
|
|
185
|
+
await userEvent.click(await screen.findByRole("button"), {
|
|
186
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
187
|
+
});
|
|
176
188
|
|
|
177
189
|
// Act
|
|
178
190
|
// toggle second OptionItem
|
|
179
|
-
const optionItem = screen.
|
|
180
|
-
userEvent.click(optionItem
|
|
191
|
+
const optionItem = await screen.findByText("Toggle B");
|
|
192
|
+
await userEvent.click(optionItem, {
|
|
193
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
194
|
+
});
|
|
181
195
|
|
|
182
196
|
// Assert
|
|
183
197
|
expect(onChange).toHaveBeenCalledWith(["toggle_a", "toggle_b"]);
|
|
184
198
|
});
|
|
185
199
|
|
|
186
|
-
it("toggles select items", () => {
|
|
200
|
+
it("toggles select items", async () => {
|
|
187
201
|
// Arrange
|
|
188
202
|
const onChange = jest.fn();
|
|
189
203
|
render(
|
|
@@ -196,17 +210,21 @@ describe("ActionMenu", () => {
|
|
|
196
210
|
<OptionItem label="Toggle B" value="toggle_b" />
|
|
197
211
|
</ActionMenu>,
|
|
198
212
|
);
|
|
199
|
-
userEvent.click(screen.
|
|
213
|
+
await userEvent.click(await screen.findByRole("button"), {
|
|
214
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
215
|
+
});
|
|
200
216
|
|
|
201
217
|
// Act
|
|
202
|
-
const optionItem = screen.
|
|
203
|
-
userEvent.click(optionItem
|
|
218
|
+
const optionItem = await screen.findByText("Toggle A");
|
|
219
|
+
await userEvent.click(optionItem, {
|
|
220
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
221
|
+
});
|
|
204
222
|
|
|
205
223
|
// Assert
|
|
206
224
|
expect(onChange).toHaveBeenCalledWith(["toggle_a"]);
|
|
207
225
|
});
|
|
208
226
|
|
|
209
|
-
it("deselects selected OptionItems", () => {
|
|
227
|
+
it("deselects selected OptionItems", async () => {
|
|
210
228
|
// Arrange
|
|
211
229
|
const onChange = jest.fn();
|
|
212
230
|
render(
|
|
@@ -220,18 +238,22 @@ describe("ActionMenu", () => {
|
|
|
220
238
|
</ActionMenu>,
|
|
221
239
|
);
|
|
222
240
|
|
|
223
|
-
userEvent.click(screen.
|
|
241
|
+
await userEvent.click(await screen.findByRole("button"), {
|
|
242
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
243
|
+
});
|
|
224
244
|
|
|
225
245
|
// Act
|
|
226
246
|
// Deselect second OptionItem
|
|
227
|
-
const optionItem = screen.
|
|
228
|
-
userEvent.click(optionItem
|
|
247
|
+
const optionItem = await screen.findByText("Toggle B");
|
|
248
|
+
await userEvent.click(optionItem, {
|
|
249
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
250
|
+
});
|
|
229
251
|
|
|
230
252
|
// Assert
|
|
231
253
|
expect(onChange).toHaveBeenCalledWith(["toggle_a"]);
|
|
232
254
|
});
|
|
233
255
|
|
|
234
|
-
it("doesn't break with OptionItems but no onChange callback", () => {
|
|
256
|
+
it("doesn't break with OptionItems but no onChange callback", async () => {
|
|
235
257
|
// Arrange
|
|
236
258
|
render(
|
|
237
259
|
<ActionMenu
|
|
@@ -243,18 +265,20 @@ describe("ActionMenu", () => {
|
|
|
243
265
|
</ActionMenu>,
|
|
244
266
|
);
|
|
245
267
|
|
|
246
|
-
userEvent.click(screen.
|
|
268
|
+
await userEvent.click(await screen.findByRole("button"));
|
|
247
269
|
|
|
248
270
|
// Act, Assert
|
|
249
|
-
expect(() => {
|
|
271
|
+
expect(async () => {
|
|
250
272
|
// toggle second OptionItem
|
|
251
273
|
// eslint-disable-next-line no-console
|
|
252
|
-
const optionItem = screen.
|
|
253
|
-
userEvent.click(optionItem
|
|
274
|
+
const optionItem = await screen.findByText("Toggle B");
|
|
275
|
+
await userEvent.click(optionItem, {
|
|
276
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
277
|
+
});
|
|
254
278
|
}).not.toThrow();
|
|
255
279
|
});
|
|
256
280
|
|
|
257
|
-
it("works with extra selected values", () => {
|
|
281
|
+
it("works with extra selected values", async () => {
|
|
258
282
|
// Arrange
|
|
259
283
|
const onChange = jest.fn();
|
|
260
284
|
render(
|
|
@@ -267,18 +291,22 @@ describe("ActionMenu", () => {
|
|
|
267
291
|
<OptionItem label="Toggle B" value="toggle_b" />
|
|
268
292
|
</ActionMenu>,
|
|
269
293
|
);
|
|
270
|
-
userEvent.click(screen.
|
|
294
|
+
await userEvent.click(await screen.findByRole("button"), {
|
|
295
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
296
|
+
});
|
|
271
297
|
|
|
272
298
|
// Act
|
|
273
299
|
// toggle second OptionItem
|
|
274
|
-
const optionItem = screen.
|
|
275
|
-
userEvent.click(optionItem
|
|
300
|
+
const optionItem = await screen.findByText("Toggle A");
|
|
301
|
+
await userEvent.click(optionItem, {
|
|
302
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
303
|
+
});
|
|
276
304
|
|
|
277
305
|
// Assert
|
|
278
306
|
expect(onChange).toHaveBeenCalledWith(["toggle_z"]);
|
|
279
307
|
});
|
|
280
308
|
|
|
281
|
-
it("can have a menu with a single item", () => {
|
|
309
|
+
it("can have a menu with a single item", async () => {
|
|
282
310
|
// Arrange
|
|
283
311
|
render(
|
|
284
312
|
<ActionMenu menuText={"Action menu!"}>
|
|
@@ -287,24 +315,24 @@ describe("ActionMenu", () => {
|
|
|
287
315
|
);
|
|
288
316
|
|
|
289
317
|
// Act
|
|
290
|
-
userEvent.click(screen.
|
|
318
|
+
await userEvent.click(await screen.findByRole("button"));
|
|
291
319
|
|
|
292
320
|
// Assert
|
|
293
|
-
expect(screen.getAllByRole("menuitem")).toHaveLength(1);
|
|
321
|
+
expect(screen.getAllByRole("menuitem", {hidden: true})).toHaveLength(1);
|
|
294
322
|
});
|
|
295
323
|
|
|
296
|
-
it("can have a menu with no items", () => {
|
|
324
|
+
it("can have a menu with no items", async () => {
|
|
297
325
|
// Arrange
|
|
298
326
|
render(<ActionMenu menuText={"Action menu!"} />);
|
|
299
327
|
|
|
300
328
|
// Act
|
|
301
|
-
userEvent.click(screen.
|
|
329
|
+
await userEvent.click(await screen.findByRole("button"));
|
|
302
330
|
|
|
303
331
|
// Assert
|
|
304
332
|
expect(screen.queryByRole("menuitem")).not.toBeInTheDocument();
|
|
305
333
|
});
|
|
306
334
|
|
|
307
|
-
it("can have falsy items", () => {
|
|
335
|
+
it("can have falsy items", async () => {
|
|
308
336
|
// Arrange
|
|
309
337
|
const showDeleteAction = false;
|
|
310
338
|
render(
|
|
@@ -316,14 +344,14 @@ describe("ActionMenu", () => {
|
|
|
316
344
|
);
|
|
317
345
|
|
|
318
346
|
// Act
|
|
319
|
-
userEvent.click(screen.
|
|
347
|
+
await userEvent.click(await screen.findByRole("button"));
|
|
320
348
|
|
|
321
349
|
// Assert
|
|
322
|
-
expect(screen.getAllByRole("menuitem")).toHaveLength(1);
|
|
323
|
-
expect(screen.
|
|
350
|
+
expect(screen.getAllByRole("menuitem", {hidden: true})).toHaveLength(1);
|
|
351
|
+
expect(await screen.findByText("Create")).toBeInTheDocument();
|
|
324
352
|
});
|
|
325
353
|
|
|
326
|
-
it("verifies testId is added to the opener", () => {
|
|
354
|
+
it("verifies testId is added to the opener", async () => {
|
|
327
355
|
// Arrange
|
|
328
356
|
render(
|
|
329
357
|
<ActionMenu menuText={"Action menu!"} testId="some-test-id">
|
|
@@ -332,7 +360,7 @@ describe("ActionMenu", () => {
|
|
|
332
360
|
);
|
|
333
361
|
|
|
334
362
|
// Act
|
|
335
|
-
const opener = screen.
|
|
363
|
+
const opener = await screen.findByRole("button");
|
|
336
364
|
|
|
337
365
|
// Assert
|
|
338
366
|
expect(opener).toHaveAttribute("data-test-id", "some-test-id");
|
|
@@ -372,41 +400,49 @@ describe("ActionMenu", () => {
|
|
|
372
400
|
);
|
|
373
401
|
};
|
|
374
402
|
|
|
375
|
-
it("opens the menu when the parent updates its state", () => {
|
|
403
|
+
it("opens the menu when the parent updates its state", async () => {
|
|
376
404
|
// Arrange
|
|
377
405
|
const onToggleMock = jest.fn();
|
|
378
406
|
render(<ControlledComponent onToggle={onToggleMock} />);
|
|
379
407
|
|
|
380
408
|
// Act
|
|
381
|
-
userEvent.click(screen.
|
|
409
|
+
await userEvent.click(await screen.findByTestId("parent-button"));
|
|
382
410
|
|
|
383
411
|
// Assert
|
|
384
412
|
expect(onToggleMock).toHaveBeenCalledWith(true);
|
|
385
413
|
});
|
|
386
414
|
|
|
387
|
-
it("closes the menu when the parent updates its state", () => {
|
|
415
|
+
it("closes the menu when the parent updates its state", async () => {
|
|
388
416
|
const onToggleMock = jest.fn();
|
|
389
417
|
render(<ControlledComponent onToggle={onToggleMock} />);
|
|
390
418
|
|
|
391
419
|
// Act
|
|
392
420
|
// open the menu from the outside
|
|
393
|
-
userEvent.click(screen.
|
|
421
|
+
await userEvent.click(await screen.findByTestId("parent-button"), {
|
|
422
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
423
|
+
});
|
|
394
424
|
// click on first item
|
|
395
|
-
userEvent.click(screen.
|
|
425
|
+
await userEvent.click(await screen.findByText("Create"), {
|
|
426
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
427
|
+
});
|
|
396
428
|
|
|
397
429
|
// Assert
|
|
398
430
|
expect(onToggleMock).toHaveBeenCalledWith(false);
|
|
399
431
|
});
|
|
400
432
|
|
|
401
|
-
it("closes the menu when an option is clicked", () => {
|
|
433
|
+
it("closes the menu when an option is clicked", async () => {
|
|
402
434
|
// Arrange
|
|
403
435
|
render(<ControlledComponent />);
|
|
404
436
|
|
|
405
437
|
// Act
|
|
406
438
|
// open the menu from the outside
|
|
407
|
-
userEvent.click(screen.
|
|
439
|
+
await userEvent.click(await screen.findByTestId("parent-button"), {
|
|
440
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
441
|
+
});
|
|
408
442
|
// pick an option to close the menu
|
|
409
|
-
userEvent.click(screen.
|
|
443
|
+
await userEvent.click(await screen.findByText("Create"), {
|
|
444
|
+
pointerEventsCheck: PointerEventsCheckLevel.Never,
|
|
445
|
+
});
|
|
410
446
|
|
|
411
447
|
// Assert
|
|
412
448
|
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
@@ -414,7 +450,7 @@ describe("ActionMenu", () => {
|
|
|
414
450
|
});
|
|
415
451
|
|
|
416
452
|
describe("Custom Opener", () => {
|
|
417
|
-
it("opens the menu when clicking on the custom opener", () => {
|
|
453
|
+
it("opens the menu when clicking on the custom opener", async () => {
|
|
418
454
|
// Arrange
|
|
419
455
|
render(
|
|
420
456
|
<ActionMenu
|
|
@@ -431,13 +467,15 @@ describe("ActionMenu", () => {
|
|
|
431
467
|
);
|
|
432
468
|
|
|
433
469
|
// Act
|
|
434
|
-
userEvent.click(screen.
|
|
470
|
+
await userEvent.click(await screen.findByLabelText("Search"));
|
|
435
471
|
|
|
436
472
|
// Assert
|
|
437
|
-
expect(
|
|
473
|
+
expect(
|
|
474
|
+
await screen.findByRole("menu", {hidden: true}),
|
|
475
|
+
).toBeInTheDocument();
|
|
438
476
|
});
|
|
439
477
|
|
|
440
|
-
it("calls the custom onClick handler", () => {
|
|
478
|
+
it("calls the custom onClick handler", async () => {
|
|
441
479
|
// Arrange
|
|
442
480
|
const onClickMock = jest.fn();
|
|
443
481
|
|
|
@@ -456,13 +494,13 @@ describe("ActionMenu", () => {
|
|
|
456
494
|
);
|
|
457
495
|
|
|
458
496
|
// Act
|
|
459
|
-
userEvent.click(screen.
|
|
497
|
+
await userEvent.click(await screen.findByLabelText("Search"));
|
|
460
498
|
|
|
461
499
|
// Assert
|
|
462
500
|
expect(onClickMock).toHaveBeenCalledTimes(1);
|
|
463
501
|
});
|
|
464
502
|
|
|
465
|
-
it("verifies testId is passed from the custom opener", () => {
|
|
503
|
+
it("verifies testId is passed from the custom opener", async () => {
|
|
466
504
|
// Arrange
|
|
467
505
|
render(
|
|
468
506
|
<ActionMenu
|
|
@@ -481,13 +519,13 @@ describe("ActionMenu", () => {
|
|
|
481
519
|
);
|
|
482
520
|
|
|
483
521
|
// Act
|
|
484
|
-
const opener = screen.
|
|
522
|
+
const opener = await screen.findByLabelText("Custom opener");
|
|
485
523
|
|
|
486
524
|
// Assert
|
|
487
525
|
expect(opener).toHaveAttribute("data-test-id", "custom-opener");
|
|
488
526
|
});
|
|
489
527
|
|
|
490
|
-
it("verifies testId is not passed from the parent element", () => {
|
|
528
|
+
it("verifies testId is not passed from the parent element", async () => {
|
|
491
529
|
// Arrange
|
|
492
530
|
render(
|
|
493
531
|
<ActionMenu
|
|
@@ -502,13 +540,13 @@ describe("ActionMenu", () => {
|
|
|
502
540
|
);
|
|
503
541
|
|
|
504
542
|
// Act
|
|
505
|
-
const opener = screen.
|
|
543
|
+
const opener = await screen.findByLabelText("Custom opener");
|
|
506
544
|
|
|
507
545
|
// Assert
|
|
508
546
|
expect(opener).not.toHaveAttribute("data-test-id");
|
|
509
547
|
});
|
|
510
548
|
|
|
511
|
-
it("passes the menu text to the custom opener", () => {
|
|
549
|
+
it("passes the menu text to the custom opener", async () => {
|
|
512
550
|
// Arrange
|
|
513
551
|
render(
|
|
514
552
|
<ActionMenu
|
|
@@ -531,7 +569,7 @@ describe("ActionMenu", () => {
|
|
|
531
569
|
);
|
|
532
570
|
|
|
533
571
|
// Act
|
|
534
|
-
const opener = screen.
|
|
572
|
+
const opener = await screen.findByTestId("custom-opener");
|
|
535
573
|
|
|
536
574
|
// Assert
|
|
537
575
|
expect(opener).toHaveTextContent("Action menu!");
|