@@ -57,13 +57,13 @@ describe('detached', () => {
5757
5858 const searchButton = container . querySelector < HTMLButtonElement > (
5959 '.aa-DetachedSearchButton'
60- ) ;
60+ ) ! ;
6161
6262 // Open detached overlay
6363 searchButton . click ( ) ;
6464
6565 await waitFor ( ( ) => {
66- const input = document . querySelector < HTMLInputElement > ( '.aa-Input' ) ;
66+ const input = document . querySelector < HTMLInputElement > ( '.aa-Input' ) ! ;
6767
6868 expect ( document . querySelector ( '.aa-DetachedOverlay' ) ) . toBeInTheDocument ( ) ;
6969 expect ( document . body ) . toHaveClass ( 'aa-Detached' ) ;
@@ -81,7 +81,7 @@ describe('detached', () => {
8181
8282 const firstItem = document . querySelector < HTMLLIElement > (
8383 '#autocomplete-0-item-0'
84- ) ;
84+ ) ! ;
8585
8686 // Select the first item
8787 firstItem . click ( ) ;
@@ -106,7 +106,7 @@ describe('detached', () => {
106106
107107 const searchButton = container . querySelector < HTMLButtonElement > (
108108 '.aa-DetachedSearchButton'
109- ) ;
109+ ) ! ;
110110
111111 // Open detached overlay
112112 searchButton . click ( ) ;
@@ -118,7 +118,7 @@ describe('detached', () => {
118118
119119 const cancelButton = document . querySelector < HTMLButtonElement > (
120120 '.aa-DetachedCancelButton'
121- ) ;
121+ ) ! ;
122122
123123 // Prevent `onTouchStart` event from closing detached overlay
124124 const windowTouchStartListener = jest . fn ( ) ;
@@ -372,4 +372,98 @@ describe('detached', () => {
372372 ) ;
373373 } ) ;
374374 } ) ;
375+
376+ test ( 'preserves `query` in the detached search `button` after closing' , async ( ) => {
377+ const container = document . createElement ( 'div' ) ;
378+ document . body . appendChild ( container ) ;
379+ const onStateChange = jest . fn ( ) ;
380+ autocomplete ( {
381+ id : 'autocomplete' ,
382+ detachedMediaQuery : '' ,
383+ container,
384+ onStateChange,
385+ } ) ;
386+
387+ const searchButton = container . querySelector < HTMLButtonElement > (
388+ '.aa-DetachedSearchButton'
389+ ) ! ;
390+
391+ // Open detached overlay
392+ searchButton . click ( ) ;
393+
394+ // Type a query in the focused input
395+ await waitFor ( ( ) => {
396+ const input = document . querySelector < HTMLInputElement > ( '.aa-Input' ) ! ;
397+
398+ expect ( document . querySelector ( '.aa-DetachedOverlay' ) ) . toBeInTheDocument ( ) ;
399+ expect ( document . body ) . toHaveClass ( 'aa-Detached' ) ;
400+ expect ( input ) . toHaveFocus ( ) ;
401+
402+ fireEvent . input ( input , { target : { value : 'a' } } ) ;
403+ } ) ;
404+
405+ // Wait for the panel to open
406+ await waitFor ( ( ) => {
407+ expect (
408+ document . querySelector < HTMLElement > ( '.aa-Panel' )
409+ ) . toBeInTheDocument ( ) ;
410+ } ) ;
411+
412+ const cancelButton = document . querySelector < HTMLButtonElement > (
413+ '.aa-DetachedCancelButton'
414+ ) ! ;
415+
416+ // Close detached overlay
417+ cancelButton . click ( ) ;
418+
419+ // The detached overlay should close
420+ await waitFor ( ( ) => {
421+ expect (
422+ document . querySelector ( '.aa-DetachedOverlay' )
423+ ) . not . toBeInTheDocument ( ) ;
424+ expect ( document . body ) . not . toHaveClass ( 'aa-Detached' ) ;
425+ } ) ;
426+
427+ // The `query` should still be present
428+ expect ( onStateChange ) . toHaveBeenLastCalledWith (
429+ expect . objectContaining ( {
430+ state : expect . objectContaining ( { query : 'a' } ) ,
431+ } )
432+ ) ;
433+
434+ // The detached search `button` should contain the `query`
435+ expect (
436+ container . querySelector ( '.aa-DetachedSearchButtonQuery' )
437+ ) . toHaveTextContent ( 'a' ) ;
438+
439+ // The detached search `button` placeholder should be hidden when `query` exists
440+ expect (
441+ container . querySelector ( '.aa-DetachedSearchButtonPlaceholder' )
442+ ) . toHaveAttribute ( 'hidden' ) ;
443+ } ) ;
444+
445+ test ( 'reflects the initial `query` in the detached search `button`' , async ( ) => {
446+ const container = document . createElement ( 'div' ) ;
447+ document . body . appendChild ( container ) ;
448+ autocomplete ( {
449+ id : 'autocomplete' ,
450+ detachedMediaQuery : '' ,
451+ container,
452+ initialState : {
453+ query : 'a' ,
454+ } ,
455+ } ) ;
456+
457+ await waitFor ( ( ) => {
458+ // The detached search `button` should have the initial `query`
459+ expect (
460+ container . querySelector ( '.aa-DetachedSearchButtonQuery' )
461+ ) . toHaveTextContent ( 'a' ) ;
462+
463+ // The detached search `button` placeholder should be hidden when `query` exists
464+ expect (
465+ container . querySelector ( '.aa-DetachedSearchButtonPlaceholder' )
466+ ) . toHaveAttribute ( 'hidden' ) ;
467+ } ) ;
468+ } ) ;
375469} ) ;
0 commit comments