import React, { useEffect } from 'react' import { ProductSwitcherBridge } from './product-switcher-bridge' import { NavigationBar } from './navigation-bar' import { render, act } from '../__utils/test-utils' import { LogoProjectPlace } from '../logos' import { ToolbarSectionLeft } from '../section' import { ToolbarButtonEmpty } from '../button' import userEvent from '@testing-library/user-event' function renderWithNavigationBar(component: React.ReactElement) { return render(component, { wrapper({ children }) { return ( } > Sample button ) }, }) } function ProductSwitcherBridgeWithFakeButton() { const ref = React.useRef(null) useEffect(() => { if (ref.current) { const button = document.createElement('button') button.setAttribute('aria-controls', 'app-switcher-list') button.tabIndex = -1 button.innerHTML = 'Product Switcher' ref.current.appendChild(button) } }) return } describe('ProductSwitcherBridge', () => { it('should not participate in keyboard navigation if event not yet received', async () => { const { getByRole } = renderWithNavigationBar( ) await userEvent.keyboard('{Tab}{ArrowRight}{ArrowRight}') expect(getByRole('button', { name: 'Sample button' })).toHaveFocus() await userEvent.keyboard('{ArrowLeft}{ArrowLeft}') expect( getByRole('button', { name: 'Product Switcher' }) ).not.toHaveFocus() }) it('should participate in keyboard navigation one event is received', async () => { const { getByRole } = renderWithNavigationBar( ) act(() => { const event = new CustomEvent('productswitcher', { detail: { visible: true }, }) document.dispatchEvent(event) }) await userEvent.keyboard('{Tab}{ArrowRight}{ArrowRight}') expect(getByRole('button', { name: 'Sample button' })).toHaveFocus() await userEvent.keyboard('{ArrowLeft}{ArrowLeft}') expect(getByRole('button', { name: 'Product Switcher' })).toHaveFocus() }) it('should focus the product switcher when the div is focused', async () => { const { container, getByRole } = renderWithNavigationBar( ) act(() => { const event = new CustomEvent('productswitcher', { detail: { visible: true }, }) document.dispatchEvent(event) }) /* Due to how react-roving-tabindex works, it will be focusable but not the first item */ const wrapperDiv = container.querySelector('div[tabIndex="-1"]')! await userEvent.click(wrapperDiv) expect(getByRole('button', { name: 'Product Switcher' })).toHaveFocus() }) })