Skip to content

Commit c50a621

Browse files
committed
Add some simple UI tests with enzyme
1 parent cc00f21 commit c50a621

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

Diff for: package.json

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"babel-preset-react": "^6.11.1",
5454
"cross-env": "^3.0.0",
5555
"css-loader": "0.x.x",
56+
"enzyme": "^2.6.0",
5657
"eslint": "^3.2.2",
5758
"eslint-config-blue-hour": "0.x.x",
5859
"eslint-loader": "^1.5.0",
@@ -63,6 +64,8 @@
6364
"gh-pages": "^0.12.0",
6465
"html-webpack-plugin": "^2.22.0",
6566
"jasmine-core": "^2.4.1",
67+
"jasmine-enzyme": "^2.0.0",
68+
"json-loader": "^0.5.4",
6669
"karma": "^1.1.2",
6770
"karma-jasmine": "^1.0.2",
6871
"karma-jasmine-diff-reporter": "^0.6.2",
@@ -75,6 +78,7 @@
7578
"postcss-loader": "^1.1.1",
7679
"react": "^15.3.0",
7780
"react-addons-shallow-compare": "^15.3.0",
81+
"react-addons-test-utils": "^15.4.1",
7882
"react-dom": "^15.3.0",
7983
"react-hot-loader": "^1.3.0",
8084
"rimraf": "^2.5.3",

Diff for: src/react-sortable-tree.test.js

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/* eslint-disable import/no-extraneous-dependencies */
2+
import React from 'react';
3+
import { mount } from 'enzyme';
4+
import jasmineEnzyme from 'jasmine-enzyme';
5+
6+
import { AutoSizer } from 'react-virtualized';
7+
import TreeNode from './tree-node';
8+
9+
import SortableTree from './react-sortable-tree';
10+
11+
describe('<SortableTree />', () => {
12+
beforeEach(() => {
13+
jasmineEnzyme(); // Add extra matchers like .toHaveStyle() to jasmine
14+
15+
// Keep react-virtualized's AutoSizer component from hiding everything in
16+
// enzyme's rendering environment (which has no height/width, apparently)
17+
spyOn(AutoSizer.prototype, 'render').and.callFake(function renderOverride() {
18+
return (
19+
<div ref={this._setRef}>
20+
{this.props.children({ width: 200, height: 99999 })}
21+
</div>
22+
);
23+
});
24+
});
25+
26+
it('should render nodes for flat data', () => {
27+
const wrapper = mount(
28+
<SortableTree
29+
treeData={[]}
30+
onChange={() => {}}
31+
/>
32+
);
33+
34+
// No nodes
35+
expect(wrapper.find(TreeNode).length).toEqual(0);
36+
37+
// Single node
38+
wrapper.setProps({
39+
treeData: [{}],
40+
});
41+
expect(wrapper.find(TreeNode).length).toEqual(1);
42+
43+
// Two nodes
44+
wrapper.setProps({
45+
treeData: [{}, {}],
46+
});
47+
expect(wrapper.find(TreeNode).length).toEqual(2);
48+
});
49+
50+
it('should render nodes for nested, expanded data', () => {
51+
const wrapper = mount(
52+
<SortableTree
53+
treeData={[{ expanded: true, children: [{}] }]}
54+
onChange={() => {}}
55+
/>
56+
);
57+
58+
// Single Nested
59+
expect(wrapper.find(TreeNode).length).toEqual(2);
60+
61+
// Double Nested
62+
wrapper.setProps({
63+
treeData: [
64+
{ expanded: true, children: [{ expanded: true, children: [{}] }] },
65+
],
66+
});
67+
expect(wrapper.find(TreeNode).length).toEqual(3);
68+
69+
// 2x Double Nested Siblings
70+
wrapper.setProps({
71+
treeData: [
72+
{ expanded: true, children: [{ expanded: true, children: [{}] }] },
73+
{ expanded: true, children: [{ expanded: true, children: [{}] }] },
74+
],
75+
});
76+
expect(wrapper.find(TreeNode).length).toEqual(6);
77+
});
78+
79+
it('should render nodes for nested, collapsed data', () => {
80+
const wrapper = mount(
81+
<SortableTree
82+
treeData={[{ expanded: false, children: [{}] }]}
83+
onChange={() => {}}
84+
/>
85+
);
86+
87+
// Single Nested
88+
expect(wrapper.find(TreeNode).length).toEqual(1);
89+
90+
// Double Nested
91+
wrapper.setProps({
92+
treeData: [
93+
{ expanded: false, children: [{ expanded: false, children: [{}] }] },
94+
],
95+
});
96+
expect(wrapper.find(TreeNode).length).toEqual(1);
97+
98+
// 2x Double Nested Siblings, top level of first expanded
99+
wrapper.setProps({
100+
treeData: [
101+
{ expanded: true, children: [{ expanded: false, children: [{}] }] },
102+
{ expanded: false, children: [{ expanded: false, children: [{}] }] },
103+
],
104+
});
105+
expect(wrapper.find(TreeNode).length).toEqual(3);
106+
});
107+
108+
it('should change height according to rowHeight prop', () => {
109+
const wrapper = mount(
110+
<SortableTree
111+
treeData={[{ title: 'a' }]}
112+
onChange={() => {}}
113+
rowHeight={12}
114+
/>
115+
);
116+
117+
expect(wrapper.find(TreeNode)).toHaveStyle('height', 12);
118+
});
119+
});

Diff for: webpack.config.test.babel.js

+6
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,14 @@ module.exports = {
6464
],
6565
include: path.join(__dirname, 'src')
6666
},
67+
{ test: /\.json$/, loader: 'json' }, // For the cheerio dependency of enzyme
6768
],
6869
},
70+
externals: { // All of these are for enzyme
71+
'react/addons': true,
72+
'react/lib/ExecutionEnvironment': true,
73+
'react/lib/ReactContext': true,
74+
},
6975
devServer: {
7076
contentBase: 'build',
7177
port: 3001

0 commit comments

Comments
 (0)