diff --git a/package.json b/package.json index 661cb0b35b35d4f881cbd767c5341d44604b0b3f..0e6df064ec9786f3da1b356c9a50d406aa75a8cd 100644 --- a/package.json +++ b/package.json @@ -112,8 +112,8 @@ "release": "6.0.1", "request-promise-core": "1.1.2", "rimraf": "2.6.3", - "selenium-standalone": "6.17.0", - "selenium-webdriver": "4.0.0-alpha.5", + "selenium-standalone": "6.18.0", + "selenium-webdriver": "4.0.0-alpha.7", "shell-quote": "1.7.2", "styled-components": "5.1.0", "styled-jsx-plugin-postcss": "2.0.1", diff --git a/run-tests.js b/run-tests.js index 5dd3964ab57cda6f53b4a6166e76d8333436dc83..c37091b807d6649fff2b5ae94d344e83a146ce75 100644 --- a/run-tests.js +++ b/run-tests.js @@ -136,7 +136,7 @@ const TIMINGS_API = `https://next-timings.jjsweb.site/api/timings` { stdio: 'inherit', env: { - JEST_RETRY_TIMES: 2, + JEST_RETRY_TIMES: 0, ...process.env, ...(isAzure ? { diff --git a/test/integration/amphtml/pages/only-amp.js b/test/integration/amphtml/pages/only-amp.js index 653dbecd541d569615abee59f778742fc7a57004..41866b35c52c3fe53bc2d61dcbb5372fe2c5efc6 100644 --- a/test/integration/amphtml/pages/only-amp.js +++ b/test/integration/amphtml/pages/only-amp.js @@ -1,7 +1,9 @@ export const config = { amp: true } -export default () => ( -
Only AMP for me...
-Only AMP for me...
+post: {query.post}
diff --git a/test/integration/auto-export/test/index.test.js b/test/integration/auto-export/test/index.test.js index 6407b174dbc2ebb3e385c801deb195f46b4278e4..edaff678a19d5070ac77975f6309ec303039cb37 100644 --- a/test/integration/auto-export/test/index.test.js +++ b/test/integration/auto-export/test/index.test.js @@ -81,9 +81,8 @@ describe('Auto Export', () => { it('should not show hydration warning from mismatching asPath', async () => { const browser = await webdriver(appPort, '/zeit/cmnt-1') - - const numCaught = await browser.eval(`window.caughtWarns.length`) - expect(numCaught).toBe(0) + const caughtWarns = await browser.eval(`window.caughtWarns`) + expect(caughtWarns).toEqual([]) }) }) }) diff --git a/test/integration/build-indicator/pages/a.js b/test/integration/build-indicator/pages/a.js index f87a68489341815b6cdb7e81c9e3bf0eea23195c..45361f18d6af33ac51ee163b697ea21cb7b50849 100644 --- a/test/integration/build-indicator/pages/a.js +++ b/test/integration/build-indicator/pages/a.js @@ -1 +1,3 @@ -export default () =>Hello from a
+export default function Page() { + returnHello from a
+} diff --git a/test/integration/build-indicator/pages/b.js b/test/integration/build-indicator/pages/b.js index 6226f2d97f20a2887d721517bed38f05a7ff0174..fb38aab0d4496af179f897d02fcdecfd2feeb021 100644 --- a/test/integration/build-indicator/pages/b.js +++ b/test/integration/build-indicator/pages/b.js @@ -1 +1,3 @@ -export default () =>Hello from b
+export default function Page() { + returnHello from b
+} diff --git a/test/integration/build-indicator/pages/index.js b/test/integration/build-indicator/pages/index.js index 9f630e36e417e0194b8a1bfc15fe5703fba67353..b810ac290b56cfe31b6b54133e550118809fc34b 100644 --- a/test/integration/build-indicator/pages/index.js +++ b/test/integration/build-indicator/pages/index.js @@ -1,12 +1,14 @@ import Link from 'next/link' -export default () => ( - <> - - Go to a - - - Go to b - - > -) +export default function Page() { + return ( + <> + + Go to a + + + Go to b + + > + ) +} diff --git a/test/integration/dynamic-optional-routing/test/index.test.js b/test/integration/dynamic-optional-routing/test/index.test.js index 90dcb70c9e138e98a7ff8249290a875e1ab6fb1c..c17bd9168bf550c41ef667f98ed07aceaa74d4ca 100644 --- a/test/integration/dynamic-optional-routing/test/index.test.js +++ b/test/integration/dynamic-optional-routing/test/index.test.js @@ -10,7 +10,7 @@ import { nextBuild, nextStart, renderViaHTTP, - waitFor, + check, } from 'next-test-utils' import { join } from 'path' @@ -18,6 +18,7 @@ jest.setTimeout(1000 * 60 * 2) let app let appPort +let stderr const appDir = join(__dirname, '../') const DUMMY_PAGE = 'export default () => null' @@ -187,9 +188,10 @@ function runInvalidPagesTests(buildFn) { const invalidRoute = appDir + 'pages/index.js' try { await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8') - const { stderr } = await buildFn(appDir) - await expect(stderr).toMatch( - 'You cannot define a route with the same specificity as a optional catch-all route' + await buildFn(appDir) + await check( + () => stderr, + /You cannot define a route with the same specificity as a optional catch-all route/ ) } finally { await fs.unlink(invalidRoute) @@ -200,9 +202,10 @@ function runInvalidPagesTests(buildFn) { const invalidRoute = appDir + 'pages/nested.js' try { await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8') - const { stderr } = await buildFn(appDir) - await expect(stderr).toMatch( - 'You cannot define a route with the same specificity as a optional catch-all route' + await buildFn(appDir) + await check( + () => stderr, + /You cannot define a route with the same specificity as a optional catch-all route/ ) } finally { await fs.unlink(invalidRoute) @@ -213,8 +216,8 @@ function runInvalidPagesTests(buildFn) { const invalidRoute = appDir + 'pages/nested/[...param].js' try { await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8') - const { stderr } = await buildFn(appDir) - await expect(stderr).toMatch(/You cannot use both .+ at the same level/) + await buildFn(appDir) + await check(() => stderr, /You cannot use both .+ at the same level/) } finally { await fs.unlink(invalidRoute) } @@ -224,9 +227,10 @@ function runInvalidPagesTests(buildFn) { const invalidRoute = appDir + 'pages/invalid/[[param]].js' try { await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8') - const { stderr } = await buildFn(appDir) - await expect(stderr).toMatch( - 'Optional route parameters are not yet supported' + await buildFn(appDir) + await check( + () => stderr, + /Optional route parameters are not yet supported/ ) } finally { await fs.unlink(invalidRoute) @@ -245,14 +249,12 @@ describe('Dynamic Optional Routing', () => { runTests() runInvalidPagesTests(async (appDir) => { - let stderr = '' + stderr = '' await launchApp(appDir, await findPort(), { onStderr: (msg) => { stderr += msg }, }) - await waitFor(1000) - return { stderr } }) }) @@ -272,9 +274,9 @@ describe('Dynamic Optional Routing', () => { runTests() - runInvalidPagesTests(async (appDir) => - nextBuild(appDir, [], { stderr: true }) - ) + runInvalidPagesTests(async (appDir) => { + ;({ stderr } = await nextBuild(appDir, [], { stderr: true })) + }) it('should fail to build when param is not explicitly defined', async () => { const invalidRoute = appDir + 'pages/invalid/[[...slug]].js' diff --git a/test/integration/error-in-error/test/index.test.js b/test/integration/error-in-error/test/index.test.js index 2b4bee2991071a71ee60be2a113695c3c7368044..4443aec17bc33f94106550513c902542cc9426b5 100644 --- a/test/integration/error-in-error/test/index.test.js +++ b/test/integration/error-in-error/test/index.test.js @@ -31,7 +31,7 @@ describe('Handles an Error in _error', () => { it('Handles error during client transition', async () => { const browser = await webdriver(port, '/') - await browser.elementByCss('a').click() + await browser.waitForElementByCss('a').click() await waitFor(1000) const html = await browser.eval('document.body.innerHTML') expect(html).toMatch(/internal server error/i) diff --git a/test/integration/invalid-href/pages/third.js b/test/integration/invalid-href/pages/third.js index 12daa4342716619e4f8f4dbe50f617e8f77c9e93..509367eab393da1fdf9ec4032d38ece3547fb499 100644 --- a/test/integration/invalid-href/pages/third.js +++ b/test/integration/invalid-href/pages/third.js @@ -3,7 +3,7 @@ import { useState } from 'react' const invalidLink = 'https://vercel.com/' -export default () => { +export default function Page() { const { query, ...router } = useRouter() const [isDone, setIsDone] = useState(false) const { method = 'push' } = query diff --git a/test/integration/invalid-href/test/index.test.js b/test/integration/invalid-href/test/index.test.js index b612671d88a38c70c824d5f3134e3bfdfdf78f08..cb95ed64945cd8c968f0516e116e10f18720244c 100644 --- a/test/integration/invalid-href/test/index.test.js +++ b/test/integration/invalid-href/test/index.test.js @@ -30,24 +30,18 @@ jest.retryTimes(0) const showsError = async (pathname, regex, click = false, isWarn = false) => { const browser = await webdriver(appPort, pathname) try { + // wait for page to be built and navigated to + await browser.waitForElementByCss('#click-me') if (isWarn) { await browser.eval(`(function() { window.warnLogs = [] var origWarn = window.console.warn - window.console.warn = function() { - var warnStr = '' - for (var i = 0; i < arguments.length; i++) { - if (i > 0) warnStr += ' '; - warnStr += arguments[i] - } - window.warnLogs.push(warnStr) - origWarn.apply(undefined, arguments) + window.console.warn = (...args) => { + window.warnLogs.push(args.join(' ')) + origWarn.apply(window.console, args) } })()`) } - // wait for page to be built and navigated to - await waitFor(3000) - await browser.waitForElementByCss('#click-me') if (click) { await browser.elementByCss('#click-me').click() await waitFor(500) @@ -70,6 +64,11 @@ const showsError = async (pathname, regex, click = false, isWarn = false) => { const noError = async (pathname, click = false) => { const browser = await webdriver(appPort, '/') try { + await check(async () => { + const appReady = await browser.eval('!!window.next.router') + console.log('app ready: ', appReady) + return appReady ? 'ready' : 'nope' + }, 'ready') await browser.eval(`(function() { window.caughtErrors = [] window.addEventListener('error', function (error) { @@ -80,8 +79,6 @@ const noError = async (pathname, click = false) => { }) window.next.router.replace('${pathname}') })()`) - // wait for page to be built and navigated to - await waitFor(3000) await browser.waitForElementByCss('#click-me') if (click) { await browser.elementByCss('#click-me').click() diff --git a/test/integration/query-with-encoding/test/index.test.js b/test/integration/query-with-encoding/test/index.test.js index 237a054c152a143ad0ecdb079472a26b90d6ef76..3b25cc0e5301674b742f4901a3db3dd35766109e 100644 --- a/test/integration/query-with-encoding/test/index.test.js +++ b/test/integration/query-with-encoding/test/index.test.js @@ -1,12 +1,6 @@ /* eslint-env jest */ -import { - nextBuild, - nextServer, - startApp, - stopApp, - waitFor, -} from 'next-test-utils' +import { nextBuild, nextServer, startApp, stopApp } from 'next-test-utils' import webdriver from 'next-webdriver' import { join } from 'path' @@ -46,12 +40,11 @@ describe('Query String with Encoding', () => { it('should have correct query on Router#push', async () => { const browser = await webdriver(appPort, '/') try { - await waitFor(2000) + await browser.waitForCondition('!!window.next.router') await browser.eval( `window.next.router.push({pathname:'/',query:{abc:'def\\n'}})` ) - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"abc":"def\\n"}') } finally { await browser.close() @@ -61,10 +54,8 @@ describe('Query String with Encoding', () => { it('should have correct query on simple client-side ', async () => { const browser = await webdriver(appPort, '/newline') try { - await waitFor(2000) - await browser.elementByCss('#hello-lf').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-lf').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"another":"hello\\n"}') } finally { await browser.close() @@ -74,10 +65,8 @@ describe('Query String with Encoding', () => { it('should have correct query on complex client-side ', async () => { const browser = await webdriver(appPort, '/newline') try { - await waitFor(2000) - await browser.elementByCss('#hello-complex').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-complex').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"complex":"yes\\n"}') } finally { await browser.close() @@ -99,12 +88,11 @@ describe('Query String with Encoding', () => { it('should have correct query on Router#push', async () => { const browser = await webdriver(appPort, '/') try { - await waitFor(2000) + await browser.waitForCondition('!!window.next.router') await browser.eval( `window.next.router.push({pathname:'/',query:{abc:'def '}})` ) - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"abc":"def "}') } finally { await browser.close() @@ -114,10 +102,8 @@ describe('Query String with Encoding', () => { it('should have correct query on simple client-side ', async () => { const browser = await webdriver(appPort, '/space') try { - await waitFor(2000) - await browser.elementByCss('#hello-space').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-space').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"another":"hello "}') } finally { await browser.close() @@ -127,10 +113,8 @@ describe('Query String with Encoding', () => { it('should have correct query on complex client-side ', async () => { const browser = await webdriver(appPort, '/space') try { - await waitFor(2000) - await browser.elementByCss('#hello-complex').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-complex').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"complex":"yes "}') } finally { await browser.close() @@ -152,12 +136,11 @@ describe('Query String with Encoding', () => { it('should have correct query on Router#push', async () => { const browser = await webdriver(appPort, '/') try { - await waitFor(2000) + await browser.waitForCondition('!!window.next.router') await browser.eval( `window.next.router.push({pathname:'/',query:{abc:'def%'}})` ) - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"abc":"def%"}') } finally { await browser.close() @@ -167,10 +150,8 @@ describe('Query String with Encoding', () => { it('should have correct query on simple client-side ', async () => { const browser = await webdriver(appPort, '/percent') try { - await waitFor(2000) - await browser.elementByCss('#hello-percent').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-percent').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"another":"hello%"}') } finally { await browser.close() @@ -180,10 +161,8 @@ describe('Query String with Encoding', () => { it('should have correct query on complex client-side ', async () => { const browser = await webdriver(appPort, '/percent') try { - await waitFor(2000) - await browser.elementByCss('#hello-complex').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-complex').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"complex":"yes%"}') } finally { await browser.close() @@ -205,12 +184,11 @@ describe('Query String with Encoding', () => { it('should have correct query on Router#push', async () => { const browser = await webdriver(appPort, '/') try { - await waitFor(2000) + await browser.waitForCondition('!!window.next.router') await browser.eval( `window.next.router.push({pathname:'/',query:{abc:'def+'}})` ) - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"abc":"def+"}') } finally { await browser.close() @@ -220,10 +198,8 @@ describe('Query String with Encoding', () => { it('should have correct query on simple client-side ', async () => { const browser = await webdriver(appPort, '/plus') try { - await waitFor(2000) - await browser.elementByCss('#hello-plus').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-plus').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"another":"hello+"}') } finally { await browser.close() @@ -233,10 +209,8 @@ describe('Query String with Encoding', () => { it('should have correct query on complex client-side ', async () => { const browser = await webdriver(appPort, '/plus') try { - await waitFor(2000) - await browser.elementByCss('#hello-complex').click() - await waitFor(1000) - const text = await browser.elementByCss('#query-content').text() + await browser.waitForElementByCss('#hello-complex').click() + const text = await browser.waitForElementByCss('#query-content').text() expect(text).toBe('{"complex":"yes+"}') } finally { await browser.close() diff --git a/test/integration/scroll-back-restoration/pages/another.js b/test/integration/scroll-back-restoration/pages/another.js index a37308e7d87796f6d70409ae7349469397370169..340b4403e3d8072c99109f032a67a9312809f3b4 100644 --- a/test/integration/scroll-back-restoration/pages/another.js +++ b/test/integration/scroll-back-restoration/pages/another.js @@ -1,10 +1,12 @@ import Link from 'next/link' -export default () => ( - <> -hi from another
- - to index - - > -) +export default function Page() { + return ( + <> +hi from another
+ + to index + + > + ) +} diff --git a/test/integration/serverless-runtime-configs/pages/_app.js b/test/integration/serverless-runtime-configs/pages/_app.js index 9d7f9f03f9d3bbc0be5fde7e5aa24c2b038c5e96..de6491178176753b5113fdfdc4d6006a064b2783 100644 --- a/test/integration/serverless-runtime-configs/pages/_app.js +++ b/test/integration/serverless-runtime-configs/pages/_app.js @@ -2,9 +2,11 @@ import getConfig from 'next/config' const config = getConfig() -export default ({ Component, pageProps }) => ( - <> -{JSON.stringify(config)}
-{JSON.stringify(config)}
+