import React from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { DropdownToggle } from '../DropdownToggle'; import { DropdownContext } from '../dropdownConstants'; describe('DropdownToggle', () => { describe('API', () => { test('click on closed', async () => { const mockToggle = jest.fn(); const user = userEvent.setup(); render( Dropdown ); await user.click(screen.getByRole('button')); expect(mockToggle.mock.calls[0][1]).toBe(true); }); test('click on opened', async () => { const mockToggle = jest.fn(); const user = userEvent.setup(); render( Dropdown ); await user.click(screen.getByRole('button')); expect(mockToggle.mock.calls[0][1]).toBe(false); }); test('on click outside has been removed', () => { let mousedown: EventListenerOrEventListenerObject = () => {}; document.addEventListener = jest.fn((event, cb) => { mousedown = cb; }); document.removeEventListener = jest.fn((event, cb) => { if (mousedown === cb) { mousedown = () => {}; } }); const mockToggle = jest.fn(); const { unmount } = render( Dropdown ); unmount(); mousedown({ target: document } as any); expect(mockToggle.mock.calls).toHaveLength(0); expect(document.removeEventListener).toHaveBeenCalledWith('click', expect.any(Function)); }); test('on touch outside has been removed', () => { let touchstart: EventListenerOrEventListenerObject = () => {}; document.addEventListener = jest.fn((event, cb) => { touchstart = cb; }); document.removeEventListener = jest.fn((event, cb) => { if (touchstart === cb) { touchstart = () => {}; } }); const mockToggle = jest.fn(); const { unmount } = render( Dropdown ); unmount(); touchstart({ target: document } as any); expect(mockToggle.mock.calls).toHaveLength(0); expect(document.removeEventListener).toHaveBeenCalledWith('touchstart', expect.any(Function)); }); }); describe('state', () => { test('hover', () => { const { asFragment } = render( Dropdown ); expect(asFragment()).toMatchSnapshot(); }); test('active', () => { const { asFragment } = render( Dropdown ); expect(asFragment()).toMatchSnapshot(); }); test('focus', () => { const { asFragment } = render( Dropdown ); expect(asFragment()).toMatchSnapshot(); }); test('button variant - primary', () => { const { asFragment } = render( Dropdown ); const button = screen.getByRole('button'); expect(button).toHaveClass('pf-m-primary'); expect(asFragment()).toMatchSnapshot(); }); test('button variant - secondary', () => { const { asFragment } = render( Dropdown ); const button = screen.getByRole('button'); expect(button).toHaveClass('pf-m-secondary'); expect(asFragment()).toMatchSnapshot(); }); test('button variant - plain with text', () => { const { asFragment } = render( Dropdown ); const button = screen.getByRole('button'); expect(button).toHaveClass('pf-m-text'); expect(button).toHaveClass('pf-m-plain'); expect(asFragment()).toMatchSnapshot(); }); test('action split button - renders primary variant', () => { const { asFragment } = render( test]} splitButtonVariant="action" parentRef={document.createElement('div')} > Dropdown ); const dropdownToggle = screen.getByRole('button').parentElement; expect(dropdownToggle).toHaveClass('pf-m-primary'); expect(asFragment()).toMatchSnapshot(); }); test('split button - does not render primary variant', () => { const { asFragment } = render( test]} parentRef={document.createElement('div')} > Dropdown ); const dropdownToggle = screen.getByRole('button').parentElement; expect(dropdownToggle).not.toHaveClass('pf-m-primary'); expect(asFragment()).toMatchSnapshot(); }); test('action split button - renders secondary variant', () => { const { asFragment } = render( test]} splitButtonVariant="action" parentRef={document.createElement('div')} > Dropdown ); const dropdownToggle = screen.getByRole('button').parentElement; expect(dropdownToggle).toHaveClass('pf-m-secondary'); }); test('class changes', () => { const { asFragment } = render( Dropdown ); expect(asFragment()).toMatchSnapshot(); }); }); });