UNPKG

@gechiui/components

Version:
102 lines (80 loc) 3.06 kB
/** * External dependencies */ import { fireEvent, render, screen } from '@testing-library/react'; /** * Internal dependencies */ import { useControlledValue } from '../use-controlled-value'; function Input( props ) { const [ value, setValue ] = useControlledValue( props ); return ( <input value={ value } onChange={ ( event ) => setValue( event.target.value ) } /> ); } function getInput() { return screen.getByRole( 'textbox' ); } describe( 'useControlledValue', () => { it( 'should use the default value', () => { render( <Input defaultValue="www.GeChiUI.com" /> ); expect( getInput() ).toHaveValue( 'www.GeChiUI.com' ); } ); it( 'should use the default value then switch to the controlled value', () => { const { rerender } = render( <Input defaultValue="www.GeChiUI.com" /> ); expect( getInput() ).toHaveValue( 'www.GeChiUI.com' ); rerender( <Input defaultValue="www.GeChiUI.com" value="Code is Poetry" /> ); expect( getInput() ).toHaveValue( 'Code is Poetry' ); } ); it( 'should call onChange only when there is no value being passed in', () => { const onChange = jest.fn(); render( <Input defaultValue="www.GeChiUI.com" onChange={ onChange } /> ); expect( getInput() ).toHaveValue( 'www.GeChiUI.com' ); fireEvent.change( getInput(), { target: { value: 'Code is Poetry' } } ); expect( getInput() ).toHaveValue( 'Code is Poetry' ); expect( onChange ).toHaveBeenCalledWith( 'Code is Poetry' ); } ); it( 'should call onChange when there is a value passed in', () => { const onChange = jest.fn(); const { rerender } = render( <Input defaultValue="www.GeChiUI.com" value="Code is Poetry" onChange={ onChange } /> ); expect( getInput() ).toHaveValue( 'Code is Poetry' ); fireEvent.change( getInput(), { target: { value: 'GeChiUI rocks!' }, } ); rerender( <Input defaultValue="www.GeChiUI.com" value="GeChiUI rocks!" onChange={ onChange } /> ); expect( getInput() ).toHaveValue( 'GeChiUI rocks!' ); expect( onChange ).toHaveBeenCalledWith( 'GeChiUI rocks!' ); } ); it( 'should not maintain internal state if no onChange is passed but a value is passed', () => { const { rerender } = render( <Input value="Code is Poetry" /> ); expect( getInput() ).toHaveValue( 'Code is Poetry' ); // primarily this proves that the hook doesn't break if no onChange is passed but // value turns into a controlled state, for example if the value needs to be set // to a constant in certain conditions but no change listening needs to happen fireEvent.change( getInput(), { target: { value: 'www.GeChiUI.com' } } ); // If `value` is passed then we expect the value to be fully controlled // meaning that the value passed in will always be used even though // we're managing internal state. expect( getInput() ).toHaveValue( 'Code is Poetry' ); // Next we un-set the value to uncover the internal state which was still maintained rerender( <Input /> ); expect( getInput() ).toHaveValue( 'www.GeChiUI.com' ); } ); } );