@@ -179,6 +179,38 @@ describe('SelectPanel', () => {
179179 expect ( mockOnSubmit ) . toHaveBeenCalledTimes ( 0 )
180180 } )
181181
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+
182214 it ( 'SelectPanel within FormControl should be labelled by FormControl.Label' , async ( ) => {
183215 const component = render ( < SelectPanelWithinForm /> )
184216 const buttonByRole = component . getByRole ( 'button' )
0 commit comments