Skip to content

Commit c59fcec

Browse files
authored
chore: Tests revamp (#102)
* test: 💍 added basic tree rendering tests this test if the tree renders the expected html for a custom renderer, this will make sure that actual errors are caught unlike shallow rendering all components * test: 💍 minor change in exposed mock data * chore: 🤖 updated jest to latest version * test: 💍 moved export from sample data * chore: 🤖 finished moving sample data * test: 💍 added integration tests to Expandable Renderer This tests assert that when a Expandable Renderer is used in a simple tree nodes collapse and expand as expected * chore: 🤖 moved deletable nodes samples inside file * chore: 🤖 remove unused files * test: 💍 added NodeDiff class added a class that helps figure out the node changes inside the tree when a certain action is executed * test: 💍 added Deletable tests and small restructure * test: 💍 added tree integration tests to Favorite Renderer * chore: 🤖 re-organized tree tests * chore: 🤖 remove old Tree tests * test: 💍 added Tree extensions tests * test: 💍 removed old TreeContainer tests * test: 💍 moved Deletable renderer tests to react-testing-library * test: 💍 moved Expandable tests to use react-testing-library * test: 💍 moved Favorite renderer tests to use react-testing-lib * test: 💍 moved DefaultGroupRenderer tests to react-testing-lib * test: 💍 moved FilteringContainer tests to use react-testing-lib * chore: 🤖 removed enzyme from project * test: 💍 added integration tests for Tree filtering no groups * test: 💍 finished filtering integration tests
1 parent 3a0a06b commit c59fcec

23 files changed

+3356
-1867
lines changed

__mocks__/react-virtualized.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React from 'react';
2+
3+
export class CellMeasurerCache {}
4+
5+
export const AutoSizer = ({children}) => <React.Fragment>{children({width: 1000, height: 1000})}</React.Fragment>;
6+
// const mockInifiteLoader = ({children}) => (
7+
// <React.Fragment>{children({registerChild: jest.fn(), onRowsRendered: jest.fn()})}</React.Fragment>
8+
// );
9+
10+
export const CellMeasurer = ({children}) => <React.Fragment>{children({measure: jest.fn()})}</React.Fragment>;
11+
12+
export const List = p =>
13+
Array.from({length: p.rowCount}).map((_, i) =>
14+
p.rowRenderer({
15+
key: String(i),
16+
columnIndex: 0,
17+
index: i,
18+
rowIndex: i,
19+
isScrolling: false,
20+
isVisible: true,
21+
parent: {},
22+
style: {},
23+
}),
24+
);

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
},
2424
"dependencies": {
2525
"classnames": "^2.2.5",
26+
"jest": "^24.8.0",
2627
"lodash": "^4.17.4",
2728
"lodash.debounce": "^4.0.8",
2829
"lodash.findindex": "^4.6.0",
@@ -44,14 +45,11 @@
4445
"babel-preset-react-app": "^3.1.0",
4546
"deep-diff": "^1.0.2",
4647
"deep-freeze": "^0.0.1",
47-
"enzyme": "^3.3.0",
48-
"enzyme-adapter-react-16": "^1.1.1",
4948
"flag-icon-css": "^2.9.0",
5049
"focus-trap-react": "^5.0.1",
5150
"gh-pages": "^1.1.0",
5251
"husky": "^1.0.0-rc.13",
5352
"immutability-helper": "^2.6.4",
54-
"jest": "^22.0.4",
5553
"lint-staged": "^7.2.0",
5654
"nwb": "^0.21.5",
5755
"prettier": "1.13.7",
@@ -65,6 +63,7 @@
6563
"react-router": "^4.2.0",
6664
"react-router-dom": "^4.2.2",
6765
"react-test-renderer": "^16.2.0",
66+
"react-testing-library": "^7.0.0",
6867
"react-virtualized": "^9.18.5",
6968
"semantic-release": "^15.6.3",
7069
"semantic-ui-react": "^0.77.1",
@@ -76,7 +75,9 @@
7675
"src/**/*.{js,jsx,mjs}",
7776
"!src/**/index.js"
7877
],
79-
"setupTestFrameworkScriptFile": "<rootDir>/src/setupTests.js",
78+
"setupFiles": [
79+
"<rootDir>/src/setupTests.js"
80+
],
8081
"testMatch": [
8182
"<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}",
8283
"<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"

src/__tests__/FilteringContainer.test.js

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,33 @@
11
import React from 'react';
2-
import {shallow} from 'enzyme';
2+
import {render, cleanup} from 'react-testing-library';
3+
import ReactTestUtils from 'react-dom/test-utils';
34

45
import FilteringContainer from '../FilteringContainer';
56
import {Nodes} from '../../testData/sampleTree';
6-
import DefaultGroupRenderer from '../filtering/DefaultGroupRenderer';
77

88
describe('FilteringContainer', () => {
9+
afterEach(cleanup);
10+
911
const setup = (extraProps = {}) => {
10-
const child = jest.fn();
12+
const child = jest.fn().mockImplementation(() => <div>Child</div>);
1113

1214
const props = {nodes: Nodes, debouncer: v => v, ...extraProps};
1315

14-
const wrapper = shallow(<FilteringContainer {...props}>{child}</FilteringContainer>);
16+
const wrapper = render(<FilteringContainer {...props}>{child}</FilteringContainer>);
1517

1618
return {
17-
changeFilter: value => wrapper.find('input').simulate('change', {target: {value}}),
18-
getInjectedNodes: () => child.mock.calls.slice(-1)[0][0].nodes,
19+
changeFilter: value => {
20+
const input = wrapper.getByPlaceholderText('Search...');
21+
22+
ReactTestUtils.Simulate.change(input, {
23+
target: {
24+
value,
25+
},
26+
});
27+
},
28+
getInjectedNodes: () => {
29+
return child.mock.calls.slice(-1)[0][0].nodes;
30+
},
1931
wrapper,
2032
child,
2133
props,
@@ -24,47 +36,47 @@ describe('FilteringContainer', () => {
2436

2537
describe('filtering', () => {
2638
it('should not filter when searchTerm is empty', () => {
27-
const {wrapper, changeFilter, props, getInjectedNodes} = setup();
39+
const {changeFilter, props, getInjectedNodes} = setup();
2840

2941
changeFilter('');
3042

3143
expect(getInjectedNodes()).toEqual(props.nodes);
3244
});
3345

34-
it('should filter for deepsearch', () => {
35-
const {wrapper, changeFilter, getInjectedNodes} = setup();
46+
it('should filter for deepsearch', async () => {
47+
const {changeFilter, getInjectedNodes} = setup();
3648

3749
changeFilter('2');
3850

3951
expect(getInjectedNodes()).toMatchSnapshot();
4052
});
4153

4254
it('should filter when results match more then 1 node', () => {
43-
const {wrapper, changeFilter, getInjectedNodes} = setup();
55+
const {changeFilter, getInjectedNodes} = setup();
4456

4557
changeFilter('1');
4658

4759
expect(getInjectedNodes()).toMatchSnapshot();
4860
});
4961

5062
it('should filter when there are no results', () => {
51-
const {wrapper, changeFilter, getInjectedNodes} = setup();
63+
const {changeFilter, getInjectedNodes} = setup();
5264

5365
changeFilter('Node');
5466

5567
expect(getInjectedNodes()).toEqual([]);
5668
});
5769

5870
it('should ignore boundarie spaces when filtering', () => {
59-
const {wrapper, changeFilter, getInjectedNodes} = setup();
71+
const {changeFilter, getInjectedNodes} = setup();
6072

6173
changeFilter('1 ');
6274

6375
expect(getInjectedNodes()).toMatchSnapshot();
6476
});
6577

6678
it('should ignore casing when filtering', () => {
67-
const {wrapper, changeFilter, getInjectedNodes} = setup();
79+
const {changeFilter, getInjectedNodes} = setup();
6880

6981
changeFilter('LEAf 3');
7082

@@ -76,14 +88,8 @@ describe('FilteringContainer', () => {
7688
it('when groups do not exist should not render groups related info', () => {
7789
const {wrapper} = setup();
7890

79-
expect(
80-
wrapper
81-
.find('div')
82-
.at(1)
83-
.hasClass('group'),
84-
).toBe(false);
85-
86-
expect(wrapper.find(DefaultGroupRenderer).length).toEqual(0);
91+
expect(wrapper.container.querySelector('.group')).toBeNull();
92+
expect(wrapper.container.querySelector('.tree-group')).toBeNull();
8793
});
8894

8995
describe('when groups exist', () => {
@@ -109,36 +115,23 @@ describe('FilteringContainer', () => {
109115
it('should render the expected className', () => {
110116
const {wrapper} = setupWithGroups();
111117

112-
expect(
113-
wrapper
114-
.find('div')
115-
.at(1)
116-
.hasClass('group'),
117-
).toBe(true);
118+
expect(wrapper.container.querySelector('.group')).not.toBeNull();
118119
});
119120

120121
it('should render the DefaultGroupRenderer when one is not injected as a prop', () => {
121-
const {wrapper, props} = setupWithGroups();
122+
const {wrapper} = setupWithGroups();
122123

123-
expect(wrapper.find(DefaultGroupRenderer).props()).toEqual({
124-
groups: props.groups,
125-
selectedGroup: props.selectedGroup,
126-
onChange: props.onSelectedGroupChange,
127-
});
124+
expect(wrapper.container.querySelector('.tree-group')).toMatchSnapshot();
128125
});
129126

130127
it('should render a injected groupRenderer', () => {
131-
const GroupRenderer = () => <div>Group renderer!</div>;
128+
const GroupRenderer = props => <div data-testid="group-renderer">Group renderer! {JSON.stringify(props)}</div>;
132129

133-
const {wrapper, props} = setupWithGroups({
130+
const {wrapper} = setupWithGroups({
134131
groupRenderer: GroupRenderer,
135132
});
136133

137-
expect(wrapper.find(GroupRenderer).props()).toEqual({
138-
groups: props.groups,
139-
selectedGroup: props.selectedGroup,
140-
onChange: props.onSelectedGroupChange,
141-
});
134+
expect(wrapper.getByTestId('group-renderer')).toMatchSnapshot();
142135
});
143136

144137
it('should filter results based on the selected group', () => {

src/__tests__/Tree.test.js

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

0 commit comments

Comments
 (0)