import React from 'react'
import renderer from 'react-test-renderer'
import { mount } from 'enzyme'
import { SelectField as StyledSelectField } from './index'
import { SelectField } from './SelectField'
const options = [
{ value: '1', label: 'val 1', 'aria-label': 'value 1' },
{ value: '2', label: 'value 2' },
]
const defaultProps = {
name: 'selectFieldName',
defaultValue: options[0].value,
options,
onChange() {},
onFocus() {},
onblur() {},
}
const customProps = {
...defaultProps,
id: 'selectFieldId',
className: 'customClass',
'aria-label': 'selectLabel',
focus: true,
autoFocus: true,
disabled: false,
required: true,
}
describe('SelectField', () => {
const handleOnChange = jest.fn()
const defaultWrapper = mount()
it('should have the expected markup in the DOM', () => {
const styledSelectField = renderer.create().toJSON()
expect(styledSelectField).toMatchSnapshot()
})
it('should have proper initial value and number of options', () => {
expect(defaultWrapper.find('select').props().defaultValue).toBe(options[0].value)
expect(defaultWrapper.find('option')).toHaveLength(2)
})
it('should have appropriate alternate label on options', () => {
expect(defaultWrapper.find('option').first().prop('aria-label')).toBe(options[0]['aria-label'])
expect(defaultWrapper.find('option').last().prop('aria-label')).toBeUndefined()
})
it('should receive selected value after change', () => {
const select = defaultWrapper.find('select')
const selectDOMNode = select.getDOMNode()
selectDOMNode.value = '2'
select.simulate('change', { target: selectDOMNode })
expect(handleOnChange).toHaveBeenCalledWith({ name: 'selectFieldName', value: '2' })
})
it('Should have custom props', () => {
const wrapper = mount()
const selectField = wrapper.find('select')
expect(wrapper.hasClass('customClass')).toBe(true)
expect(wrapper.props().focus).toBe(true)
expect(selectField.prop('id')).toEqual('selectFieldId')
expect(selectField.prop('aria-label')).toEqual('selectLabel')
expect(selectField.prop('autoFocus')).toBe(true)
expect(selectField.prop('disabled')).toBe(false)
expect(selectField.prop('required')).toBe(true)
})
describe('Focus event', () => {
it('Simulates a focus event.', () => {
expect(defaultWrapper.find('.kirk-selectField--hasFocus').exists()).toBe(false)
defaultWrapper.find('select').simulate('focus')
expect(defaultWrapper.find('.kirk-selectField--hasFocus').exists()).toBe(true)
})
it('Focus on mounting.', () => {
defaultWrapper.setProps({ focus: true })
expect(defaultWrapper.find('.kirk-selectField--hasFocus').exists()).toBe(true)
})
})
describe('A11y', () => {
it("Shouldn't be focused by default", () => {
const selectField = defaultWrapper.find('select')
expect(selectField.prop('autofocus')).toBe(undefined)
})
})
})