Skip to content

Commit e394d14

Browse files
committed
More tests
1 parent 59fa140 commit e394d14

File tree

12 files changed

+139
-707
lines changed

12 files changed

+139
-707
lines changed

modules/components/__tests__/DefaultRoute-test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
var assert = require('assert');
12
var expect = require('expect');
23
var React = require('react/addons');
34
var ReactTestUtils = React.addons.TestUtils;
45
var RouteContainer = require('../../mixins/RouteContainer');
6+
var TransitionHandler = require('../../mixins/TransitionHandler');
7+
var PathStore = require('../../stores/PathStore');
58
var Route = require('../Route');
69
var DefaultRoute = require('../DefaultRoute');
710

@@ -57,3 +60,40 @@ describe('A DefaultRoute', function () {
5760
});
5861
});
5962
});
63+
64+
describe('when no child routes match a URL, but the parent\'s path matches', function () {
65+
var App = React.createClass({
66+
mixins: [ TransitionHandler ],
67+
render: function () {
68+
return React.DOM.div();
69+
}
70+
});
71+
72+
var component, rootRoute, defaultRoute;
73+
beforeEach(function () {
74+
component = ReactTestUtils.renderIntoDocument(
75+
App({ location: 'none' },
76+
rootRoute = Route({ name: 'user', path: '/users/:id', handler: App },
77+
Route({ name: 'home', path: '/users/:id/home', handler: App }),
78+
// Make it the middle sibling to test order independence.
79+
defaultRoute = DefaultRoute({ handler: App }),
80+
Route({ name: 'news', path: '/users/:id/news', handler: App })
81+
)
82+
)
83+
)
84+
});
85+
86+
afterEach(function () {
87+
React.unmountComponentAtNode(component.getDOMNode());
88+
// For some reason unmountComponentAtNode doesn't call componentWillUnmount :/
89+
PathStore.removeAllChangeListeners();
90+
});
91+
92+
it('matches the default route', function () {
93+
var matches = component.match('/users/5');
94+
assert(matches);
95+
expect(matches.length).toEqual(2);
96+
expect(matches[0].route).toBe(rootRoute);
97+
expect(matches[1].route).toBe(defaultRoute);
98+
});
99+
});

modules/components/__tests__/NotFoundRoute-test.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
var assert = require('assert');
12
var expect = require('expect');
23
var React = require('react/addons');
34
var ReactTestUtils = React.addons.TestUtils;
45
var RouteContainer = require('../../mixins/RouteContainer');
6+
var TransitionHandler = require('../../mixins/TransitionHandler');
7+
var PathStore = require('../../stores/PathStore');
58
var Route = require('../Route');
69
var NotFoundRoute = require('../NotFoundRoute');
710

8-
describe('NotFoundRoute', function () {
11+
describe('A NotFoundRoute', function () {
912
it('has a null path', function () {
1013
expect(NotFoundRoute({ path: '/' }).props.path).toBe(null);
1114
});
@@ -57,3 +60,40 @@ describe('NotFoundRoute', function () {
5760
});
5861
});
5962
});
63+
64+
describe('when no child routes match a URL, but the beginning of the parent\'s path matches', function () {
65+
var App = React.createClass({
66+
mixins: [ TransitionHandler ],
67+
render: function () {
68+
return React.DOM.div();
69+
}
70+
});
71+
72+
var component, rootRoute, notFoundRoute;
73+
beforeEach(function () {
74+
component = ReactTestUtils.renderIntoDocument(
75+
App({ location: 'none' },
76+
rootRoute = Route({ name: 'user', path: '/users/:id', handler: App },
77+
Route({ name: 'home', path: '/users/:id/home', handler: App }),
78+
// Make it the middle sibling to test order independence.
79+
notFoundRoute = NotFoundRoute({ handler: App }),
80+
Route({ name: 'news', path: '/users/:id/news', handler: App })
81+
)
82+
)
83+
)
84+
});
85+
86+
afterEach(function () {
87+
React.unmountComponentAtNode(component.getDOMNode());
88+
// For some reason unmountComponentAtNode doesn't call componentWillUnmount :/
89+
PathStore.removeAllChangeListeners();
90+
});
91+
92+
it('matches the NotFoundRoute', function () {
93+
var matches = component.match('/users/5/not-found');
94+
assert(matches);
95+
expect(matches.length).toEqual(2);
96+
expect(matches[0].route).toBe(rootRoute);
97+
expect(matches[1].route).toBe(notFoundRoute);
98+
});
99+
});
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
var expect = require('expect');
2+
var React = require('react/addons');
3+
var ReactTestUtils = React.addons.TestUtils;
4+
var Promise = require('../../utils/Promise');
5+
var AsyncState = require('../AsyncState');
6+
7+
describe('AsyncState', function () {
8+
9+
describe('a component that fetches part of its state asynchronously', function () {
10+
var User = React.createClass({
11+
mixins: [ AsyncState ],
12+
statics: {
13+
getInitialAsyncState: function (params, query, setState) {
14+
setState({
15+
immediateValue: 'immediate'
16+
});
17+
18+
setTimeout(function () {
19+
setState({
20+
delayedValue: 'delayed'
21+
});
22+
});
23+
24+
return {
25+
promisedValue: Promise.resolve('promised')
26+
};
27+
}
28+
},
29+
render: function () {
30+
return null;
31+
}
32+
});
33+
34+
var component;
35+
beforeEach(function () {
36+
component = ReactTestUtils.renderIntoDocument(User());
37+
});
38+
39+
afterEach(function () {
40+
React.unmountComponentAtNode(component.getDOMNode());
41+
});
42+
43+
it('resolves all state variables correctly', function (done) {
44+
setTimeout(function () {
45+
expect(component.state.immediateValue).toEqual('immediate');
46+
expect(component.state.delayedValue).toEqual('delayed');
47+
expect(component.state.promisedValue).toEqual('promised');
48+
done();
49+
}, 20);
50+
});
51+
});
52+
53+
});

modules/stores/PathStore.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ var PathStore = {
2424
_events.removeListener(CHANGE_EVENT, listener);
2525
},
2626

27+
removeAllChangeListeners: function () {
28+
_events.removeAllListeners(CHANGE_EVENT);
29+
},
30+
2731
/**
2832
* Returns the current URL path.
2933
*/

specs/ActiveDelegate.spec.js

Lines changed: 0 additions & 89 deletions
This file was deleted.

specs/AsyncState.spec.js

Lines changed: 0 additions & 46 deletions
This file was deleted.

specs/DefaultRoute.spec.js

Lines changed: 0 additions & 77 deletions
This file was deleted.

0 commit comments

Comments
 (0)