Search.spec.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import Search from 'components/common/Search/Search';
  2. import React from 'react';
  3. import { render } from 'lib/testHelpers';
  4. import userEvent from '@testing-library/user-event';
  5. import { screen } from '@testing-library/react';
  6. import { useSearchParams } from 'react-router-dom';
  7. jest.mock('use-debounce', () => ({
  8. useDebouncedCallback: (fn: (e: Event) => void) => fn,
  9. }));
  10. const setSearchParamsMock = jest.fn();
  11. jest.mock('react-router-dom', () => ({
  12. ...(jest.requireActual('react-router-dom') as object),
  13. useSearchParams: jest.fn(),
  14. }));
  15. const placeholder = 'I am a search placeholder';
  16. describe('Search', () => {
  17. beforeEach(() => {
  18. (useSearchParams as jest.Mock).mockImplementation(() => [
  19. new URLSearchParams(),
  20. setSearchParamsMock,
  21. ]);
  22. });
  23. it('calls handleSearch on input', async () => {
  24. render(<Search placeholder={placeholder} />);
  25. const input = screen.getByPlaceholderText(placeholder);
  26. await userEvent.click(input);
  27. await userEvent.keyboard('value');
  28. expect(setSearchParamsMock).toHaveBeenCalledTimes(5);
  29. });
  30. it('when placeholder is provided', () => {
  31. render(<Search placeholder={placeholder} />);
  32. expect(screen.getByPlaceholderText(placeholder)).toBeInTheDocument();
  33. });
  34. it('when placeholder is not provided', () => {
  35. render(<Search />);
  36. expect(screen.queryByPlaceholderText('Search')).toBeInTheDocument();
  37. });
  38. it('Clear button is visible', () => {
  39. render(<Search placeholder={placeholder} />);
  40. const clearButton = screen.getByRole('button');
  41. expect(clearButton).toBeInTheDocument();
  42. });
  43. it('Clear button should clear text from input', async () => {
  44. render(<Search placeholder={placeholder} />);
  45. const searchField = screen.getAllByRole('textbox')[0];
  46. await userEvent.type(searchField, 'some text');
  47. expect(searchField).toHaveValue('some text');
  48. const clearButton = screen.getByRole('button');
  49. await userEvent.click(clearButton);
  50. expect(searchField).toHaveValue('');
  51. });
  52. });