import * as React from 'react';
import * as _ from 'lodash';
import { Dropdown, DropdownProps, dropdownSlotClassNames } from 'src/components/Dropdown/Dropdown';
import { dropdownSearchInputSlotClassNames } from 'src/components/Dropdown/DropdownSearchInput';
import { findIntrinsicElement, mountWithProvider } from 'test/utils';
const items = ['item0', 'item1', 'item2', 'item3', 'item4', 'item5'];
const renderDropdown = (props: DropdownProps = {}) => {
const wrapper = mountWithProvider();
const triggerButtonWrapper = findIntrinsicElement(wrapper, `.${dropdownSlotClassNames.triggerButton}`);
const toggleIndicatorWrapper = findIntrinsicElement(wrapper, `.${dropdownSlotClassNames.toggleIndicator}`);
const searchInputWrapper = findIntrinsicElement(wrapper, `.${dropdownSearchInputSlotClassNames.input}`);
const itemsListWrapper = findIntrinsicElement(wrapper, `.${dropdownSlotClassNames.itemsList}`);
const getItemsWrapper = () => findIntrinsicElement(wrapper, `.${dropdownSlotClassNames.item}`);
const getSelectedItemsWrapper = () => findIntrinsicElement(wrapper, `.${dropdownSlotClassNames.selectedItem}`);
const getSelectedItemWrapperAtIndex = index => getSelectedItemsWrapper().at(index);
const getItemWrapperAtIndex = index => getItemsWrapper().at(index);
const getClearIndicatorWrapper = () => findIntrinsicElement(wrapper, `.${dropdownSlotClassNames.clearIndicator}`);
return {
wrapper,
rerender: props => wrapper.setProps(props),
rootNode: wrapper.getDOMNode(),
triggerButtonNode: triggerButtonWrapper.length ? triggerButtonWrapper.getDOMNode() : null,
toggleIndicatorNode: toggleIndicatorWrapper.length ? toggleIndicatorWrapper.getDOMNode() : null,
itemsListNode: itemsListWrapper.getDOMNode(),
searchInputNode: searchInputWrapper.length ? searchInputWrapper.getDOMNode() : null,
getA11yMessageContainerNode: () => findIntrinsicElement(wrapper, '[role="status"]').getDOMNode(),
getItemNodes: () => getItemsWrapper().map(nodeWrapper => nodeWrapper.getDOMNode()),
getItemNodeAtIndex: index => getItemWrapperAtIndex(index).getDOMNode(),
getSelectedItemNodes: () => getSelectedItemsWrapper().map(nodeWrapper => nodeWrapper.getDOMNode()),
getSelectedItemNodeAtIndex: index => getSelectedItemWrapperAtIndex(index).getDOMNode(),
getClearIndicatorWrapper,
getClearIndicatorNode: () => getClearIndicatorWrapper().getDOMNode(),
mouseOverItemAtIndex: index => getItemWrapperAtIndex(index).simulate('mousemove'),
changeSearchInput: value => {
searchInputWrapper.simulate('change', { target: { value } });
},
clickOnTriggerButton: () => {
triggerButtonWrapper.simulate('click');
},
clickOnToggleIndicator: () => {
toggleIndicatorWrapper.simulate('click');
},
clickOnSearchInput: () => {
searchInputWrapper.simulate('click');
},
clickOnItemAtIndex: (index: number, optional = {}) => {
getItemWrapperAtIndex(index).simulate(
'click',
_.merge(
{
nativeEvent: { stopImmediatePropagation: jest.fn() },
},
optional,
),
);
},
clickOnClearIndicator: () => {
getClearIndicatorWrapper().simulate('click');
},
clickOnSelectedItemAtIndex: (index: number, optional = {}) => {
getSelectedItemWrapperAtIndex(index).simulate(
'click',
_.merge(
{
nativeEvent: { stopImmediatePropagation: jest.fn() },
},
optional,
),
);
},
keyDownOnSearchInput: (key: string, optional?: Object) =>
searchInputWrapper.simulate('keydown', { key, ...optional }),
keyDownOnItemsList: (key: string, optional?: Object) => itemsListWrapper.simulate('keydown', { key, ...optional }),
keyDownOnTriggerButton: (key: string, optional?: Object) =>
triggerButtonWrapper.simulate('keydown', { key, ...optional }),
keyDownOnSelectedItemAtIndex: (index: number, key: string, optional?: Object) => {
getSelectedItemWrapperAtIndex(index).simulate('keydown', { key, ...optional });
},
focusTriggerButton: () => {
triggerButtonWrapper.simulate('focus');
},
focusSearchInput: () => {
searchInputWrapper.simulate('focus');
},
focusItemsList: () => {
itemsListWrapper.simulate('focus');
},
};
};
const getItemIdRegexByIndex = index => new RegExp(`downshift-\\d+-item-${index}`);
export { getItemIdRegexByIndex, renderDropdown, items };