Files
Benjamin Woodruff 837e086479 chore(CI): Break pages-dir client-navigation dev tests into smaller parallelizable files/suites (#78787)
Jest can run different suites in parallel, but tests within the same suite must run sequentially in the same worker.

You don't want suites that are too small, because each suite requires relatively expensive repository setup, but you also don't want suites that are too large because it inhibits parallelism.

This is a big problem for arewerspackyet, where many of these test cases are currently failing. Each test can take up to 4 minutes to time out, so we easily time out the entire 90 minute long test runner job.

## Test plan

Tested by running all these tests in parallel with:

```
NEXT_TEST_MODE=dev HEADLESS=true node_modules/.bin/jest test/development/pages-dir/client-navigation
```

It completes in about 2m40s minutes on my machine.
2025-05-05 17:10:56 -07:00

78 lines
2.4 KiB
TypeScript

/* eslint-env jest */
import { check } from 'next-test-utils'
import path from 'path'
import { nextTestSetup } from 'e2e-utils'
describe('Client navigation querystring', () => {
const { next } = nextTestSetup({
files: path.join(__dirname, 'fixture'),
env: {
TEST_STRICT_NEXT_HEAD: String(true),
},
})
describe('with the same page but different querystring', () => {
it('should navigate the page', async () => {
const browser = await next.browser('/nav/querystring?id=1')
const text = await browser
.elementByCss('#next-id-link')
.click()
.waitForElementByCss('.nav-id-2')
.elementByCss('p')
.text()
expect(text).toBe('2')
await browser.close()
})
it('should remove querystring', async () => {
const browser = await next.browser('/nav/querystring?id=1')
const text = await browser
.elementByCss('#main-page')
.click()
.waitForElementByCss('.nav-id-0')
.elementByCss('p')
.text()
expect(text).toBe('0')
await browser.close()
})
})
describe('with querystring relative urls', () => {
it('should work with Link', async () => {
const browser = await next.browser('/nav/query-only')
await browser.elementByCss('#link').click()
await check(() => browser.waitForElementByCss('#prop').text(), 'foo')
})
it('should work with router.push', async () => {
const browser = await next.browser('/nav/query-only')
await browser.elementByCss('#router-push').click()
await check(() => browser.waitForElementByCss('#prop').text(), 'bar')
})
it('should work with router.replace', async () => {
const browser = await next.browser('/nav/query-only')
await browser.elementByCss('#router-replace').click()
await check(() => browser.waitForElementByCss('#prop').text(), 'baz')
})
it('router.replace with shallow=true shall not throw route cancelled errors', async () => {
const browser = await next.browser('/nav/query-only-shallow')
await browser.elementByCss('#router-replace').click()
// the error occurs on every replace() after the first one
await browser.elementByCss('#router-replace').click()
await check(
() => browser.waitForElementByCss('#routeState').text(),
'{"completed":2,"errors":0}'
)
})
})
})