import { screen, render, fireEvent } from '@testing-library/react'; import Autocomplete, { shouldShowDropdown, filterOptions, } from '../autocomplete'; import { flattenedPaths } from '../../mock-data/tree-data'; import { type AutocompleteItemType } from '../autocomplete-item'; describe('Autocomplete component', () => { it('should render', () => { const { asFragment } = render( ); expect(asFragment()).toMatchSnapshot(); }); it('should render with props: onDropdownChange & clearOnSelect', () => { const { asFragment } = render( d} clearOnSelect /> ); expect(asFragment()).toMatchSnapshot(); }); it('should submit current input text value', () => { const onSelect = jest.fn(); render(); const searchInput = screen.getByTestId('search-input'); const value = 'foo'; fireEvent.change(searchInput, { target: { value } }); fireEvent.keyDown(searchInput, { key: 'Enter', code: 'Enter' }); expect(onSelect).toHaveBeenCalledWith(value); expect(searchInput).toHaveValue(value); }); it('should clear on Enter if clearOnSelect is passed', () => { const onSelect = jest.fn(); render( ); const searchInput = screen.getByTestId('search-input'); const value = 'foo'; fireEvent.change(searchInput, { target: { value } }); fireEvent.keyDown(searchInput, { key: 'Enter', code: 'Enter' }); expect(searchInput).toHaveValue(''); }); }); describe('filterOptions', () => { it('should filter options', () => { const options = [ { pathLabel: 'Find this', }, { pathLabel: 'Also find this', }, { pathLabel: 'You FIND this?!', }, { pathLabel: 'Found nothing', }, { pathLabel: '', }, ]; const filtered = filterOptions(options as AutocompleteItemType[], 'find'); const expected = [ { pathLabel: 'Find this', }, { pathLabel: 'Also find this', }, { pathLabel: 'You FIND this?!', }, ]; expect(filtered).toEqual(expected); }); it('should filter options when a tag is provided', () => { const options = [ { pathLabel: 'Do not find this', }, { pathLabel: 'Also do not find this', }, { pathLabel: 'Find this because it is marked in a hidden tag', tags: ['tagged'], }, ]; const filtered = filterOptions(options as AutocompleteItemType[], 'tagged'); const expected = [ { pathLabel: 'Find this because it is marked in a hidden tag', tags: ['tagged'], }, ]; expect(filtered).toEqual(expected); }); }); describe('shouldShowDropdown', () => { it('should return false if length of text input is less than minCharsToShowDropdown', () => { expect(shouldShowDropdown('fo', [], true, true, 3)).toBe(false); }); it('should return true if text input is in options', () => { expect(shouldShowDropdown('Item', flattenedPaths, false, true, 3)).toBe( true ); }); it('should return true if filtering is not applied', () => { expect(shouldShowDropdown('Zzz', flattenedPaths, false, false, 3)).toBe( true ); }); });