import React from 'react' import renderer from 'react-test-renderer' import { mount, shallow } from 'enzyme' import { PhoneField as StyledPhoneField } from './index' import { PhoneField } from './PhoneField' const countryWhitelist = ['FR', 'ES'] const countryWhitelistUpdated = ['DE'] const customCountryNames = { FR: 'Custom fr label', ES: 'Custom es label', } const whitelistMapped = [ { label: 'France +33', value: 'FR' }, { label: 'Spain (EspaƱa) +34', value: 'ES' }, ] const whitelistMappedChange = [{ label: 'Germany (Deutschland) +49', value: 'DE' }] const defaultProps = { name: 'phoneField', onChange() {}, countryWhitelist, } const customProps = { ...defaultProps, id: 'selectFieldName', className: 'customClass', 'aria-labelledby': 'labelId', selectFieldLabel: 'Phone Country code', textFieldTitle: 'Phone Number', textFieldPlaceholder: 'Phone number', defaultRegionValue: 'ES', defaultPhoneValue: '0765455667', customCountryNames, isInline: false, selectAutoFocus: true, } describe('PhoneField', () => { const defaultWrapper = shallow() it('should have the expected markup in the DOM with default settings', () => { const phoneField = renderer.create().toJSON() expect(phoneField).toMatchSnapshot() }) it('should have the expected markup in the DOM with custom settings', () => { const phoneField = renderer.create().toJSON() expect(phoneField).toMatchSnapshot() }) it('Should have proper default state value', () => { expect(defaultWrapper.state()).toEqual({ countryData: whitelistMapped, countryWhitelist, phoneNumber: '', phonePrefix: '', phoneRegion: '', completePhoneNumber: '', hasFocus: false, }) }) it('Should update data when countryWhitelist changed', () => { defaultWrapper.setProps({ countryWhitelist: countryWhitelistUpdated }) expect(defaultWrapper.state('countryWhitelist')).toEqual(countryWhitelistUpdated) expect(defaultWrapper.state('countryData')).toEqual(whitelistMappedChange) }) it('should receive updated value on phone number and country code change', () => { const handleOnChange = jest.fn() const wrapper = mount() const select = wrapper.find('select') const selectDOMNode = select.getDOMNode() as HTMLSelectElement selectDOMNode.value = 'ES' select.simulate('change', { target: selectDOMNode }) expect(handleOnChange).toHaveBeenCalledWith({ name: 'phoneField', value: { completePhoneNumber: '+34', phonePrefix: '+34', phoneRegion: 'ES', phoneNumber: '', }, }) const input = wrapper.find('input') input.simulate('change', { target: { value: '0765455667' } }) expect(handleOnChange).toHaveBeenCalledWith({ name: 'phoneField', value: { completePhoneNumber: '+340765455667', phonePrefix: '+34', phoneRegion: 'ES', phoneNumber: '0765455667', }, }) expect(handleOnChange).toHaveBeenCalledTimes(2) }) describe('Focus event', () => { it('Should have the appropriate display a focus event.', () => { const wrapper = mount() expect(wrapper.find('.kirk-phoneField-wrapper--hasFocus').exists()).toBe(false) wrapper.find('select').simulate('focus') expect(wrapper.find('.kirk-phoneField-wrapper--hasFocus').exists()).toBe(true) expect(wrapper.state('hasFocus')).toBe(true) }) /* TODO: Test focus on mounting by using focus prop * Enzyme doesn't support React 16 createRef * https://github.com/airbnb/enzyme/issues/1704 */ }) describe('#error', () => { it('Should have an error state when passing an error string', () => { const errorText = 'this is an error' const wrapper = shallow() expect(wrapper.hasClass('kirk-error')).toBe(true) expect(wrapper.find('.kirk-error-message')).toHaveLength(1) expect(wrapper.find('span').text()).toBe(errorText) }) it('Should have an error state when passing a JSX element', () => { const errorText = 'this is an error' const error = {errorText} const wrapper = shallow() expect(wrapper.hasClass('kirk-error')).toBe(true) expect(wrapper.find('.kirk-error-message')).toHaveLength(1) expect(wrapper.find('span').text()).toBe(errorText) }) it('Should not have an error state when passing a `null` value', () => { const wrapper = shallow() expect(wrapper.hasClass('kirk-error')).toBe(false) expect(wrapper.find('.kirk-error-message')).toHaveLength(0) }) }) })