@@ -109,11 +109,16 @@ describe("lazily loaded route modules", () => {
109
109
110
110
router . initialize ( ) ;
111
111
112
- let loader = ( ) => null ;
112
+ let loader = jest . fn ( ( ) => null ) ;
113
113
await lazyLoaderDeferred . resolve ( loader ) ;
114
114
115
- let action = ( ) => null ;
115
+ // Ensure loader is called as soon as it's loaded
116
+ expect ( loader ) . toHaveBeenCalledTimes ( 1 ) ;
117
+
118
+ // Finish loading all lazy properties
119
+ let action = jest . fn ( ( ) => null ) ;
116
120
await lazyActionDeferred . resolve ( action ) ;
121
+ expect ( action ) . toHaveBeenCalledTimes ( 0 ) ;
117
122
118
123
expect ( router . state . location . pathname ) . toBe ( "/lazy" ) ;
119
124
expect ( router . state . navigation . state ) . toBe ( "idle" ) ;
@@ -222,15 +227,10 @@ describe("lazily loaded route modules", () => {
222
227
lazy : async ( ) => {
223
228
throw new Error ( "SHOULD NOT BE CALLED" ) ;
224
229
} ,
225
- // @ts -expect-error
226
230
caseSensitive : async ( ) => true ,
227
- // @ts -expect-error
228
231
path : async ( ) => "/lazy/path" ,
229
- // @ts -expect-error
230
232
id : async ( ) => "lazy" ,
231
- // @ts -expect-error
232
233
index : async ( ) => true ,
233
- // @ts -expect-error
234
234
children : async ( ) => [ ] ,
235
235
} ,
236
236
} ,
@@ -304,12 +304,14 @@ describe("lazily loaded route modules", () => {
304
304
305
305
it ( "resolves lazy route properties and executes loaders on router initialization" , async ( ) => {
306
306
let lazyLoaderDeferred = createDeferred ( ) ;
307
+ let lazyActionDeferred = createDeferred ( ) ;
307
308
let router = createRouter ( {
308
309
routes : [
309
310
{
310
311
path : "/lazy" ,
311
312
lazy : {
312
313
loader : ( ) => lazyLoaderDeferred . promise ,
314
+ action : ( ) => lazyActionDeferred . promise ,
313
315
} ,
314
316
} ,
315
317
] ,
@@ -320,11 +322,17 @@ describe("lazily loaded route modules", () => {
320
322
321
323
router . initialize ( ) ;
322
324
323
- let loaderDeferred = createDeferred ( ) ;
324
- let loader = ( ) => loaderDeferred . promise ;
325
+ // Ensure loader is called as soon as it's loaded
326
+ let { lazyStub : loader , lazyDeferred : loaderDeferred } = createLazyStub ( ) ;
325
327
await lazyLoaderDeferred . resolve ( loader ) ;
328
+ expect ( loader ) . toHaveBeenCalledTimes ( 1 ) ;
326
329
expect ( router . state . initialized ) . toBe ( false ) ;
327
330
331
+ // Finish loading all lazy properties
332
+ let action = jest . fn ( ( ) => null ) ;
333
+ await lazyActionDeferred . resolve ( action ) ;
334
+ expect ( action ) . toHaveBeenCalledTimes ( 0 ) ;
335
+
328
336
await loaderDeferred . resolve ( "LOADER" ) ;
329
337
expect ( router . state . location . pathname ) . toBe ( "/lazy" ) ;
330
338
expect ( router . state . navigation . state ) . toBe ( "idle" ) ;
@@ -366,32 +374,46 @@ describe("lazily loaded route modules", () => {
366
374
} ) ;
367
375
368
376
it ( "resolves lazy route properties on loading navigation" , async ( ) => {
369
- let { lazyStub, lazyDeferred } = createLazyStub ( ) ;
377
+ let { lazyStub : lazyLoader , lazyDeferred : lazyLoaderDeferred } =
378
+ createLazyStub ( ) ;
379
+ let { lazyStub : lazyAction , lazyDeferred : lazyActionDeferred } =
380
+ createLazyStub ( ) ;
370
381
let routes = createBasicLazyRoutes ( {
371
- loader : lazyStub ,
382
+ loader : lazyLoader ,
383
+ action : lazyAction ,
372
384
} ) ;
373
385
let t = setup ( { routes } ) ;
374
- expect ( lazyStub ) . not . toHaveBeenCalled ( ) ;
386
+ expect ( lazyLoader ) . not . toHaveBeenCalled ( ) ;
375
387
376
388
await t . navigate ( "/lazy" ) ;
377
389
expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
378
390
expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
379
- expect ( lazyStub ) . toHaveBeenCalledTimes ( 1 ) ;
391
+ expect ( lazyLoader ) . toHaveBeenCalledTimes ( 1 ) ;
380
392
381
- let loaderDeferred = createDeferred ( ) ;
382
- lazyDeferred . resolve ( ( ) => loaderDeferred . promise ) ;
393
+ // Ensure loader is called as soon as it's loaded
394
+ let { lazyStub : loader , lazyDeferred : loaderDeferred } = createLazyStub ( ) ;
395
+ await lazyLoaderDeferred . resolve ( loader ) ;
396
+ expect ( loader ) . toHaveBeenCalledTimes ( 1 ) ;
383
397
expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
384
398
expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
385
- expect ( lazyStub ) . toHaveBeenCalledTimes ( 1 ) ;
386
399
400
+ // Ensure we're still loading if other lazy properties are not loaded yet
387
401
await loaderDeferred . resolve ( "LAZY LOADER" ) ;
402
+ expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
403
+ expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
404
+
405
+ // Finish loading all lazy properties
406
+ let action = jest . fn ( ( ) => null ) ;
407
+ await lazyActionDeferred . resolve ( action ) ;
408
+ expect ( action ) . toHaveBeenCalledTimes ( 0 ) ;
388
409
389
410
expect ( t . router . state . location . pathname ) . toBe ( "/lazy" ) ;
390
411
expect ( t . router . state . navigation . state ) . toBe ( "idle" ) ;
391
412
expect ( t . router . state . loaderData ) . toEqual ( {
392
413
lazy : "LAZY LOADER" ,
393
414
} ) ;
394
- expect ( lazyStub ) . toHaveBeenCalledTimes ( 1 ) ;
415
+ expect ( lazyLoader ) . toHaveBeenCalledTimes ( 1 ) ;
416
+ expect ( lazyAction ) . toHaveBeenCalledTimes ( 1 ) ;
395
417
} ) ;
396
418
397
419
it ( "ignores falsy lazy route properties on loading navigation" , async ( ) => {
@@ -480,21 +502,25 @@ describe("lazily loaded route modules", () => {
480
502
expect ( lazyLoaderStub ) . toHaveBeenCalledTimes ( 1 ) ;
481
503
expect ( lazyActionStub ) . toHaveBeenCalledTimes ( 1 ) ;
482
504
483
- let actionDeferred = createDeferred ( ) ;
484
- let loaderDeferred = createDeferred ( ) ;
485
- lazyLoaderDeferred . resolve ( ( ) => loaderDeferred . promise ) ;
486
- lazyActionDeferred . resolve ( ( ) => actionDeferred . promise ) ;
487
- expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
488
- expect ( t . router . state . navigation . state ) . toBe ( "submitting" ) ;
505
+ let { lazyStub : action , lazyDeferred : actionDeferred } = createLazyStub ( ) ;
506
+ let { lazyStub : loader , lazyDeferred : loaderDeferred } = createLazyStub ( ) ;
489
507
508
+ // Ensure action is called as soon as it's loaded
509
+ await lazyActionDeferred . resolve ( action ) ;
490
510
await actionDeferred . resolve ( "LAZY ACTION" ) ;
511
+ expect ( action ) . toHaveBeenCalledTimes ( 1 ) ;
512
+ expect ( loader ) . toHaveBeenCalledTimes ( 0 ) ;
491
513
expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
492
- expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
493
- expect ( t . router . state . actionData ) . toEqual ( {
494
- lazy : "LAZY ACTION" ,
495
- } ) ;
514
+ expect ( t . router . state . navigation . state ) . toBe ( "submitting" ) ;
515
+ expect ( t . router . state . actionData ) . toEqual ( null ) ;
496
516
expect ( t . router . state . loaderData ) . toEqual ( { } ) ;
497
517
518
+ // Finish loading all lazy properties
519
+ await lazyLoaderDeferred . resolve ( loader ) ;
520
+ expect ( loader ) . toHaveBeenCalledTimes ( 1 ) ;
521
+ expect ( action ) . toHaveBeenCalledTimes ( 1 ) ;
522
+ expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
523
+ expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
498
524
await loaderDeferred . resolve ( "LAZY LOADER" ) ;
499
525
expect ( t . router . state . location . pathname ) . toBe ( "/lazy" ) ;
500
526
expect ( t . router . state . navigation . state ) . toBe ( "idle" ) ;
@@ -2028,7 +2054,7 @@ describe("lazily loaded route modules", () => {
2028
2054
expect ( lazyStub ) . toHaveBeenCalledTimes ( 1 ) ;
2029
2055
} ) ;
2030
2056
2031
- it ( "handles errors when failing to resolve lazy route property on loading navigation" , async ( ) => {
2057
+ it ( "handles errors when failing to resolve lazy route loader property on loading navigation" , async ( ) => {
2032
2058
let { lazyStub, lazyDeferred } = createLazyStub ( ) ;
2033
2059
let routes = createBasicLazyRoutes ( {
2034
2060
loader : lazyStub ,
@@ -2052,6 +2078,43 @@ describe("lazily loaded route modules", () => {
2052
2078
expect ( lazyStub ) . toHaveBeenCalledTimes ( 1 ) ;
2053
2079
} ) ;
2054
2080
2081
+ it ( "handles errors when failing to resolve other lazy route properties on loading navigation" , async ( ) => {
2082
+ let { lazyStub : lazyLoader , lazyDeferred : lazyLoaderDeferred } =
2083
+ createLazyStub ( ) ;
2084
+ let { lazyStub : lazyAction , lazyDeferred : lazyActionDeferred } =
2085
+ createLazyStub ( ) ;
2086
+ let routes = createBasicLazyRoutes ( {
2087
+ loader : lazyLoader ,
2088
+ action : lazyAction ,
2089
+ } ) ;
2090
+ let t = setup ( { routes } ) ;
2091
+ expect ( lazyLoader ) . not . toHaveBeenCalled ( ) ;
2092
+
2093
+ await t . navigate ( "/lazy" ) ;
2094
+ expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
2095
+ expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
2096
+ expect ( lazyLoader ) . toHaveBeenCalledTimes ( 1 ) ;
2097
+
2098
+ // Ensure loader is called as soon as it's loaded
2099
+ let loader = jest . fn ( ( ) => null ) ;
2100
+ await lazyLoaderDeferred . resolve ( loader ) ;
2101
+ expect ( t . router . state . location . pathname ) . toBe ( "/" ) ;
2102
+ expect ( t . router . state . navigation . state ) . toBe ( "loading" ) ;
2103
+ expect ( loader ) . toHaveBeenCalledTimes ( 1 ) ;
2104
+
2105
+ // Reject remaining lazy properties
2106
+ await lazyActionDeferred . reject ( new Error ( "LAZY PROPERTY ERROR" ) ) ;
2107
+ expect ( t . router . state . location . pathname ) . toBe ( "/lazy" ) ;
2108
+ expect ( t . router . state . navigation . state ) . toBe ( "idle" ) ;
2109
+
2110
+ expect ( t . router . state . loaderData ) . toEqual ( { } ) ;
2111
+ expect ( t . router . state . errors ) . toEqual ( {
2112
+ root : new Error ( "LAZY PROPERTY ERROR" ) ,
2113
+ } ) ;
2114
+ expect ( lazyLoader ) . toHaveBeenCalledTimes ( 1 ) ;
2115
+ expect ( lazyAction ) . toHaveBeenCalledTimes ( 1 ) ;
2116
+ } ) ;
2117
+
2055
2118
it ( "handles loader errors from lazy route functions when the route has an error boundary" , async ( ) => {
2056
2119
let { routes, lazyStub, lazyDeferred } = createBasicLazyFunctionRoutes ( ) ;
2057
2120
let t = setup ( { routes } ) ;
@@ -2305,7 +2368,7 @@ describe("lazily loaded route modules", () => {
2305
2368
it ( "handles errors when failing to resolve lazy route properties on submission navigation" , async ( ) => {
2306
2369
let { lazyStub, lazyDeferred } = createLazyStub ( ) ;
2307
2370
let routes = createBasicLazyRoutes ( {
2308
- loader : lazyStub ,
2371
+ action : lazyStub ,
2309
2372
} ) ;
2310
2373
let t = setup ( { routes } ) ;
2311
2374
expect ( lazyStub ) . not . toHaveBeenCalled ( ) ;
@@ -2627,7 +2690,7 @@ describe("lazily loaded route modules", () => {
2627
2690
it ( "handles errors when failing to load lazy route properties on fetcher.submit" , async ( ) => {
2628
2691
let { lazyStub, lazyDeferred } = createLazyStub ( ) ;
2629
2692
let routes = createBasicLazyRoutes ( {
2630
- loader : lazyStub ,
2693
+ action : lazyStub ,
2631
2694
} ) ;
2632
2695
let t = setup ( { routes } ) ;
2633
2696
expect ( lazyStub ) . not . toHaveBeenCalled ( ) ;
0 commit comments