@@ -272,3 +272,36 @@ test('can require CJS module that is not bundled', async ({ simple }) => {
272272 expect ( parsedBody . notBundledCJSModule . isBundled ) . toEqual ( false )
273273 expect ( parsedBody . bundledCJSModule . isBundled ) . toEqual ( true )
274274} )
275+
276+ test ( 'next/after callback is executed and finishes' , async ( { page, simple } ) => {
277+ test . skip ( ! nextVersionSatisfies ( '>=15.0.0' ) , 'This test is only for Next.js 15+' )
278+
279+ await page . goto ( `${ simple . url } /after/check` )
280+ const pageInfoLocator1 = await page . locator ( '#page-info' )
281+ const pageInfo1 = JSON . parse ( ( await pageInfoLocator1 . textContent ( ) ) ?? '{}' )
282+
283+ expect ( typeof pageInfo1 ?. timestamp , 'Check page should have timestamp' ) . toBe ( 'number' )
284+
285+ await new Promise ( ( resolve ) => setTimeout ( resolve , 2000 ) )
286+
287+ await page . goto ( `${ simple . url } /after/check` )
288+ const pageInfoLocator2 = await page . locator ( '#page-info' )
289+ const pageInfo2 = JSON . parse ( ( await pageInfoLocator2 . textContent ( ) ) ?? '{}' )
290+
291+ expect ( typeof pageInfo2 ?. timestamp , 'Check page should have timestamp' ) . toBe ( 'number' )
292+
293+ expect ( pageInfo2 . timestamp , 'Check page should be cached' ) . toBe ( pageInfo1 . timestamp )
294+
295+
296+ await page . goto ( `${ simple . url } /after/trigger` )
297+
298+ // wait for next/after to trigger revalidation of check page
299+ await new Promise ( ( resolve ) => setTimeout ( resolve , 5000 ) )
300+
301+ await page . goto ( `${ simple . url } /after/check` )
302+ const pageInfoLocator3 = await page . locator ( '#page-info' )
303+ const pageInfo3 = JSON . parse ( ( await pageInfoLocator3 . textContent ( ) ) ?? '{}' )
304+
305+ expect ( typeof pageInfo3 ?. timestamp , 'Check page should have timestamp' ) . toBe ( 'number' )
306+ expect ( pageInfo3 . timestamp , 'Check page should be invalidated with newer timestamp' ) . toBeGreaterThan ( pageInfo1 . timestamp )
307+ } )
0 commit comments