11import { describe , it , expect , beforeEach , afterEach , vi } from "vitest" ;
2- import { render , screen , act , waitFor } from "@testing-library/react" ;
2+ import { render , screen , act } from "@testing-library/react" ;
33import { Router } from "../Router.js" ;
44import { Outlet } from "../Outlet.js" ;
55import { route } from "../route.js" ;
@@ -298,7 +298,7 @@ describe("Data Loader", () => {
298298 expect ( screen . getByText ( / C o u n t : / ) . textContent ) . toBe ( firstCount ) ;
299299 } ) ;
300300
301- it ( "caches results per URL pathname " , ( ) => {
301+ it ( "caches results per navigation entry id " , ( ) => {
302302 mockNavigation = setupNavigationMock ( "http://localhost/page1" ) ;
303303
304304 const loaderSpy = vi . fn ( ( { params } : LoaderArgs ) => ( {
@@ -321,22 +321,60 @@ describe("Data Loader", () => {
321321 expect ( loaderSpy ) . toHaveBeenCalledTimes ( 1 ) ;
322322 expect ( screen . getByText ( "Page: page1" ) ) . toBeInTheDocument ( ) ;
323323
324- // Navigate to a different page
324+ // Navigate to a different page (creates new entry at index 1)
325325 act ( ( ) => {
326326 mockNavigation . __simulateNavigation ( "http://localhost/page2" ) ;
327327 } ) ;
328328
329- // Loader should be called again for the new URL
329+ // Loader should be called again for the new entry
330330 expect ( loaderSpy ) . toHaveBeenCalledTimes ( 2 ) ;
331331 expect ( screen . getByText ( "Page: page2" ) ) . toBeInTheDocument ( ) ;
332332
333- // Navigate back to the first page
333+ // Traverse back to the first entry (back button behavior)
334334 act ( ( ) => {
335- mockNavigation . __simulateNavigation ( "http://localhost/page1" ) ;
335+ mockNavigation . __simulateTraversal ( 0 ) ;
336336 } ) ;
337337
338- // Loader should NOT be called again (cache hit)
338+ // Loader should NOT be called again (cache hit - same entry id)
339+ expect ( loaderSpy ) . toHaveBeenCalledTimes ( 2 ) ;
340+ expect ( screen . getByText ( "Page: page1" ) ) . toBeInTheDocument ( ) ;
341+ } ) ;
342+
343+ it ( "calls loader again for new navigation to same URL" , ( ) => {
344+ mockNavigation = setupNavigationMock ( "http://localhost/page1" ) ;
345+
346+ const loaderSpy = vi . fn ( ( { params } : LoaderArgs ) => ( {
347+ page : params . page ,
348+ } ) ) ;
349+
350+ function Page ( { data } : { data : { page : string } } ) {
351+ return < div > Page: { data . page } </ div > ;
352+ }
353+
354+ const routes = [
355+ route ( {
356+ path : "/:page" ,
357+ component : Page ,
358+ loader : loaderSpy ,
359+ } ) ,
360+ ] ;
361+
362+ render ( < Router routes = { routes } /> ) ;
363+ expect ( loaderSpy ) . toHaveBeenCalledTimes ( 1 ) ;
364+
365+ // Navigate to a different page
366+ act ( ( ) => {
367+ mockNavigation . __simulateNavigation ( "http://localhost/page2" ) ;
368+ } ) ;
339369 expect ( loaderSpy ) . toHaveBeenCalledTimes ( 2 ) ;
370+
371+ // Navigate forward to the same URL as the first page (creates new entry)
372+ act ( ( ) => {
373+ mockNavigation . __simulateNavigation ( "http://localhost/page1" ) ;
374+ } ) ;
375+
376+ // Loader SHOULD be called again (new entry, different id)
377+ expect ( loaderSpy ) . toHaveBeenCalledTimes ( 3 ) ;
340378 expect ( screen . getByText ( "Page: page1" ) ) . toBeInTheDocument ( ) ;
341379 } ) ;
342380 } ) ;
0 commit comments