@@ -91,6 +91,111 @@ describe('props', () => {
9191 } )
9292 } )
9393
94+ describe ( 'selectedItemChanged' , ( ) => {
95+ test ( 'props update of selectedItem will update inputValue state with default selectedItemChanged referential equality check' , ( ) => {
96+ const selectedItem = { id : 1 , value : 'wow' }
97+ const newSelectedItem = { id : 1 , value : 'not wow' }
98+ function itemToString ( item ) {
99+ return item . value
100+ }
101+ const stateReducer = jest
102+ . fn ( )
103+ . mockImplementation ( ( _state , { changes} ) => changes )
104+
105+ const { rerender} = renderCombobox ( {
106+ stateReducer,
107+ itemToString,
108+ selectedItem,
109+ } )
110+
111+ expect ( stateReducer ) . toHaveBeenCalledTimes ( 1 )
112+ expect ( stateReducer ) . toHaveBeenCalledWith (
113+ {
114+ inputValue : itemToString ( selectedItem ) ,
115+ selectedItem,
116+ highlightedIndex : - 1 ,
117+ isOpen : false ,
118+ } ,
119+ expect . objectContaining ( {
120+ type : useCombobox . stateChangeTypes . ControlledPropUpdatedSelectedItem ,
121+ changes : {
122+ inputValue : itemToString ( selectedItem ) ,
123+ selectedItem,
124+ highlightedIndex : - 1 ,
125+ isOpen : false ,
126+ } ,
127+ } ) ,
128+ )
129+
130+ stateReducer . mockClear ( )
131+ rerender ( {
132+ stateReducer,
133+ selectedItem : newSelectedItem ,
134+ itemToString
135+ } )
136+
137+ expect ( stateReducer ) . toHaveBeenCalledTimes ( 1 )
138+ expect ( stateReducer ) . toHaveBeenCalledWith (
139+ {
140+ inputValue : itemToString ( selectedItem ) ,
141+ selectedItem : newSelectedItem ,
142+ highlightedIndex : - 1 ,
143+ isOpen : false ,
144+ } ,
145+ expect . objectContaining ( {
146+ changes : {
147+ inputValue : itemToString ( newSelectedItem ) ,
148+ selectedItem : newSelectedItem ,
149+ highlightedIndex : - 1 ,
150+ isOpen : false ,
151+ } ,
152+ type : useCombobox . stateChangeTypes . ControlledPropUpdatedSelectedItem ,
153+ } ) ,
154+ )
155+ expect ( getInput ( ) ) . toHaveValue ( itemToString ( newSelectedItem ) )
156+ } )
157+
158+ test ( 'props update of selectedItem will not update inputValue state' , ( ) => {
159+ const selectedItem = { id : 1 , value : 'wow' }
160+ const newSelectedItem = { id : 1 , value : 'not wow' }
161+ function itemToString ( item ) {
162+ return item . value
163+ }
164+ const selectedItemChanged = jest . fn ( ) . mockReturnValue ( ( prev , next ) => prev . id !== next . id )
165+ const stateReducer = jest
166+ . fn ( )
167+ . mockImplementation ( ( _state , { changes} ) => changes )
168+
169+ const { rerender} = renderCombobox ( {
170+ selectedItemChanged,
171+ stateReducer,
172+ selectedItem,
173+ itemToString
174+ } )
175+
176+ expect ( getInput ( ) ) . toHaveValue ( itemToString ( selectedItem ) )
177+ expect ( selectedItemChanged ) . toHaveBeenCalledTimes ( 1 )
178+ expect ( selectedItemChanged ) . toHaveBeenCalledWith ( undefined , selectedItem )
179+
180+ stateReducer . mockReset ( )
181+ selectedItemChanged . mockReset ( )
182+ rerender ( {
183+ stateReducer,
184+ itemToString,
185+ selectedItem : newSelectedItem ,
186+ selectedItemChanged,
187+ } )
188+
189+ expect ( selectedItemChanged ) . toHaveBeenCalledTimes ( 1 )
190+ expect ( selectedItemChanged ) . toHaveBeenCalledWith (
191+ selectedItem ,
192+ newSelectedItem ,
193+ )
194+ expect ( stateReducer ) . not . toHaveBeenCalled ( )
195+ expect ( getInput ( ) ) . toHaveValue ( itemToString ( selectedItem ) )
196+ } )
197+ } )
198+
94199 describe ( 'getA11ySelectionMessage' , ( ) => {
95200 beforeEach ( jest . useFakeTimers )
96201 afterEach ( ( ) => {
0 commit comments