import * as _ from 'lodash'; import React from 'react'; import { shallow } from 'enzyme'; import { common } from '../../util/generic-tests'; import { SearchableSingleSelectDumb as SearchableSingleSelect } from './SearchableSingleSelect'; import { DropMenuDumb as DropMenu } from '../DropMenu/DropMenu'; const { Option } = SearchableSingleSelect; describe('SearchableSingleSelect', () => { common(SearchableSingleSelect, { exemptFunctionProps: ['optionFilter'] as any, }); describe('render', () => { it('should render selections', () => { const wrapper = shallow( ); expect(wrapper.find(DropMenu).length).toBe(1); }); it('should pass `isDisabled` to `Options`', () => { const wrapper = shallow( ); const [first, second, third] = wrapper .find(DropMenu.Option) .map((option) => option.prop('isDisabled')); expect(first).toBe(true); expect(second).toBe(false); expect(third).toBe(false); }); }); describe('props', () => { describe('onSearch', () => { it('should work', () => { const onSearch = jest.fn(); const wrapper: any = shallow( ); const expected = { event: 'fake', props: { callbackId: 'zero', children: 'Zero', isDisabled: false, isHidden: false, isWrapped: true, }, }; wrapper.find('SearchField').prop('onChange')('ero', { event: 'fake' }); expect(onSearch).toHaveBeenCalledWith('ero', 0, expected); }); }); describe('onSelect', () => { it('should work when fired from the DropMenu', () => { const onSelect = jest.fn(); const mockSelectionCallback = { event: { preventDefault: _.noop, }, props: {}, }; const wrapper: any = shallow( ); wrapper.find('DropMenu').first().prop('onSelect')( 10, mockSelectionCallback ); expect(onSelect).toHaveBeenCalledWith(10, mockSelectionCallback); }); it('should work when selecting filtered options', () => { const onSelect = jest.fn(); const mockSelectionCallback = { event: { stopPropagation: _.noop, preventDefault: _.noop }, props: {}, }; const wrapper: any = shallow( ); wrapper.find('DropMenu').first().prop('onSelect')( 0, mockSelectionCallback ); expect(onSelect).toHaveBeenCalledWith(0, mockSelectionCallback); }); it('should work when fired from the selection removal ', () => { const onSelect = jest.fn(); const mockSelectionCallback = { event: { preventDefault: _.noop, }, props: {}, }; const wrapper: any = shallow( ); wrapper.find('Selection').first().prop('onRemove')( mockSelectionCallback ); expect(onSelect).toHaveBeenCalledWith(null, mockSelectionCallback); }); }); describe('Error', () => { it('should apply the appropriate classNames to the saerch', () => { const wrapper = shallow( ); const searchWrapper = wrapper.find( '.lucid-SearchableSingleSelect-search-is-error' ); expect(searchWrapper.exists()).toBeTruthy(); }); it('should render out the error div', () => { const wrapper = shallow( ); const searchWrapper = wrapper.find( '.lucid-SearchableSingleSelect-error-content' ); expect(searchWrapper.text()).toEqual('Erroring out'); }); it('should not render the error div', () => { const wrapper = shallow( ); const searchWrapper = wrapper.find( '.lucid-SearchableSingleSelect-search-is-error' ); const errorWrapper = wrapper.find( '.lucid-SearchableSingleSelect-error-content' ); expect(errorWrapper.exists()).toBeFalsy(); expect(searchWrapper).toBeTruthy(); }); }); }); describe('custom formatting', () => { it('should render Option child function by passing in {searchText}, setting filterText on each option and using a custom optionFilter', () => { const optionFilter = (searchText: any, { filterText }: any) => { if (filterText) { return new RegExp(_.escapeRegExp(searchText), 'i').test(filterText); } return true; }; expect( shallow( ) ).toMatchSnapshot(); }); }); });