@@ -182,17 +182,65 @@ describe('navigation-guard', () => {
182182 it ( 'collects all loaders from lazy loaded pages with repeated navigation' , async ( ) => {
183183 setupApp ( { isSSR : false } )
184184 const router = getRouter ( )
185+
186+ const { promise, resolve } = Promise . withResolvers < void > ( )
187+
185188 router . addRoute ( {
186189 name : '_test' ,
187190 path : '/fetch' ,
188- component : ( ) =>
189- import ( '../../tests/data-loaders/ComponentWithLoader.vue' ) ,
191+ component : async ( ) => {
192+ await promise
193+
194+ return import ( '../../tests/data-loaders/ComponentWithLoader.vue' )
195+ } ,
190196 } )
191197
192198 void router . push ( '/fetch' )
193199
194- // simulate repeated navigation while the async component is loading
200+ // wait a tick to ensure first navigation is started
195201 await Promise . resolve ( )
202+
203+ const secondNavPromise = router . push ( '/fetch' )
204+ resolve ( )
205+ await secondNavPromise
206+
207+ const set = router . currentRoute . value . meta [ LOADER_SET_KEY ]
208+ expect ( [ ...set ! ] ) . toEqual ( [ useDataOne , useDataTwo ] )
209+
210+ for ( const record of router . currentRoute . value . matched ) {
211+ expect ( record . meta [ LOADER_SET_PROMISES_KEY ] ) . toBeUndefined ( )
212+ }
213+ } )
214+
215+ it ( 'collects all loaders from lazy loaded pages when first navigation fails' , async ( ) => {
216+ setupApp ( { isSSR : false } )
217+ const router = getRouter ( )
218+
219+ let first = true
220+ router . addRoute ( {
221+ name : '_test' ,
222+ path : '/fetch' ,
223+ component : async ( ) => {
224+ if ( first ) {
225+ first = false
226+
227+ throw new Error ( 'Failed to load component' )
228+ }
229+
230+ return import ( '../../tests/data-loaders/ComponentWithLoader.vue' )
231+ } ,
232+ } )
233+
234+ const firstNavPromise = router . push ( '/fetch' )
235+ await expect ( firstNavPromise ) . rejects . toThrow ( Error )
236+
237+ // Verify loaders collection cleanup after failure
238+ const rec = getRouter ( )
239+ . getRoutes ( )
240+ . find ( ( r ) => r . name === '_test' ) !
241+ expect ( rec . meta [ LOADER_SET_KEY ] ) . toBeUndefined ( )
242+ expect ( rec . meta [ LOADER_SET_PROMISES_KEY ] ) . toBeUndefined ( )
243+
196244 await router . push ( '/fetch' )
197245
198246 const set = router . currentRoute . value . meta [ LOADER_SET_KEY ]
0 commit comments