@@ -179,6 +179,38 @@ describe('SelectPanel', () => {
179
179
expect ( mockOnSubmit ) . toHaveBeenCalledTimes ( 0 )
180
180
} )
181
181
182
+ it ( 'should not call addEventListener on each render for Escape key handling when onCancel has not changed' , async ( ) => {
183
+ const onCancel = jest . fn ( )
184
+ const container = render (
185
+ < SelectPanel title = "title" onCancel = { onCancel } >
186
+ child
187
+ </ SelectPanel > ,
188
+ )
189
+ const addEventListenerSpy = jest . spyOn ( globalThis . EventTarget . prototype , 'addEventListener' )
190
+ const removeEventListenerSpy = jest . spyOn ( globalThis . EventTarget . prototype , 'removeEventListener' )
191
+
192
+ container . rerender (
193
+ < SelectPanel title = "title" onCancel = { onCancel } >
194
+ child
195
+ </ SelectPanel > ,
196
+ )
197
+ expect ( addEventListenerSpy ) . not . toHaveBeenCalled ( )
198
+ expect ( removeEventListenerSpy ) . not . toHaveBeenCalled ( )
199
+ } )
200
+
201
+ it ( 'Escape key closes the dialog and calls onCancel' , async ( ) => {
202
+ const mockOnSubmit = jest . fn ( )
203
+ const mockOnCancel = jest . fn ( )
204
+ const { container, user} = await getFixtureWithOpenContainer ( { mockOnSubmit, mockOnCancel} )
205
+ selectUnselectedOption ( container , user )
206
+
207
+ await user . keyboard ( '{Escape}' )
208
+
209
+ expect ( container . queryByRole ( 'dialog' ) ) . toBeNull ( )
210
+ expect ( mockOnCancel ) . toHaveBeenCalledTimes ( 1 )
211
+ expect ( mockOnSubmit ) . toHaveBeenCalledTimes ( 0 )
212
+ } )
213
+
182
214
it ( 'SelectPanel within FormControl should be labelled by FormControl.Label' , async ( ) => {
183
215
const component = render ( < SelectPanelWithinForm /> )
184
216
const buttonByRole = component . getByRole ( 'button' )
0 commit comments