@@ -55,6 +55,34 @@ describe('Trigger.Shadow', () => {
5555 return shadowRoot ;
5656 } ;
5757
58+ const renderMultiLevelShadow = ( props ?: any ) => {
59+ const noRelatedSpan = document . createElement ( 'span' ) ;
60+ document . body . appendChild ( noRelatedSpan ) ;
61+
62+ const wrapperHost = document . createElement ( 'div' ) ;
63+ const wrapperShadowRoot = wrapperHost . attachShadow ( {
64+ mode : 'open' ,
65+ delegatesFocus : false ,
66+ } ) ;
67+ document . body . appendChild ( wrapperHost ) ;
68+
69+ const host = document . createElement ( 'div' ) ;
70+ wrapperShadowRoot . appendChild ( host ) ;
71+
72+ const shadowRoot = host . attachShadow ( {
73+ mode : 'open' ,
74+ delegatesFocus : false ,
75+ } ) ;
76+ const container = document . createElement ( 'div' ) ;
77+ shadowRoot . appendChild ( container ) ;
78+
79+ act ( ( ) => {
80+ createRoot ( container ) . render ( < Demo { ...props } /> ) ;
81+ } ) ;
82+
83+ return shadowRoot ;
84+ } ;
85+
5886 it ( 'popup not in the same shadow' , async ( ) => {
5987 const errSpy = jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
6088 const shadowRoot = renderShadow ( ) ;
@@ -103,4 +131,70 @@ describe('Trigger.Shadow', () => {
103131 expect ( errSpy ) . not . toHaveBeenCalled ( ) ;
104132 errSpy . mockRestore ( ) ;
105133 } ) ;
134+
135+ it ( 'click on target in shadow should not close popup' , async ( ) => {
136+ const errSpy = jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
137+ const shadowRoot = renderShadow ( {
138+ getPopupContainer : ( item : HTMLElement ) => item . parentElement ,
139+ autoDestroy : true ,
140+ } ) ;
141+
142+ await awaitFakeTimer ( ) ;
143+
144+ // Click to show
145+ fireEvent . click ( shadowRoot . querySelector ( '.target' ) ) ;
146+ await awaitFakeTimer ( ) ;
147+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeTruthy ( ) ;
148+
149+ // Click on target
150+ fireEvent . mouseDown ( shadowRoot . querySelector ( '.bamboo' ) ) ;
151+ await awaitFakeTimer ( ) ;
152+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeTruthy ( ) ;
153+
154+ expect ( errSpy ) . not . toHaveBeenCalled ( ) ;
155+ errSpy . mockRestore ( ) ;
156+ } ) ;
157+
158+ it ( 'click on target with multilevel shadows should not close popup' , async ( ) => {
159+ const errSpy = jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
160+ const shadowRoot = renderMultiLevelShadow ( {
161+ getPopupContainer : ( item : HTMLElement ) => item . parentElement ,
162+ autoDestroy : true ,
163+ } ) ;
164+
165+ await awaitFakeTimer ( ) ;
166+
167+ // Click to show
168+ fireEvent . click ( shadowRoot . querySelector ( '.target' ) ) ;
169+ await awaitFakeTimer ( ) ;
170+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeTruthy ( ) ;
171+
172+ // Click outside to hide
173+ fireEvent . mouseDown ( document . body . firstChild ) ;
174+ await awaitFakeTimer ( ) ;
175+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeFalsy ( ) ;
176+
177+ // Click to show again
178+ fireEvent . click ( shadowRoot . querySelector ( '.target' ) ) ;
179+ await awaitFakeTimer ( ) ;
180+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeTruthy ( ) ;
181+
182+ // Click in side shadow to hide
183+ fireEvent . mouseDown ( shadowRoot . querySelector ( '.little' ) ) ;
184+ await awaitFakeTimer ( ) ;
185+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeFalsy ( ) ;
186+
187+ // Click to show again
188+ fireEvent . click ( shadowRoot . querySelector ( '.target' ) ) ;
189+ await awaitFakeTimer ( ) ;
190+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeTruthy ( ) ;
191+
192+ // Click on target should not hide
193+ fireEvent . mouseDown ( shadowRoot . querySelector ( '.bamboo' ) ) ;
194+ await awaitFakeTimer ( ) ;
195+ expect ( shadowRoot . querySelector ( '.bamboo' ) ) . toBeTruthy ( ) ;
196+
197+ expect ( errSpy ) . not . toHaveBeenCalled ( ) ;
198+ errSpy . mockRestore ( ) ;
199+ } ) ;
106200} ) ;
0 commit comments