Dropdown.spec.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React from 'react';
  2. import Dropdown, { DropdownProps } from 'components/common/Dropdown/Dropdown';
  3. import DropdownItem from 'components/common/Dropdown/DropdownItem';
  4. import DropdownDivider from 'components/common/Dropdown/DropdownDivider';
  5. import userEvent from '@testing-library/user-event';
  6. import { render } from 'lib/testHelpers';
  7. import { screen } from '@testing-library/react';
  8. const dummyLable = 'My Test Label';
  9. const dummyChildren = (
  10. <>
  11. <DropdownItem onClick={jest.fn()}>Child 1</DropdownItem>
  12. <DropdownItem onClick={jest.fn()}>Child 2</DropdownItem>
  13. <DropdownDivider />
  14. <DropdownItem onClick={jest.fn()}>Child 3</DropdownItem>
  15. </>
  16. );
  17. describe('Dropdown', () => {
  18. const setupWrapper = (
  19. props: Partial<DropdownProps> = {},
  20. children: React.ReactNode = undefined
  21. ) => (
  22. <Dropdown label={dummyLable} {...props}>
  23. {children}
  24. </Dropdown>
  25. );
  26. it('renders Dropdown with initial props', () => {
  27. const wrapper = render(setupWrapper()).baseElement;
  28. expect(wrapper.querySelector('.dropdown')).toBeTruthy();
  29. expect(wrapper.querySelector('.dropdown.is-active')).toBeFalsy();
  30. expect(wrapper.querySelector('.dropdown.is-right')).toBeFalsy();
  31. expect(wrapper.querySelector('.dropdown.is-up')).toBeFalsy();
  32. expect(wrapper.querySelector('.dropdown-content')).toBeTruthy();
  33. expect(wrapper.querySelector('.dropdown-content')).toHaveTextContent('');
  34. });
  35. it('renders custom children', () => {
  36. const wrapper = render(setupWrapper({}, dummyChildren)).baseElement;
  37. expect(wrapper.querySelector('.dropdown-content')).toBeTruthy();
  38. expect(wrapper.querySelectorAll('.dropdown-item').length).toEqual(3);
  39. expect(wrapper.querySelectorAll('.dropdown-divider').length).toEqual(1);
  40. });
  41. it('renders dropdown with a right-aligned menu', () => {
  42. const wrapper = render(setupWrapper({ right: true })).baseElement;
  43. expect(wrapper.querySelector('.dropdown.is-right')).toBeTruthy();
  44. });
  45. it('renders dropdown with a popup menu', () => {
  46. const wrapper = render(setupWrapper({ up: true })).baseElement;
  47. expect(wrapper.querySelector('.dropdown.is-up')).toBeTruthy();
  48. });
  49. it('handles click', () => {
  50. const wrapper = render(setupWrapper()).baseElement;
  51. const button = screen.getByText('My Test Label');
  52. expect(button).toBeInTheDocument();
  53. expect(wrapper.querySelector('.dropdown.is-active')).toBeFalsy();
  54. userEvent.click(button);
  55. expect(wrapper.querySelector('.dropdown.is-active')).toBeTruthy();
  56. });
  57. it('matches snapshot', () => {
  58. const { baseElement } = render(
  59. setupWrapper(
  60. {
  61. right: true,
  62. up: true,
  63. },
  64. dummyChildren
  65. )
  66. );
  67. expect(baseElement).toMatchSnapshot();
  68. });
  69. });