import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { SimpleDropdown } from '../SimpleDropdown'; import styles from '@patternfly/react-styles/css/components/MenuToggle/menu-toggle'; describe('Dropdown toggle', () => { test('Renders dropdown toggle as not disabled when isDisabled is not true', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).not.toBeDisabled(); }); test('Renders dropdown toggle as disabled when isDisabled is true', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).toBeDisabled(); }); test('Passes toggleVariant', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveClass(styles.modifiers.plain); }); test('Passes toggleWidth', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveAttribute('style', 'width: 500px;'); }); test('Passes additional toggleProps', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveAttribute('id', 'toggle'); }); test('Passes toggleAriaLabel', () => { render(); expect(screen.getByRole('button')).toHaveAccessibleName('Aria label content'); }); test('Calls onToggle with next isOpen state when dropdown toggle is clicked', async () => { const onToggle = jest.fn(); const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); expect(onToggle).toHaveBeenCalledWith(true); }); test('Does not call onToggle when dropdown toggle is not clicked', async () => { const onToggle = jest.fn(); const items = [{ content: 'Action', value: 1 }]; const user = userEvent.setup(); render(
); const btn = screen.getByRole('button', { name: 'Actual' }); await user.click(btn); expect(onToggle).not.toHaveBeenCalled(); }); test('Calls toggle onSelect when item is clicked', async () => { const onSelect = jest.fn(); const items = [{ content: 'Action', value: 1 }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); await user.click(actionItem); expect(onSelect).toHaveBeenCalledTimes(1); }); test('Does not call toggle onSelect when item is not clicked', async () => { const onSelect = jest.fn(); const items = [{ content: 'Action', value: 1 }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); await user.click(toggle); expect(onSelect).not.toHaveBeenCalled(); }); test('Does not pass isToggleFullWidth to menu toggle by default', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).not.toHaveClass(styles.modifiers.fullWidth); }); test('Passes isToggleFullWidth to menu toggle when passed in', () => { render(); expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveClass(styles.modifiers.fullWidth); }); test('Does not focus toggle on item select by default', async () => { const items = [{ content: 'Action', value: 1 }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); await user.click(actionItem); expect(toggle).not.toHaveFocus(); }); test('Focuses toggle on item select when shouldFocusToggleOnSelect is true', async () => { const items = [{ content: 'Action', value: 1 }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); await user.click(actionItem); expect(toggle).toHaveFocus(); }); test('Matches snapshot', () => { const { asFragment } = render(); expect(asFragment()).toMatchSnapshot(); }); }); describe('Dropdown items', () => { test('Renders with items', async () => { const items = [ { content: 'Action', value: 1 }, { value: 'separator', isDivider: true } ]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); const dividerItem = screen.getByRole('separator'); expect(actionItem).toBeInTheDocument(); expect(dividerItem).toBeInTheDocument(); }); test('Renders with a link item', async () => { const items = [{ content: 'Link', value: 1, to: '#' }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const linkItem = screen.getByRole('menuitem', { name: 'Link' }); expect(linkItem.getAttribute('href')).toBe('#'); }); test('Renders with items not disabled by default', async () => { const items = [{ content: 'Action', value: 1 }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); expect(actionItem).not.toBeDisabled(); }); test('Renders with a disabled item', async () => { const items = [{ content: 'Action', value: 1, isDisabled: true }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); expect(actionItem).toBeDisabled(); }); test('Spreads props on item', async () => { const items = [{ content: 'Action', value: 1, id: 'Test' }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); expect(actionItem.getAttribute('id')).toBe('Test'); }); test('Calls item onClick when clicked', async () => { const onClick = jest.fn(); const items = [{ content: 'Action', value: 1, onClick }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); await user.click(actionItem); expect(onClick).toHaveBeenCalledTimes(1); }); test('Does not call item onClick when not clicked', async () => { const onClick = jest.fn(); const items = [ { content: 'Action', value: 1, onClick }, { content: 'Action 2', value: 2 } ]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action 2' }); await user.click(actionItem); expect(onClick).not.toHaveBeenCalled(); }); test('Does not call item onClick when clicked and item is disabled', async () => { const onClick = jest.fn(); const items = [{ content: 'Action', value: 1, onClick, isDisabled: true }]; const user = userEvent.setup(); render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); const actionItem = screen.getByRole('menuitem', { name: 'Action' }); await user.click(actionItem); expect(onClick).not.toHaveBeenCalled(); }); test('Matches snapshot', async () => { const items = [ { content: 'Action', value: 1, ouiaId: '1' }, { value: 'separator', isDivider: true, ouiaId: '2' }, { content: 'Link', value: 'separator', to: '#', ouiaId: '3' } ]; const user = userEvent.setup(); const { asFragment } = render(); const toggle = screen.getByRole('button', { name: 'Dropdown' }); await user.click(toggle); expect(asFragment()).toMatchSnapshot(); }); });