diff --git a/test/integration/query-with-encoding/pages/index.js b/test/integration/query-with-encoding/pages/index.js new file mode 100644 index 000000000000000..5abbac3c14b81af --- /dev/null +++ b/test/integration/query-with-encoding/pages/index.js @@ -0,0 +1,7 @@ +const Index = ({ query }) => ( +
{JSON.stringify(query)}
+) + +Index.getInitialProps = ({ query }) => ({ query }) + +export default Index diff --git a/test/integration/query-with-encoding/pages/newline.js b/test/integration/query-with-encoding/pages/newline.js new file mode 100644 index 000000000000000..f54a15a0ec78083 --- /dev/null +++ b/test/integration/query-with-encoding/pages/newline.js @@ -0,0 +1,15 @@ +import Link from 'next/link' + +const Another = () => ( +
+ + Hello LF + +
+ + Hello Complex + +
+) + +export default Another diff --git a/test/integration/query-with-encoding/pages/percent.js b/test/integration/query-with-encoding/pages/percent.js new file mode 100644 index 000000000000000..293f399e3dad69c --- /dev/null +++ b/test/integration/query-with-encoding/pages/percent.js @@ -0,0 +1,15 @@ +import Link from 'next/link' + +const Another = () => ( +
+ + Hello % + +
+ + Hello Complex + +
+) + +export default Another diff --git a/test/integration/query-with-encoding/pages/space.js b/test/integration/query-with-encoding/pages/space.js new file mode 100644 index 000000000000000..5c988ec39709997 --- /dev/null +++ b/test/integration/query-with-encoding/pages/space.js @@ -0,0 +1,15 @@ +import Link from 'next/link' + +const Another = () => ( +
+ + Hello Space + +
+ + Hello Complex + +
+) + +export default Another diff --git a/test/integration/query-with-encoding/test/index.test.js b/test/integration/query-with-encoding/test/index.test.js new file mode 100644 index 000000000000000..32309b8a7331237 --- /dev/null +++ b/test/integration/query-with-encoding/test/index.test.js @@ -0,0 +1,193 @@ +/* eslint-env jest */ +/* global jasmine */ +import { + nextBuild, + nextServer, + startApp, + stopApp, + waitFor, +} from 'next-test-utils' +import webdriver from 'next-webdriver' +import { join } from 'path' + +jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 2 + +const appDir = join(__dirname, '..') + +let appPort +let app +let server + +describe('Query String with Encoding', () => { + beforeAll(async () => { + await nextBuild(appDir) + app = nextServer({ + dir: join(__dirname, '../'), + dev: false, + quiet: true, + }) + + server = await startApp(app) + appPort = server.address().port + }) + afterAll(() => stopApp(server)) + + describe('new line', () => { + it('should have correct query on SSR', async () => { + const browser = await webdriver(appPort, '/?test=abc%0A') + try { + const text = await browser.elementByCss('#query-content').text() + expect(text).toBe('{"test":"abc\\n"}') + } finally { + await browser.close() + } + }) + + it('should have correct query on Router#push', async () => { + const browser = await webdriver(appPort, '/') + try { + await waitFor(2000) + await browser.eval( + `window.next.router.push({pathname:'/',query:{abc:'def\\n'}})` + ) + await waitFor(1000) + const text = await browser.elementByCss('#query-content').text() + expect(text).toBe('{"abc":"def\\n"}') + } finally { + await browser.close() + } + }) + + 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() + expect(text).toBe('{"another":"hello\\n"}') + } finally { + await browser.close() + } + }) + + 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() + expect(text).toBe('{"complex":"yes\\n"}') + } finally { + await browser.close() + } + }) + }) + + describe('trailing space', () => { + it('should have correct query on SSR', async () => { + const browser = await webdriver(appPort, '/?test=abc%20') + try { + const text = await browser.elementByCss('#query-content').text() + expect(text).toBe('{"test":"abc "}') + } finally { + await browser.close() + } + }) + + it('should have correct query on Router#push', async () => { + const browser = await webdriver(appPort, '/') + try { + await waitFor(2000) + await browser.eval( + `window.next.router.push({pathname:'/',query:{abc:'def '}})` + ) + await waitFor(1000) + const text = await browser.elementByCss('#query-content').text() + expect(text).toBe('{"abc":"def "}') + } finally { + await browser.close() + } + }) + + 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() + expect(text).toBe('{"another":"hello "}') + } finally { + await browser.close() + } + }) + + 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() + expect(text).toBe('{"complex":"yes "}') + } finally { + await browser.close() + } + }) + }) + + describe('percent', () => { + it('should have correct query on SSR', async () => { + const browser = await webdriver(appPort, '/?test=abc%25') + try { + const text = await browser.elementByCss('#query-content').text() + expect(text).toBe('{"test":"abc%"}') + } finally { + await browser.close() + } + }) + + it('should have correct query on Router#push', async () => { + const browser = await webdriver(appPort, '/') + try { + await waitFor(2000) + await browser.eval( + `window.next.router.push({pathname:'/',query:{abc:'def%'}})` + ) + await waitFor(1000) + const text = await browser.elementByCss('#query-content').text() + expect(text).toBe('{"abc":"def%"}') + } finally { + await browser.close() + } + }) + + 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() + expect(text).toBe('{"another":"hello%"}') + } finally { + await browser.close() + } + }) + + 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() + expect(text).toBe('{"complex":"yes%"}') + } finally { + await browser.close() + } + }) + }) +})