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');