From c5018423113337204727741845114dba5d503f6f Mon Sep 17 00:00:00 2001 From: Javi Velasco Date: Wed, 15 Jun 2022 00:31:33 +0200 Subject: [PATCH] Add test combining middleware & config rewrites (#37667) * Add test combining middleware & config rewrites * Add `afterFiles` test * update some tests * Apply suggestions from code review Co-authored-by: JJ Kasper --- packages/next/server/base-server.ts | 9 +++-- .../e2e/middleware-general/app/next.config.js | 2 +- .../e2e/middleware-general/test/index.test.ts | 10 ++++-- .../middleware-redirects/test/index.test.ts | 3 +- .../e2e/middleware-rewrites/app/middleware.js | 10 ++++++ .../middleware-rewrites/app/next.config.js | 17 +++++++++ .../middleware-rewrites/app/pages/index.js | 12 +++++++ .../middleware-rewrites/test/index.test.ts | 36 +++++++++++++++++++ 8 files changed, 91 insertions(+), 8 deletions(-) diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 16b9d08cdf47a..fd85219d260c0 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -1216,6 +1216,8 @@ export default abstract class Server { const isDataReq = !!query.__nextDataReq && (isSSG || hasServerProps || isServerComponent) + delete query.__nextDataReq + // normalize req.url for SSG paths as it is not exposed // to getStaticProps and the asPath should not expose /_next/data if ( @@ -1227,7 +1229,11 @@ export default abstract class Server { req.url = this.stripNextDataPath(req.url) } - if (!!query.__nextDataReq) { + if ( + !isServerComponent && + !!req.headers['x-nextjs-data'] && + (!res.statusCode || res.statusCode === 200) + ) { res.setHeader( 'x-nextjs-matched-path', `${query.__nextLocale ? `/${query.__nextLocale}` : ''}${pathname}` @@ -1243,7 +1249,6 @@ export default abstract class Server { return null } } - delete query.__nextDataReq // Don't delete query.__flight__ yet, it still needs to be used in renderToHTML later const isFlightRequest = Boolean( diff --git a/test/e2e/middleware-general/app/next.config.js b/test/e2e/middleware-general/app/next.config.js index ea7f71ed65d6f..bd50923f44318 100644 --- a/test/e2e/middleware-general/app/next.config.js +++ b/test/e2e/middleware-general/app/next.config.js @@ -7,7 +7,7 @@ module.exports = { return [ { source: '/redirect-1', - destination: '/somewhere-else', + destination: '/somewhere/else', permanent: false, }, ] diff --git a/test/e2e/middleware-general/test/index.test.ts b/test/e2e/middleware-general/test/index.test.ts index 9832df15e5a77..b9c2d7776709e 100644 --- a/test/e2e/middleware-general/test/index.test.ts +++ b/test/e2e/middleware-general/test/index.test.ts @@ -129,14 +129,14 @@ describe('Middleware Runtime', () => { ) expect(res.status).toBe(307) expect(new URL(res.headers.get('location'), 'http://n').pathname).toBe( - '/somewhere-else' + '/somewhere/else' ) const browser = await webdriver(next.url, `${locale}/`) await browser.eval(`next.router.push('/redirect-1')`) await check(async () => { const pathname = await browser.eval('location.pathname') - return pathname === '/somewhere-else' ? 'success' : pathname + return pathname === '/somewhere/else' ? 'success' : pathname }, 'success') }) @@ -146,11 +146,13 @@ describe('Middleware Runtime', () => { expect(await res.text()).toContain('Hello World') const browser = await webdriver(next.url, `${locale}/`) + await browser.eval('window.beforeNav = 1') await browser.eval(`next.router.push('/rewrite-1')`) await check(async () => { const content = await browser.eval('document.documentElement.innerHTML') return content.includes('Hello World') ? 'success' : content }, 'success') + expect(await browser.eval('window.beforeNav')).toBe(1) }) it('should rewrite correctly for non-SSG/SSP page', async () => { @@ -365,7 +367,9 @@ describe('Middleware Runtime', () => { const res = await fetchViaHTTP(next.url, `/ssr-page`) const dataRes = await fetchViaHTTP( next.url, - `/_next/data/${next.buildId}/en/ssr-page.json` + `/_next/data/${next.buildId}/en/ssr-page.json`, + undefined, + { headers: { 'x-nextjs-data': '1' } } ) const json = await dataRes.json() expect(json.pageProps.message).toEqual('Bye Cruel World') diff --git a/test/e2e/middleware-redirects/test/index.test.ts b/test/e2e/middleware-redirects/test/index.test.ts index d4c22e20763f6..3a89832787381 100644 --- a/test/e2e/middleware-redirects/test/index.test.ts +++ b/test/e2e/middleware-redirects/test/index.test.ts @@ -146,8 +146,7 @@ describe('Middleware Redirect', () => { const browser = await webdriver(next.url, `${locale}`) await browser.elementByCss('#link-to-api-with-locale').click() await browser.waitForCondition('window.location.pathname === "/api/ok"') - const body = await browser.elementByCss('body').text() - expect(body).toBe('ok') + await check(() => browser.elementByCss('body').text(), 'ok') }) } }) diff --git a/test/e2e/middleware-rewrites/app/middleware.js b/test/e2e/middleware-rewrites/app/middleware.js index b1a97d4e2e1da..6042a2c06e6c3 100644 --- a/test/e2e/middleware-rewrites/app/middleware.js +++ b/test/e2e/middleware-rewrites/app/middleware.js @@ -22,6 +22,16 @@ export async function middleware(request) { ) } + if (url.pathname === '/rewrite-to-beforefiles-rewrite') { + url.pathname = '/beforefiles-rewrite' + return NextResponse.rewrite(url) + } + + if (url.pathname === '/rewrite-to-afterfiles-rewrite') { + url.pathname = '/afterfiles-rewrite' + return NextResponse.rewrite(url) + } + if (url.pathname.startsWith('/to-blog')) { const slug = url.pathname.split('/').pop() url.pathname = `/fallback-true-blog/${slug}` diff --git a/test/e2e/middleware-rewrites/app/next.config.js b/test/e2e/middleware-rewrites/app/next.config.js index a8c7c7249f65f..80afb868a906f 100644 --- a/test/e2e/middleware-rewrites/app/next.config.js +++ b/test/e2e/middleware-rewrites/app/next.config.js @@ -3,4 +3,21 @@ module.exports = { locales: ['ja', 'en', 'fr', 'es'], defaultLocale: 'en', }, + rewrites() { + return { + beforeFiles: [ + { + source: '/beforefiles-rewrite', + destination: '/ab-test/a', + }, + ], + afterFiles: [ + { + source: '/afterfiles-rewrite', + destination: '/ab-test/b', + }, + ], + fallback: [], + } + }, } diff --git a/test/e2e/middleware-rewrites/app/pages/index.js b/test/e2e/middleware-rewrites/app/pages/index.js index 9ab571666f8a9..554e38a7115fd 100644 --- a/test/e2e/middleware-rewrites/app/pages/index.js +++ b/test/e2e/middleware-rewrites/app/pages/index.js @@ -15,6 +15,18 @@ export default function Home() { Rewrite me to about
+ + + Rewrite me to beforeFiles Rewrite + + +
+ + + Rewrite me to afterFiles Rewrite + + +
Rewrite me to Vercel diff --git a/test/e2e/middleware-rewrites/test/index.test.ts b/test/e2e/middleware-rewrites/test/index.test.ts index 917d7ee164f69..3a6082730307d 100644 --- a/test/e2e/middleware-rewrites/test/index.test.ts +++ b/test/e2e/middleware-rewrites/test/index.test.ts @@ -24,6 +24,7 @@ describe('Middleware Rewrite', () => { tests() testsWithLocale() testsWithLocale('/fr') + function tests() { // TODO: middleware effect headers aren't available here it.skip('includes the locale in rewrites by default', async () => { @@ -271,6 +272,41 @@ describe('Middleware Rewrite', () => { await browser.elementByCss('#link-en2').click() await browser.waitForElementByCss('.en') }) + + it('should allow to rewrite to a `beforeFiles` rewrite config', async () => { + const res = await fetchViaHTTP( + next.url, + `/rewrite-to-beforefiles-rewrite` + ) + expect(res.status).toBe(200) + expect(await res.text()).toContain('Welcome Page A') + + const browser = await webdriver(next.url, '/') + await browser.elementByCss('#rewrite-to-beforefiles-rewrite').click() + await check( + () => browser.eval('document.documentElement.innerHTML'), + /Welcome Page A/ + ) + expect(await browser.eval('window.location.pathname')).toBe( + `/rewrite-to-beforefiles-rewrite` + ) + }) + + it('should allow to rewrite to a `afterFiles` rewrite config', async () => { + const res = await fetchViaHTTP(next.url, `/rewrite-to-afterfiles-rewrite`) + expect(res.status).toBe(200) + expect(await res.text()).toContain('Welcome Page B') + + const browser = await webdriver(next.url, '/') + await browser.elementByCss('#rewrite-to-afterfiles-rewrite').click() + await check( + () => browser.eval('document.documentElement.innerHTML'), + /Welcome Page B/ + ) + expect(await browser.eval('window.location.pathname')).toBe( + `/rewrite-to-afterfiles-rewrite` + ) + }) } function testsWithLocale(locale = '') {