@@ -55,6 +55,34 @@ describe('Trigger.Shadow', () => {
55
55
return shadowRoot ;
56
56
} ;
57
57
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
+
58
86
it ( 'popup not in the same shadow' , async ( ) => {
59
87
const errSpy = jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
60
88
const shadowRoot = renderShadow ( ) ;
@@ -103,4 +131,70 @@ describe('Trigger.Shadow', () => {
103
131
expect ( errSpy ) . not . toHaveBeenCalled ( ) ;
104
132
errSpy . mockRestore ( ) ;
105
133
} ) ;
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
+ } ) ;
106
200
} ) ;
0 commit comments