mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
Make sure props.url is immutable (#4352)
* Make sure props.url is immutable * Add test for immutable url * Match object instead of string
This commit is contained in:
parent
2c3f40600c
commit
449f38daa7
|
@ -93,18 +93,20 @@ const warnUrl = execOnce(() => {
|
||||||
})
|
})
|
||||||
|
|
||||||
export function createUrl (router) {
|
export function createUrl (router) {
|
||||||
|
// This is to make sure we don't references the router object at call time
|
||||||
|
const {pathname, asPath, query} = router
|
||||||
return {
|
return {
|
||||||
get query () {
|
get query () {
|
||||||
warnUrl()
|
warnUrl()
|
||||||
return router.query
|
return query
|
||||||
},
|
},
|
||||||
get pathname () {
|
get pathname () {
|
||||||
warnUrl()
|
warnUrl()
|
||||||
return router.pathname
|
return pathname
|
||||||
},
|
},
|
||||||
get asPath () {
|
get asPath () {
|
||||||
warnUrl()
|
warnUrl()
|
||||||
return router.asPath
|
return asPath
|
||||||
},
|
},
|
||||||
back: () => {
|
back: () => {
|
||||||
warnUrl()
|
warnUrl()
|
||||||
|
|
37
test/integration/basic/pages/nav/url-prop-change.js
Normal file
37
test/integration/basic/pages/nav/url-prop-change.js
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import React from 'react'
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
export default class UrlPropChange extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props)
|
||||||
|
this.state = {
|
||||||
|
previousUrl: {},
|
||||||
|
url: props.url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps (nextProps) {
|
||||||
|
this.setState(() => {
|
||||||
|
return {
|
||||||
|
previousUrl: this.props.url,
|
||||||
|
url: nextProps.url
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const {previousUrl, url} = this.state
|
||||||
|
return <div>
|
||||||
|
Current:
|
||||||
|
<div id='url-result'>
|
||||||
|
{JSON.stringify(url)}
|
||||||
|
</div>
|
||||||
|
<br /><br />
|
||||||
|
Previous:
|
||||||
|
<div id='previous-url-result'>
|
||||||
|
{JSON.stringify(previousUrl)}
|
||||||
|
</div>
|
||||||
|
<Link href='/nav/url-prop-change?added=yes'><a id='add-query'>Add querystring</a></Link>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,6 +33,20 @@ export default (context, render) => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('With url property', () => {
|
||||||
|
it('Should keep immutable pathname, asPath and query', async () => {
|
||||||
|
const browser = await webdriver(context.appPort, '/nav/url-prop-change')
|
||||||
|
await browser.elementByCss('#add-query').click()
|
||||||
|
const urlResult = await browser.elementByCss('#url-result').text()
|
||||||
|
const previousUrlResult = await browser.elementByCss('#previous-url-result').text()
|
||||||
|
|
||||||
|
expect(JSON.parse(urlResult)).toMatchObject({'query': {'added': 'yes'}, 'pathname': '/nav/url-prop-change', 'asPath': '/nav/url-prop-change?added=yes'})
|
||||||
|
expect(JSON.parse(previousUrlResult)).toMatchObject({'query': {}, 'pathname': '/nav/url-prop-change', 'asPath': '/nav/url-prop-change'})
|
||||||
|
|
||||||
|
browser.close()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('with <a/> tag inside the <Link />', () => {
|
describe('with <a/> tag inside the <Link />', () => {
|
||||||
it('should navigate the page', async () => {
|
it('should navigate the page', async () => {
|
||||||
const browser = await webdriver(context.appPort, '/nav/about')
|
const browser = await webdriver(context.appPort, '/nav/about')
|
||||||
|
|
|
@ -52,6 +52,7 @@ describe('Basic Features', () => {
|
||||||
renderViaHTTP(context.appPort, '/nav/redirect'),
|
renderViaHTTP(context.appPort, '/nav/redirect'),
|
||||||
renderViaHTTP(context.appPort, '/nav/as-path'),
|
renderViaHTTP(context.appPort, '/nav/as-path'),
|
||||||
renderViaHTTP(context.appPort, '/nav/as-path-using-router'),
|
renderViaHTTP(context.appPort, '/nav/as-path-using-router'),
|
||||||
|
renderViaHTTP(context.appPort, '/nav/url-prop-change'),
|
||||||
|
|
||||||
renderViaHTTP(context.appPort, '/nested-cdm/index'),
|
renderViaHTTP(context.appPort, '/nested-cdm/index'),
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue