Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
92 lines
3.2 KiB
TypeScript
92 lines
3.2 KiB
TypeScript
import { createNext } from 'e2e-utils'
|
|
import { findPort } from 'next-test-utils'
|
|
import { createTestDataServer } from 'test-data-service/writer'
|
|
import { createTestLog } from 'test-log'
|
|
|
|
describe('avoid-popstate-flash', () => {
|
|
if ((global as any).isNextDev || (global as any).isNextDeploy) {
|
|
// this is skipped in dev because PPR is not enabled in dev
|
|
// and in deploy we can't rely on this test data service existing
|
|
test('should skip dev & deploy', () => {})
|
|
return
|
|
}
|
|
|
|
let server
|
|
let next
|
|
afterEach(async () => {
|
|
await next?.destroy()
|
|
server?.close()
|
|
})
|
|
|
|
test('does not flash back to partial PPR data during back/forward navigation', async () => {
|
|
const TestLog = createTestLog()
|
|
let autoresolveRequests = true
|
|
let pendingRequests = new Map()
|
|
server = createTestDataServer(async (key, res) => {
|
|
TestLog.log('REQUEST: ' + key)
|
|
if (autoresolveRequests) {
|
|
res.resolve()
|
|
return
|
|
}
|
|
if (pendingRequests.has(key)) {
|
|
throw new Error('Request already pending for ' + key)
|
|
}
|
|
pendingRequests.set(key, res)
|
|
})
|
|
const port = await findPort()
|
|
server.listen(port)
|
|
next = await createNext({
|
|
files: __dirname,
|
|
env: { TEST_DATA_SERVICE_URL: `http://localhost:${port}` },
|
|
})
|
|
TestLog.assert(['REQUEST: Static'])
|
|
autoresolveRequests = false
|
|
|
|
const browser = await next.browser('/')
|
|
|
|
// Navigate to the target page.
|
|
const link = await browser.elementByCss('a[href="/some-page"]')
|
|
await link.click()
|
|
|
|
// The static UI appears immediately because it was prerendered at
|
|
// build time.
|
|
const staticContainer = await browser.elementById('static')
|
|
expect(await staticContainer.innerText()).toBe('Static')
|
|
|
|
await TestLog.waitFor(['REQUEST: Dynamic'])
|
|
pendingRequests.get('Dynamic').resolve()
|
|
|
|
// Now the dynamic data appears.
|
|
const dynamic = await browser.elementById('dynamic')
|
|
expect(await dynamic.innerText()).toBe('Dynamic')
|
|
|
|
// At this point all the data has been loaded into the cache. We're going
|
|
// to test what happens during a back/forward navigation.
|
|
|
|
// Set a global state that causes Suspense fallbacks to throw.
|
|
const checkbox = await browser.elementById('should-fallback-throw')
|
|
await checkbox.click()
|
|
const checked = await checkbox.getProperty('checked')
|
|
expect(await checked.jsonValue()).toBe(true)
|
|
|
|
// Navigate using back/forward using the browser's history stack. This
|
|
// should not trigger a fresh navigation, nor any network requests. We
|
|
// should read the data from the cache. And we should not render the
|
|
// partially complete PPR data that was used during the initial navigation.
|
|
//
|
|
// If the data is not read from cache, or if partial data is shown, it will
|
|
// trigger a fallback, which will throw an error because of the state we
|
|
// set above.
|
|
await browser.back()
|
|
await browser.forward()
|
|
|
|
// Confirm that the dynamic data is visible. This implies that the fallback
|
|
// did not throw.
|
|
const dynamic2 = await browser.elementById('dynamic')
|
|
expect(await dynamic2.innerText()).toBe('Dynamic')
|
|
|
|
// There should have been no additional requests.
|
|
TestLog.assert([])
|
|
})
|
|
})
|