diff --git a/docs/api/components/Redirect.md b/docs/api/components/Redirect.md index a31222a0d9..a1146bc85f 100644 --- a/docs/api/components/Redirect.md +++ b/docs/api/components/Redirect.md @@ -15,6 +15,16 @@ to `*` so you can redirect anything not found to somewhere else. The `name` of the route you want to redirect to. +### `params` + +By default, the parameters will just pass through to the new route, but +you can specify them if you need to (usually you shouldn't). + +### `query` + +By default, the query parameters will just pass through to the new +route, but you can specify them if you need to (usually you shouldn't). + Example ------- @@ -40,8 +50,12 @@ Example + + + + ``` diff --git a/modules/components/Redirect.js b/modules/components/Redirect.js index 852a81aa2e..54451235ad 100644 --- a/modules/components/Redirect.js +++ b/modules/components/Redirect.js @@ -1,11 +1,11 @@ var React = require('react'); var Route = require('./Route'); -function createRedirectHandler(to) { +function createRedirectHandler(to, _params, _query) { return React.createClass({ statics: { willTransitionTo: function (transition, params, query) { - transition.redirect(to, params, query); + transition.redirect(to, _params || params, _query || query); } }, @@ -23,7 +23,7 @@ function Redirect(props) { return Route({ name: props.name, path: props.from || props.path || '*', - handler: createRedirectHandler(props.to) + handler: createRedirectHandler(props.to, props.params, props.query) }); } diff --git a/modules/components/__tests__/Redirect-test.js b/modules/components/__tests__/Redirect-test.js new file mode 100644 index 0000000000..e044429d79 --- /dev/null +++ b/modules/components/__tests__/Redirect-test.js @@ -0,0 +1,66 @@ +var assert = require('assert'); +var expect = require('expect'); +var React = require('react/addons'); +var Route = require('../Route'); +var Redirect = require('../Redirect'); +var Routes = require('../Routes'); + +describe('a Redirect', function () { + + it('redirects from old to new', function (done) { + var descriptor = Redirect({ from: 'old', to: 'new' }); + + expect(descriptor.props.path).toEqual('old'); + + var fakeTransition = { + redirect: function(to) { + expect(to).toEqual('new'); + done(); + } + }; + + descriptor.props.handler.willTransitionTo(fakeTransition); + }); + + it('uses params and query from current path', function (done) { + var descriptor = Redirect({ from: 'old', to: 'new' }); + var expectedParams = { foo: 'bar' }; + var expectedQuery = { baz: 'qux' }; + + var fakeTransition = { + redirect: function(to, params, query) { + expect(params).toEqual(expectedParams); + expect(query).toEqual(expectedQuery); + done(); + } + }; + + descriptor.props.handler.willTransitionTo(fakeTransition, expectedParams, expectedQuery); + }); + + it('uses params and query from the Redirect definition', function (done) { + var expectedParams = { foo: 'bar' }; + var expectedQuery = { baz: 'qux' }; + var fakePathParams = { hooba: 'scooba' }; + var fakePathQuery = { doobie: 'scoobie' }; + + var descriptor = Redirect({ + from: 'old', + to: 'new', + params: expectedParams, + query: expectedQuery + }); + + var fakeTransition = { + redirect: function(to, params, query) { + expect(params).toEqual(expectedParams); + expect(query).toEqual(expectedQuery); + done(); + } + }; + + descriptor.props.handler.willTransitionTo(fakeTransition, fakePathParams, fakePathQuery); + }); + +}); + diff --git a/tests.js b/tests.js index 0ce98464f3..f6073af225 100644 --- a/tests.js +++ b/tests.js @@ -2,6 +2,7 @@ require('./modules/components/__tests__/DefaultRoute-test'); require('./modules/components/__tests__/Link-test'); require('./modules/components/__tests__/NotFoundRoute-test'); require('./modules/components/__tests__/Routes-test'); +require('./modules/components/__tests__/Redirect-test'); require('./modules/mixins/__tests__/ActiveContext-test'); require('./modules/mixins/__tests__/LocationContext-test');