Skip to content

Commit dc9c712

Browse files
EnoahNetzachrandycoulman
authored andcommitted
E2e jsdom fix (facebook#1470)
* E2E: run tests when react is ready * Entangle e2e with callbacks * Remove unused e2e lines
1 parent 80c6615 commit dc9c712

20 files changed

+124
-72
lines changed

packages/react-scripts/fixtures/kitchensink/.template.dependencies.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"dependencies": {
33
"babel-preset-latest": "6.16.0",
4-
"babel-register": "6.18.0",
4+
"babel-register": "6.22.0",
55
"babel-polyfill": "6.20.0",
66
"chai": "3.5.0",
77
"jsdom": "9.8.3",

packages/react-scripts/fixtures/kitchensink/integration/initDOM.js

+7-16
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ const path = require('path')
55

66
let getMarkup
77
let resourceLoader
8-
// this value could be tweaked in order to let the resource
9-
// retriever get every file and jsdom execute react
10-
let timeToWaitForJsToExecute
118

129
if (process.env.E2E_FILE) {
1310
const file = path.isAbsolute(process.env.E2E_FILE)
@@ -21,8 +18,6 @@ if (process.env.E2E_FILE) {
2118
null,
2219
fs.readFileSync(path.join(path.dirname(file), resource.url.pathname), 'utf8')
2320
)
24-
25-
timeToWaitForJsToExecute = 0
2621
} else if (process.env.E2E_URL) {
2722
getMarkup = () => new Promise(resolve => {
2823
http.get(process.env.E2E_URL, (res) => {
@@ -32,11 +27,7 @@ if (process.env.E2E_FILE) {
3227
})
3328
})
3429

35-
resourceLoader = (resource, callback) => {
36-
return resource.defaultFetch(callback)
37-
}
38-
39-
timeToWaitForJsToExecute = 100
30+
resourceLoader = (resource, callback) => resource.defaultFetch(callback)
4031
} else {
4132
it.only('can run jsdom (at least one of "E2E_FILE" or "E2E_URL" environment variables must be provided)', () => {
4233
expect(new Error('This isn\'t the error you are looking for.')).toBeUndefined()
@@ -47,16 +38,16 @@ export default feature => new Promise(async resolve => {
4738
const markup = await getMarkup()
4839
const host = process.env.E2E_URL || 'http://localhost:3000'
4940
const doc = jsdom.jsdom(markup, {
50-
features : {
51-
FetchExternalResources : ['script', 'css'],
52-
ProcessExternalResources : ['script'],
41+
features: {
42+
FetchExternalResources: ['script', 'css'],
43+
ProcessExternalResources: ['script'],
5344
},
45+
created: (_, win) => win.addEventListener('ReactFeatureDidMount', () => resolve(doc), true),
46+
deferClose: true,
5447
resourceLoader,
5548
url: `${host}#${feature}`,
5649
virtualConsole: jsdom.createVirtualConsole().sendTo(console),
5750
})
5851

59-
doc.defaultView.addEventListener('load', () => {
60-
setTimeout(() => resolve(doc), timeToWaitForJsToExecute)
61-
}, false)
52+
doc.close()
6253
})

packages/react-scripts/fixtures/kitchensink/src/App.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
import React from 'react';
22

3+
class BuiltEmitter extends React.Component {
4+
constructor(props) {
5+
super(props)
6+
7+
this.callWhenDone = done => done();
8+
}
9+
10+
componentDidMount() {
11+
this.callWhenDone(() => document.dispatchEvent(new Event('ReactFeatureDidMount')));
12+
}
13+
14+
render() {
15+
const feature = React.cloneElement(React.Children.only(this.props.children), {
16+
setCallWhenDone: done => {
17+
this.callWhenDone = done;
18+
}
19+
});
20+
21+
return <div>{feature}</div>;
22+
}
23+
}
24+
325
class App extends React.Component {
426
constructor(props) {
527
super(props);
@@ -96,7 +118,7 @@ class App extends React.Component {
96118

97119
render() {
98120
const Feature = this.state.feature;
99-
return Feature ? <Feature /> : null;
121+
return Feature ? <BuiltEmitter><Feature /></BuiltEmitter> : null;
100122
}
101123
}
102124

packages/react-scripts/fixtures/kitchensink/src/features/env/NodePath.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ export default class extends React.Component {
55
constructor(props) {
66
super(props);
77

8+
this.done = () => {};
9+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
10+
this.done = done;
11+
});
12+
813
this.state = { users: [] };
914
}
1015

1116
async componentDidMount() {
1217
const users = load();
13-
this.setState({ users });
18+
this.setState({ users }, () => this.done());
1419
}
1520

1621
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/ArrayDestructuring.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load();
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/ArraySpread.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load([{ id: 42, name: '42' }]);
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/AsyncAwait.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = await load();
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/ComputedProperties.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load('user_');
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/CustomInterpolation.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,17 @@ export default class extends React.Component {
1818
constructor(props) {
1919
super(props);
2020

21+
this.done = () => {};
22+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
23+
this.done = done;
24+
});
25+
2126
this.state = { users: [] };
2227
}
2328

2429
async componentDidMount() {
2530
const users = load();
26-
this.setState({ users });
31+
this.setState({ users }, () => this.done());
2732
}
2833

2934
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/DefaultParameters.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load();
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/DestructuringAndAwait.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const { users } = await load();
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/Generators.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ export default class extends React.Component {
1212
constructor(props) {
1313
super(props);
1414

15+
this.done = () => {};
16+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
17+
this.done = done;
18+
});
19+
1520
this.state = { users: [] };
1621
}
1722

@@ -20,7 +25,7 @@ export default class extends React.Component {
2025
for (let user of load(4)) {
2126
users.push(user);
2227
}
23-
this.setState({ users });
28+
this.setState({ users }, () => this.done());
2429
}
2530

2631
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/ObjectDestructuring.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load();
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/ObjectSpread.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load({ age: 42 });
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/Promises.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
componentDidMount() {
2025
load().then(users => {
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
});
2328
}
2429

packages/react-scripts/fixtures/kitchensink/src/features/syntax/RestAndDefault.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load();
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/RestParameters.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load({ id: 0, user: { id: 42, name: '42' } });
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

packages/react-scripts/fixtures/kitchensink/src/features/syntax/TemplateInterpolation.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ export default class extends React.Component {
1313
constructor(props) {
1414
super(props);
1515

16+
this.done = () => {};
17+
this.props.setCallWhenDone && this.props.setCallWhenDone((done) => {
18+
this.done = done;
19+
});
20+
1621
this.state = { users: [] };
1722
}
1823

1924
async componentDidMount() {
2025
const users = load('user_');
21-
this.setState({ users });
26+
this.setState({ users }, () => this.done());
2227
}
2328

2429
render() {

0 commit comments

Comments
 (0)