@@ -91,6 +91,111 @@ describe('props', () => {
91
91
} )
92
92
} )
93
93
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
+
94
199
describe ( 'getA11ySelectionMessage' , ( ) => {
95
200
beforeEach ( jest . useFakeTimers )
96
201
afterEach ( ( ) => {
0 commit comments