/** * External dependencies */ import { useState, useEffect, useCallback } from '@wordpress/element'; import { render, fireEvent } from '@testing-library/react'; /** * Internal dependencies */ import { useGetCountryStateAutofill } from '../store-address'; const AutofillWrapper = ( { options, value, onChange } ) => { const [ values, setValues ] = useState( { countryState: value || '' } ); const setCountryState = useCallback( ( key, newValue ) => { setValues( { ...values, [ key ]: newValue, } ); }, [] ); useEffect( () => { setValues( { countryState: value } ); }, [ value ] ); useEffect( () => { if ( onChange ) { onChange( values ); } }, [ values ] ); const countryStateAutofill = useGetCountryStateAutofill( options, values.countryState, setCountryState ); return countryStateAutofill; }; const DEFAULT_OPTIONS = [ { key: 'KH', label: 'Cambodia' }, { key: 'CM', label: 'Cameroon' }, { key: 'CA:AB', label: 'Canada — Alberta' }, { key: 'CA:BC', label: 'Canada — British Columbia' }, { key: 'CA:MB', label: 'Canada — Manitoba' }, { key: 'US:CA', label: 'United States - California' }, ]; describe( 'useGetCountryStateAutofill', () => { it( 'should render a country and state inputs with autoComplete', () => { const { queryAllByRole } = render( ); const inputs = queryAllByRole( 'textbox' ); expect( inputs.length ).toBe( 2 ); expect( inputs[ 0 ].autocomplete ).toEqual( 'country' ); expect( inputs[ 1 ].autocomplete ).toEqual( 'address-level1' ); } ); it( 'should set autocomplete fields if a value is selected', () => { const { queryAllByRole } = render( ); const inputs = queryAllByRole( 'textbox' ); expect( inputs.length ).toBe( 2 ); expect( inputs[ 0 ].value ).toEqual( 'Canada' ); expect( inputs[ 1 ].value ).toEqual( 'Manitoba' ); } ); it( 'should select region by key if abbreviation is used', () => { const onChange = jest.fn(); const { queryAllByRole } = render( ); const inputs = queryAllByRole( 'textbox' ); fireEvent.change( inputs[ 0 ], { target: { value: 'United States' } } ); fireEvent.change( inputs[ 1 ], { target: { value: 'CA' }, } ); expect( onChange ).toHaveBeenCalledWith( { countryState: 'US:CA' } ); } ); it( 'should update the value if the auto complete fields changed', () => { const onChange = jest.fn(); const { queryAllByRole } = render( ); const inputs = queryAllByRole( 'textbox' ); fireEvent.change( inputs[ 0 ], { target: { value: 'Canada' } } ); fireEvent.change( inputs[ 1 ], { target: { value: 'British Columbia' }, } ); expect( onChange ).toHaveBeenCalledWith( { countryState: 'CA:BC' } ); } ); it( 'should update the value if the auto complete fields changed and value was already set', () => { const onChange = jest.fn(); const { queryAllByRole } = render( ); const inputs = queryAllByRole( 'textbox' ); expect( inputs[ 0 ].value ).toEqual( 'Cameroon' ); onChange.mockClear(); fireEvent.change( inputs[ 0 ], { target: { value: 'Canada' } } ); fireEvent.change( inputs[ 1 ], { target: { value: 'British Columbia' }, } ); expect( onChange ).toHaveBeenCalledWith( { countryState: 'CA:BC' } ); } ); it( 'should update the auto complete inputs when value changed and inputs already set', () => { const onChange = jest.fn(); const options = [ ...DEFAULT_OPTIONS ]; const { rerender, queryAllByRole } = render( ); let inputs = queryAllByRole( 'textbox' ); fireEvent.change( inputs[ 0 ], { target: { value: 'Canada' } } ); fireEvent.change( inputs[ 1 ], { target: { value: 'British Columbia' }, } ); expect( onChange ).toHaveBeenCalledWith( { countryState: 'CA:BC' } ); rerender( ); inputs = queryAllByRole( 'textbox' ); expect( inputs[ 0 ].value ).toEqual( 'Cambodia' ); expect( inputs[ 1 ].value ).toEqual( '' ); } ); } );