@@ -2,6 +2,7 @@ import { expect, test, vi } from 'vitest';
22import { getRouteDataTestContext } from '../test-utils' ;
33import { generateRouteData } from '../../utils/routing/data' ;
44import { routes } from '../../utils/routing' ;
5+ import { flattenSidebar } from '../../utils/navigation' ;
56
67vi . mock ( 'astro:content' , async ( ) =>
78 ( await import ( '../test-utils' ) ) . mockedAstroContent ( {
@@ -86,3 +87,85 @@ test('uses explicit last updated date from frontmatter', () => {
8687 expect ( data . lastUpdated ) . toBeInstanceOf ( Date ) ;
8788 expect ( data . lastUpdated ) . toEqual ( route . entry . data . lastUpdated ) ;
8889} ) ;
90+
91+ test ( 'uses getSidebarForRender when prerender is enabled' , async ( ) => {
92+ const [ { default : config } , navigation ] = await Promise . all ( [
93+ import ( 'virtual:starlight/user-config' ) ,
94+ import ( '../../utils/navigation' ) ,
95+ ] ) ;
96+ const originalPrerender = config . prerender ;
97+ const getSidebarForRenderSpy = vi . spyOn ( navigation , 'getSidebarForRender' ) ;
98+ const getSidebarSpy = vi . spyOn ( navigation , 'getSidebar' ) ;
99+
100+ try {
101+ config . prerender = true ;
102+ const route = routes [ 0 ] ! ;
103+ generateRouteData ( {
104+ props : { ...route , headings : [ ] } ,
105+ context : getRouteDataTestContext ( { pathname : '/' } ) ,
106+ } ) ;
107+
108+ expect ( getSidebarForRenderSpy ) . toHaveBeenCalledTimes ( 1 ) ;
109+ expect ( getSidebarSpy ) . not . toHaveBeenCalled ( ) ;
110+ } finally {
111+ config . prerender = originalPrerender ;
112+ getSidebarForRenderSpy . mockRestore ( ) ;
113+ getSidebarSpy . mockRestore ( ) ;
114+ }
115+ } ) ;
116+
117+ test ( 'keeps prerender sidebar snapshots isolated between route data calls' , async ( ) => {
118+ const { default : config } = await import ( 'virtual:starlight/user-config' ) ;
119+ const originalPrerender = config . prerender ;
120+
121+ try {
122+ config . prerender = true ;
123+ const homeRoute = routes [ 0 ] ! ;
124+ const impactRoute = routes [ 3 ] ! ;
125+ const firstData = generateRouteData ( {
126+ props : { ...homeRoute , headings : [ ] } ,
127+ context : getRouteDataTestContext ( { pathname : '/' } ) ,
128+ } ) ;
129+ const secondData = generateRouteData ( {
130+ props : { ...impactRoute , headings : [ ] } ,
131+ context : getRouteDataTestContext ( { pathname : '/environmental-impact/' } ) ,
132+ } ) ;
133+
134+ // firstData.sidebar must not have been mutated by the second generateRouteData call
135+ const firstCurrent = flattenSidebar ( firstData . sidebar ) . filter ( ( entry ) => entry . isCurrent ) ;
136+ const secondCurrent = flattenSidebar ( secondData . sidebar ) . filter ( ( entry ) => entry . isCurrent ) ;
137+
138+ expect ( firstCurrent ) . toHaveLength ( 1 ) ;
139+ expect ( firstCurrent [ 0 ] ?. href ) . toBe ( '/' ) ;
140+ expect ( secondCurrent ) . toHaveLength ( 1 ) ;
141+ expect ( secondCurrent [ 0 ] ?. href ) . toBe ( '/environmental-impact/' ) ;
142+ } finally {
143+ config . prerender = originalPrerender ;
144+ }
145+ } ) ;
146+
147+ test ( 'uses getSidebar when prerender is disabled' , async ( ) => {
148+ const [ { default : config } , navigation ] = await Promise . all ( [
149+ import ( 'virtual:starlight/user-config' ) ,
150+ import ( '../../utils/navigation' ) ,
151+ ] ) ;
152+ const originalPrerender = config . prerender ;
153+ const getSidebarForRenderSpy = vi . spyOn ( navigation , 'getSidebarForRender' ) ;
154+ const getSidebarSpy = vi . spyOn ( navigation , 'getSidebar' ) ;
155+
156+ try {
157+ config . prerender = false ;
158+ const route = routes [ 0 ] ! ;
159+ generateRouteData ( {
160+ props : { ...route , headings : [ ] } ,
161+ context : getRouteDataTestContext ( { pathname : '/' } ) ,
162+ } ) ;
163+
164+ expect ( getSidebarSpy ) . toHaveBeenCalledTimes ( 1 ) ;
165+ expect ( getSidebarForRenderSpy ) . not . toHaveBeenCalled ( ) ;
166+ } finally {
167+ config . prerender = originalPrerender ;
168+ getSidebarForRenderSpy . mockRestore ( ) ;
169+ getSidebarSpy . mockRestore ( ) ;
170+ }
171+ } ) ;
0 commit comments