import * as React from 'react'; import { Accessibility, menuItemAsToolbarButtonBehavior, tabBehavior } from '@fluentui/accessibility'; import { isConformant, handlesAccessibility, getRenderedAttribute, implementsShorthandProp, } from 'test/specs/commonTests'; import { mountWithProviderAndGetComponent, sharedIsConformant } from 'test/utils'; import { MenuItem } from 'src/components/Menu/MenuItem'; import { Menu } from 'src/components/Menu/Menu'; import { MenuItemWrapper, menuItemWrapperClassName } from 'src/components/Menu/MenuItemWrapper'; describe('MenuItem', () => { isConformant(MenuItem, { constructorName: 'MenuItem', eventTargets: { onClick: `.${menuItemWrapperClassName}`, }, wrapperComponent: MenuItemWrapper, autoControlledProps: ['menuOpen'], }); sharedIsConformant( { Component: MenuItem, displayName: 'MenuItem', wrapperComponent: MenuItemWrapper, }, __filename, ); implementsShorthandProp(MenuItem)('menu', Menu, { implementsPopper: true, requiredProps: { active: true, menuOpen: true }, }); it('content renders as `li > a`', () => { const menuItem = mountWithProviderAndGetComponent(MenuItem, ) .find(`.${menuItemWrapperClassName}`) .hostNodes(); expect(menuItem.is('li')).toBe(true); // The ElementType is wrapped with Ref, which is adding two HOC in total, that's why we need the three childAt(0) usages expect( menuItem .childAt(0) .childAt(0) .childAt(0) .is('a'), ).toBe(true); expect(menuItem.text()).toBe('Home'); }); it('children render directly inside `li`', () => { const menuItem = mountWithProviderAndGetComponent(MenuItem, Home) .find(`.${menuItemWrapperClassName}`) .hostNodes(); expect(menuItem.is('li')).toBe(true); expect( menuItem .childAt(0) .hostNodes() .exists(), ).toBe(false); expect(menuItem.text()).toBe('Home'); }); describe('accessibility', () => { handlesAccessibility(MenuItem, { defaultRootRole: 'presentation', usesWrapperSlot: true }); handlesAccessibility(MenuItem, { defaultRootRole: 'menuitem', partSelector: 'a' }); const behaviors: { name: string; behavior: Accessibility; expectedAnchorRole: string }[] = [ { name: 'default', behavior: undefined, expectedAnchorRole: 'menuitem' }, { name: 'menuItemAsToolbarButtonBehavior', behavior: menuItemAsToolbarButtonBehavior, expectedAnchorRole: 'button', }, { name: 'tabBehavior', behavior: tabBehavior, expectedAnchorRole: 'tab' }, ]; behaviors.forEach(accessibility => { test(`integration test for ${accessibility.name} behavior`, () => { // accessibility functionality is covered by a combination of behavior tests and `handlesAccessibility()` // this is just an integration smoke test const ariaLabel = 'Useful Tool Tip'; const menuItemComponent = mountWithProviderAndGetComponent( MenuItem, , ); expect(getRenderedAttribute(menuItemComponent, 'role', '')).toBe('presentation'); expect(getRenderedAttribute(menuItemComponent, 'aria-disabled', '')).toBe(undefined); expect(getRenderedAttribute(menuItemComponent, 'aria-label', '')).toBe(undefined); expect(getRenderedAttribute(menuItemComponent, 'role', 'a')).toBe(accessibility.expectedAnchorRole); expect(getRenderedAttribute(menuItemComponent, 'aria-disabled', 'a')).toBe('true'); expect(getRenderedAttribute(menuItemComponent, 'aria-label', 'a')).toBe(ariaLabel); }); }); }); });