import { nextTestSetup } from 'e2e-utils'
import { retry } from 'next-test-utils'
describe('server patch - history entry', () => {
const { next, isNextDev } = nextTestSetup({
files: __dirname,
})
if (isNextDev) {
test('skipped in dev mode', () => {})
return
}
// When a navigation suspends and then triggers a server patch (tree
// mismatch retry), the retry should preserve the original transition's
// push/replace intent. Because the suspended transition hasn't committed
// to the browser history yet, the retry inherits its navigate type so
// that pushState still runs when the entangled transitions eventually
// commit together.
it('server patch preserves the push intent of a suspended transition', async () => {
const browser = await next.browser('/push-search-params')
await retry(async () => {
const homePage = await browser.elementById('home-page')
expect(await homePage.text()).toContain('Home')
})
// Navigate to the same page with different search params. The transition
// suspends while fetching data, and the server response triggers a tree
// mismatch, causing a server patch retry.
const pushButton = await browser.elementById('push-button')
await pushButton.click()
await retry(async () => {
expect(await browser.url()).toContain('test=pass')
})
// The navigation should have created a new history entry despite the
// server patch retry, so the back button returns to the original URL.
await browser.back()
await retry(async () => {
const url = await browser.url()
expect(url).not.toContain('test=pass')
expect(new URL(url).pathname).toBe('/push-search-params')
})
})
})