import { nextTestSetup } from 'e2e-utils' import { retry } from 'next-test-utils' describe('segment cache (MPA navigations)', () => { const { next, isNextDev } = nextTestSetup({ files: __dirname, }) if (isNextDev) { test('ppr is disabled', () => {}) return } type ElementWithExpando = Element & { __expando?: boolean } it('triggers MPA navigation when navigating to a different root layout', async () => { const browser = await next.browser('/') // Set an expando on the html element so we can detect if the page // gets unloaded. const html = await browser.elementByCss('html') await html.evaluate((el) => ((el as ElementWithExpando).__expando = true)) // Navigate to a page with a different root layout. const link = await browser.elementByCss(`a[href="/foo"]`) await link.click() // The expando should not be present because we did a full-page navigation. await retry(async () => { const htmlAfterNav = await browser.elementByCss('html') expect( await htmlAfterNav.evaluate( (el) => (el as ElementWithExpando).__expando ) ).toBe(undefined) }) }) it( 'triggers MPA navigation when navigating to a different root layout, ' + 'during a navigation where a root param also changed', async () => { // Testing this scenario because a root param change alone does not // trigger an MPA navigation, but if an inner segment changes before the // root layout, then we should trigger an MPA navigation. This case is // handled slightly differently in the implementation than the case where // there's no root param change. const browser = await next.browser('/foo') // Set an expando on the html element so we can detect if the page // gets unloaded. const html = await browser.elementByCss('html') await html.evaluate((el) => ((el as ElementWithExpando).__expando = true)) // Navigate to a page with a different root layout. const link = await browser.elementByCss(`a[href="/bar/inner"]`) await link.click() // The expando should not be present because we did a full-page navigation. await retry(async () => { const htmlAfterNav = await browser.elementByCss('html') expect( await htmlAfterNav.evaluate( (el) => (el as ElementWithExpando).__expando ) ).toBe(undefined) }) } ) })