import React from 'react' import { mount, shallow } from 'enzyme' import { ItemChoice, ItemChoiceStatus } from '../itemChoice' import { AutoCompleteList } from './AutoCompleteList' const fakeItems = [ { label: 'title1', labelInfo: 'description1' }, { label: 'title2', labelInfo: 'description2' }, ] const defaultProps = { name: 'cities', items: fakeItems, visible: true, } const fakeKeyboardEvent = (key, keyCode) => ({ key, keyCode, preventDefault: () => {} }) const fakeKeyboardEventArrowDown = () => fakeKeyboardEvent('ArrowDown', 40) const fakeKeyboardEventArrowUp = () => fakeKeyboardEvent('ArrowUp', 38) const fakeKeyboardEventArrowEnter = () => fakeKeyboardEvent('Enter', 13) jest.useFakeTimers() describe('AutoCompleteList', () => { it('Renders `null` if not visible', () => { const wrapper = shallow() expect(wrapper.html()).toBeNull() }) it('Renders `null` if no items', () => { const wrapper = shallow() expect(wrapper.html()).toBeNull() }) it('Renders all list items', () => { const wrapper = mount() expect(wrapper.find('li')).toHaveLength(2) }) it('Renders `maxItems` list items', () => { const wrapper = mount() expect(wrapper.find('li')).toHaveLength(1) }) it('Renders items with a custom className', () => { const customClassName = 'custom-class' const wrapper = mount() expect(wrapper.find(ItemChoice).every(`.${customClassName}`)).toBe(true) }) describe('Keyboard navigation', () => { it('Can navigate with `down` arrow key', () => { const wrapper = shallow() wrapper.instance().handleKeydown(fakeKeyboardEventArrowDown()) expect(wrapper.state('highlightedIndex')).toBe(0) wrapper.instance().handleKeydown(fakeKeyboardEventArrowDown()) expect(wrapper.state('highlightedIndex')).toBe(1) wrapper.instance().handleKeydown(fakeKeyboardEventArrowDown()) expect(wrapper.state('highlightedIndex')).toBe(0) }) it('Can navigate with `up` arrow key', () => { const wrapper = shallow() wrapper.instance().handleKeydown(fakeKeyboardEventArrowUp()) expect(wrapper.state('highlightedIndex')).toBe(1) wrapper.instance().handleKeydown(fakeKeyboardEventArrowUp()) expect(wrapper.state('highlightedIndex')).toBe(0) wrapper.instance().handleKeydown(fakeKeyboardEventArrowUp()) expect(wrapper.state('highlightedIndex')).toBe(1) }) it('Can select an item with `enter` key', () => { const onSelectSpy = jest.fn() const wrapper = shallow() wrapper.instance().handleKeydown(fakeKeyboardEventArrowEnter()) expect(onSelectSpy).not.toHaveBeenCalled() wrapper.instance().handleKeydown(fakeKeyboardEventArrowDown()) wrapper.instance().handleKeydown(fakeKeyboardEventArrowEnter()) expect(onSelectSpy).toHaveBeenCalledWith(fakeItems[0]) }) }) describe('#selectedItemStatus', () => { it('displays an ItemChoice in loading state', () => { const onSelectSpy = jest.fn() const wrapper = shallow( , ) wrapper.instance().handleKeydown(fakeKeyboardEventArrowDown()) wrapper.instance().handleKeydown(fakeKeyboardEventArrowEnter()) expect(wrapper.state().selectedIndex).toBe(0) }) }) })