@@ -223,4 +223,51 @@ describe('LiveController data-loading Tests', () => {
223
223
await ( new Promise ( resolve => setTimeout ( resolve , 30 ) ) ) ;
224
224
expect ( getByTestId ( test . element , 'loading-element' ) ) . not . toBeVisible ( ) ;
225
225
} ) ;
226
+
227
+ it ( 'does not trigger loading inside component children' , async ( ) => {
228
+ const childTemplate = ( data : any ) => `
229
+ <div ${ initComponent ( data , { id : 'child-id' } ) } data-testid="child">
230
+ <span data-loading="show" data-testid="child-loading-element-showing">Loading...</span>
231
+ <span data-loading="hide" data-testid="child-loading-element-hiding">Loading...</span>
232
+ </div>
233
+ ` ;
234
+
235
+ const test = await createTest ( { } , ( data : any ) => `
236
+ <div ${ initComponent ( data , { id : 'parent-id' } ) } data-testid="parent">
237
+ <span data-loading="show" data-testid="parent-loading-element-showing">Loading...</span>
238
+ <span data-loading="hide" data-testid="parent-loading-element-hiding">Loading...</span>
239
+ ${ childTemplate ( { } ) }
240
+ <button data-action="live#$render">Render</button>
241
+ </div>
242
+ ` ) ;
243
+
244
+ test . expectsAjaxCall ( )
245
+ // delay so we can check loading
246
+ . delayResponse ( 20 ) ;
247
+
248
+ // All showing elements should be hidden / hiding elements should be visible
249
+ await waitFor ( ( ) => expect ( getByTestId ( test . element , 'parent-loading-element-showing' ) ) . not . toBeVisible ( ) ) ;
250
+ await waitFor ( ( ) => expect ( getByTestId ( test . element , 'parent-loading-element-hiding' ) ) . toBeVisible ( ) ) ;
251
+ await waitFor ( ( ) => expect ( getByTestId ( test . element , 'child-loading-element-showing' ) ) . not . toBeVisible ( ) ) ;
252
+ await waitFor ( ( ) => expect ( getByTestId ( test . element , 'child-loading-element-hiding' ) ) . toBeVisible ( ) ) ;
253
+
254
+ getByText ( test . element , 'Render' ) . click ( ) ;
255
+
256
+ // Parent: showing elements should be visible / hiding elements should be hidden
257
+ expect ( getByTestId ( test . element , 'parent-loading-element-showing' ) ) . toBeVisible ( ) ;
258
+ expect ( getByTestId ( test . element , 'parent-loading-element-hiding' ) ) . not . toBeVisible ( ) ;
259
+ // Child: no change
260
+ expect ( getByTestId ( test . element , 'child-loading-element-showing' ) ) . not . toBeVisible ( ) ;
261
+ expect ( getByTestId ( test . element , 'child-loading-element-hiding' ) ) . toBeVisible ( ) ;
262
+
263
+ // wait for loading to finish
264
+ await ( new Promise ( resolve => setTimeout ( resolve , 30 ) ) ) ;
265
+
266
+ // Parent: back to original state
267
+ expect ( getByTestId ( test . element , 'parent-loading-element-showing' ) ) . not . toBeVisible ( ) ;
268
+ expect ( getByTestId ( test . element , 'parent-loading-element-hiding' ) ) . toBeVisible ( ) ;
269
+ // Child: no change
270
+ expect ( getByTestId ( test . element , 'child-loading-element-showing' ) ) . not . toBeVisible ( ) ;
271
+ expect ( getByTestId ( test . element , 'child-loading-element-hiding' ) ) . toBeVisible ( ) ;
272
+ } ) ;
226
273
} ) ;
0 commit comments