@@ -23,7 +23,6 @@ describe('api: defineAsyncComponent', () => {
23
23
const toggle = ref ( true )
24
24
const root = nodeOps . createElement ( 'div' )
25
25
createApp ( {
26
- components : { Foo } ,
27
26
render : ( ) => ( toggle . value ? h ( Foo ) : null )
28
27
} ) . mount ( root )
29
28
@@ -52,14 +51,13 @@ describe('api: defineAsyncComponent', () => {
52
51
new Promise ( r => {
53
52
resolve = r as any
54
53
} ) ,
55
- loading : ( ) => 'loading' ,
54
+ loadingComponent : ( ) => 'loading' ,
56
55
delay : 1 // defaults to 200
57
56
} )
58
57
59
58
const toggle = ref ( true )
60
59
const root = nodeOps . createElement ( 'div' )
61
60
createApp ( {
62
- components : { Foo } ,
63
61
render : ( ) => ( toggle . value ? h ( Foo ) : null )
64
62
} ) . mount ( root )
65
63
@@ -92,14 +90,13 @@ describe('api: defineAsyncComponent', () => {
92
90
new Promise ( r => {
93
91
resolve = r as any
94
92
} ) ,
95
- loading : ( ) => 'loading' ,
93
+ loadingComponent : ( ) => 'loading' ,
96
94
delay : 0
97
95
} )
98
96
99
97
const toggle = ref ( true )
100
98
const root = nodeOps . createElement ( 'div' )
101
99
createApp ( {
102
- components : { Foo } ,
103
100
render : ( ) => ( toggle . value ? h ( Foo ) : null )
104
101
} ) . mount ( root )
105
102
@@ -135,7 +132,6 @@ describe('api: defineAsyncComponent', () => {
135
132
const toggle = ref ( true )
136
133
const root = nodeOps . createElement ( 'div' )
137
134
const app = createApp ( {
138
- components : { Foo } ,
139
135
render : ( ) => ( toggle . value ? h ( Foo ) : null )
140
136
} )
141
137
@@ -175,13 +171,12 @@ describe('api: defineAsyncComponent', () => {
175
171
resolve = _resolve as any
176
172
reject = _reject
177
173
} ) ,
178
- error : ( props : { error : Error } ) => props . error . message
174
+ errorComponent : ( props : { error : Error } ) => props . error . message
179
175
} )
180
176
181
177
const toggle = ref ( true )
182
178
const root = nodeOps . createElement ( 'div' )
183
179
const app = createApp ( {
184
- components : { Foo } ,
185
180
render : ( ) => ( toggle . value ? h ( Foo ) : null )
186
181
} )
187
182
@@ -220,15 +215,14 @@ describe('api: defineAsyncComponent', () => {
220
215
resolve = _resolve as any
221
216
reject = _reject
222
217
} ) ,
223
- error : ( props : { error : Error } ) => props . error . message ,
224
- loading : ( ) => 'loading' ,
218
+ errorComponent : ( props : { error : Error } ) => props . error . message ,
219
+ loadingComponent : ( ) => 'loading' ,
225
220
delay : 1
226
221
} )
227
222
228
223
const toggle = ref ( true )
229
224
const root = nodeOps . createElement ( 'div' )
230
225
const app = createApp ( {
231
- components : { Foo } ,
232
226
render : ( ) => ( toggle . value ? h ( Foo ) : null )
233
227
} )
234
228
@@ -280,7 +274,6 @@ describe('api: defineAsyncComponent', () => {
280
274
281
275
const root = nodeOps . createElement ( 'div' )
282
276
const app = createApp ( {
283
- components : { Foo } ,
284
277
render : ( ) => h ( Foo )
285
278
} )
286
279
@@ -310,12 +303,11 @@ describe('api: defineAsyncComponent', () => {
310
303
resolve = _resolve as any
311
304
} ) ,
312
305
timeout : 1 ,
313
- error : ( ) => 'timed out'
306
+ errorComponent : ( ) => 'timed out'
314
307
} )
315
308
316
309
const root = nodeOps . createElement ( 'div' )
317
310
const app = createApp ( {
318
- components : { Foo } ,
319
311
render : ( ) => h ( Foo )
320
312
} )
321
313
@@ -343,13 +335,12 @@ describe('api: defineAsyncComponent', () => {
343
335
} ) ,
344
336
delay : 1 ,
345
337
timeout : 16 ,
346
- error : ( ) => 'timed out' ,
347
- loading : ( ) => 'loading'
338
+ errorComponent : ( ) => 'timed out' ,
339
+ loadingComponent : ( ) => 'loading'
348
340
} )
349
341
350
342
const root = nodeOps . createElement ( 'div' )
351
343
const app = createApp ( {
352
- components : { Foo } ,
353
344
render : ( ) => h ( Foo )
354
345
} )
355
346
const handler = ( app . config . errorHandler = jest . fn ( ) )
@@ -376,12 +367,11 @@ describe('api: defineAsyncComponent', () => {
376
367
} ) ,
377
368
delay : 1 ,
378
369
timeout : 16 ,
379
- loading : ( ) => 'loading'
370
+ loadingComponent : ( ) => 'loading'
380
371
} )
381
372
382
373
const root = nodeOps . createElement ( 'div' )
383
374
const app = createApp ( {
384
- components : { Foo } ,
385
375
render : ( ) => h ( Foo )
386
376
} )
387
377
const handler = ( app . config . errorHandler = jest . fn ( ) )
@@ -414,7 +404,6 @@ describe('api: defineAsyncComponent', () => {
414
404
415
405
const root = nodeOps . createElement ( 'div' )
416
406
const app = createApp ( {
417
- components : { Foo } ,
418
407
render : ( ) =>
419
408
h ( Suspense , null , {
420
409
default : ( ) => [ h ( Foo ) , ' & ' , h ( Foo ) ] ,
@@ -442,7 +431,6 @@ describe('api: defineAsyncComponent', () => {
442
431
443
432
const root = nodeOps . createElement ( 'div' )
444
433
const app = createApp ( {
445
- components : { Foo } ,
446
434
render : ( ) =>
447
435
h ( Suspense , null , {
448
436
default : ( ) => [ h ( Foo ) , ' & ' , h ( Foo ) ] ,
@@ -470,7 +458,6 @@ describe('api: defineAsyncComponent', () => {
470
458
471
459
const root = nodeOps . createElement ( 'div' )
472
460
const app = createApp ( {
473
- components : { Foo } ,
474
461
render : ( ) =>
475
462
h ( Suspense , null , {
476
463
default : ( ) => [ h ( Foo ) , ' & ' , h ( Foo ) ] ,
@@ -487,4 +474,120 @@ describe('api: defineAsyncComponent', () => {
487
474
expect ( handler ) . toHaveBeenCalled ( )
488
475
expect ( serializeInner ( root ) ) . toBe ( '<!----> & <!---->' )
489
476
} )
477
+
478
+ test ( 'retry (success)' , async ( ) => {
479
+ let loaderCallCount = 0
480
+ let resolve : ( comp : Component ) => void
481
+ let reject : ( e : Error ) => void
482
+
483
+ const Foo = defineAsyncComponent ( {
484
+ loader : ( ) => {
485
+ loaderCallCount ++
486
+ return new Promise ( ( _resolve , _reject ) => {
487
+ resolve = _resolve as any
488
+ reject = _reject
489
+ } )
490
+ } ,
491
+ retryWhen : error => error . message . match ( / f o o / )
492
+ } )
493
+
494
+ const root = nodeOps . createElement ( 'div' )
495
+ const app = createApp ( {
496
+ render : ( ) => h ( Foo )
497
+ } )
498
+
499
+ const handler = ( app . config . errorHandler = jest . fn ( ) )
500
+ app . mount ( root )
501
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
502
+ expect ( loaderCallCount ) . toBe ( 1 )
503
+
504
+ const err = new Error ( 'foo' )
505
+ reject ! ( err )
506
+ await timeout ( )
507
+ expect ( handler ) . not . toHaveBeenCalled ( )
508
+ expect ( loaderCallCount ) . toBe ( 2 )
509
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
510
+
511
+ // should render this time
512
+ resolve ! ( ( ) => 'resolved' )
513
+ await timeout ( )
514
+ expect ( handler ) . not . toHaveBeenCalled ( )
515
+ expect ( serializeInner ( root ) ) . toBe ( 'resolved' )
516
+ } )
517
+
518
+ test ( 'retry (skipped)' , async ( ) => {
519
+ let loaderCallCount = 0
520
+ let reject : ( e : Error ) => void
521
+
522
+ const Foo = defineAsyncComponent ( {
523
+ loader : ( ) => {
524
+ loaderCallCount ++
525
+ return new Promise ( ( _resolve , _reject ) => {
526
+ reject = _reject
527
+ } )
528
+ } ,
529
+ retryWhen : error => error . message . match ( / b a r / )
530
+ } )
531
+
532
+ const root = nodeOps . createElement ( 'div' )
533
+ const app = createApp ( {
534
+ render : ( ) => h ( Foo )
535
+ } )
536
+
537
+ const handler = ( app . config . errorHandler = jest . fn ( ) )
538
+ app . mount ( root )
539
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
540
+ expect ( loaderCallCount ) . toBe ( 1 )
541
+
542
+ const err = new Error ( 'foo' )
543
+ reject ! ( err )
544
+ await timeout ( )
545
+ // should fail because retryWhen returns false
546
+ expect ( handler ) . toHaveBeenCalled ( )
547
+ expect ( handler . mock . calls [ 0 ] [ 0 ] ) . toBe ( err )
548
+ expect ( loaderCallCount ) . toBe ( 1 )
549
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
550
+ } )
551
+
552
+ test ( 'retry (fail w/ maxRetries)' , async ( ) => {
553
+ let loaderCallCount = 0
554
+ let reject : ( e : Error ) => void
555
+
556
+ const Foo = defineAsyncComponent ( {
557
+ loader : ( ) => {
558
+ loaderCallCount ++
559
+ return new Promise ( ( _resolve , _reject ) => {
560
+ reject = _reject
561
+ } )
562
+ } ,
563
+ retryWhen : error => error . message . match ( / f o o / ) ,
564
+ maxRetries : 1
565
+ } )
566
+
567
+ const root = nodeOps . createElement ( 'div' )
568
+ const app = createApp ( {
569
+ render : ( ) => h ( Foo )
570
+ } )
571
+
572
+ const handler = ( app . config . errorHandler = jest . fn ( ) )
573
+ app . mount ( root )
574
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
575
+ expect ( loaderCallCount ) . toBe ( 1 )
576
+
577
+ // first retry
578
+ const err = new Error ( 'foo' )
579
+ reject ! ( err )
580
+ await timeout ( )
581
+ expect ( handler ) . not . toHaveBeenCalled ( )
582
+ expect ( loaderCallCount ) . toBe ( 2 )
583
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
584
+
585
+ // 2nd retry, should fail due to reaching maxRetries
586
+ reject ! ( err )
587
+ await timeout ( )
588
+ expect ( handler ) . toHaveBeenCalled ( )
589
+ expect ( handler . mock . calls [ 0 ] [ 0 ] ) . toBe ( err )
590
+ expect ( loaderCallCount ) . toBe ( 2 )
591
+ expect ( serializeInner ( root ) ) . toBe ( '<!---->' )
592
+ } )
490
593
} )
0 commit comments