* Opens the submenu. Defaults to using the interaction type set on the menu tester. The submenu * trigger can be targeted via the trigger's node or the trigger's text.
(opts: MenuOpenSubmenuOpts)
| 309 | * trigger can be targeted via the trigger's node or the trigger's text. |
| 310 | */ |
| 311 | async openSubmenu(opts: MenuOpenSubmenuOpts): Promise<MenuTester> { |
| 312 | let {submenuTrigger, needsLongPress, interactionType = this._interactionType} = opts; |
| 313 | |
| 314 | let trigger = this.getTrigger(); |
| 315 | let isDisabled = trigger.hasAttribute('disabled'); |
| 316 | if (isDisabled) { |
| 317 | throw new Error( |
| 318 | `Cannot open submenu because its parent menu's trigger "${formatTargetNode(trigger)}" is disabled.` |
| 319 | ); |
| 320 | } |
| 321 | if (!trigger.getAttribute('aria-controls')) { |
| 322 | await this.open({needsLongPress}); |
| 323 | } |
| 324 | let menu = this.getMenu(); |
| 325 | if (!menu) { |
| 326 | throw new Error( |
| 327 | `Cannot open submenu, parent menu didn't open on trigger "${formatTargetNode(trigger)}" press.` |
| 328 | ); |
| 329 | } |
| 330 | if (typeof submenuTrigger === 'string') { |
| 331 | submenuTrigger = within(menu!) |
| 332 | .getByText(submenuTrigger) |
| 333 | .closest('[role=menuitem]')! as HTMLElement; |
| 334 | } |
| 335 | |
| 336 | if ( |
| 337 | submenuTrigger.getAttribute('aria-disabled') === 'true' || |
| 338 | submenuTrigger.hasAttribute('disabled') |
| 339 | ) { |
| 340 | throw new Error( |
| 341 | `Cannot open submenu because its trigger "${formatTargetNode(submenuTrigger)}" is disabled.` |
| 342 | ); |
| 343 | } |
| 344 | |
| 345 | let submenuTriggerTester = new MenuTester({ |
| 346 | user: this.user, |
| 347 | interactionType: this._interactionType, |
| 348 | root: submenuTrigger, |
| 349 | isSubmenu: true, |
| 350 | advanceTimer: this._advanceTimer, |
| 351 | rootMenu: (this._isSubmenu ? this._rootMenu : this.getMenu()) || undefined |
| 352 | }); |
| 353 | if (interactionType === 'mouse') { |
| 354 | await this.user.pointer({target: submenuTrigger}); |
| 355 | } else if (interactionType === 'keyboard') { |
| 356 | await this.keyboardNavigateToOption({option: submenuTrigger}); |
| 357 | await this.user.keyboard('[ArrowRight]'); |
| 358 | } else { |
| 359 | await submenuTriggerTester.open(); |
| 360 | } |
| 361 | |
| 362 | await waitFor(() => { |
| 363 | if (submenuTriggerTester._trigger?.getAttribute('aria-expanded') !== 'true') { |
| 364 | throw new Error( |
| 365 | 'aria-expanded for the submenu trigger wasn\'t changed to "true", unable to confirm the existance of the submenu' |
| 366 | ); |
| 367 | } else { |
| 368 | return true; |
no test coverage detected