Browse Source

Async mode

pull/6/head
Giuseppe Gurgone 8 years ago
parent
commit
1afdde07ce
  1. 2
      package.json
  2. 32
      src/index.js
  3. 38
      test/react-jsdom.js
  4. 4220
      yarn.lock

2
package.json

@ -27,7 +27,7 @@
}, },
"homepage": "https://github.com/lukechilds/react-jsdom", "homepage": "https://github.com/lukechilds/react-jsdom",
"dependencies": { "dependencies": {
"react-dom": "^15.6.1", "react-dom": "15.x",
"window": "^4.1.1" "window": "^4.1.1"
}, },
"devDependencies": { "devDependencies": {

32
src/index.js

@ -22,13 +22,39 @@ const ReactJSDOM = {
ReactDOM.render(component, container); ReactDOM.render(component, container);
return {
element: container.children.length > 1 ? container.children : container.children[0],
restore: () => {
Object.keys(origGlobals).forEach(prop => { Object.keys(origGlobals).forEach(prop => {
global[prop] = origGlobals[prop]; global[prop] = origGlobals[prop];
}); });
return container.children.length > 1 ? container.children : container.children[0];
} }
};
}
}; };
Object.defineProperty(ReactJSDOM, 'async', {
enumerable: true,
configurable: false,
get: () => {
let resolve;
let element;
let restore;
return {
done: () => {
resolve({
element,
restore
});
},
render: (component, window) => new Promise((res, rej) => {
resolve = res;
const r = ReactJSDOM.render(component, window);
element = r.element;
restore = r.restore;
});
};
}
});
module.exports = ReactJSDOM; module.exports = ReactJSDOM;

38
test/react-jsdom.js

@ -1,7 +1,7 @@
import test from 'ava'; import test from 'ava';
import Window from 'window'; import Window from 'window';
import React from 'react'; import React from 'react';
import ReactJSDOM from 'this'; import ReactJSDOM from '../src';
test('ReactJSDOM is a object', t => { test('ReactJSDOM is a object', t => {
t.is(typeof ReactJSDOM, 'object'); t.is(typeof ReactJSDOM, 'object');
@ -25,7 +25,7 @@ test('ReactJSDOM renders a React Component', t => {
t.is(elem.textContent, 'hi'); t.is(elem.textContent, 'hi');
}); });
test('ReactJSDOM allows window instance to be passed in', t => { test('ReactJSDOM allows window instance to be passed in', async t => {
const window = new Window(); const window = new Window();
const elem = ReactJSDOM.render( const elem = ReactJSDOM.render(
React.createElement('div', {}, 'hi'), React.createElement('div', {}, 'hi'),
@ -35,3 +35,37 @@ test('ReactJSDOM allows window instance to be passed in', t => {
t.is(elem.nodeName, 'DIV'); t.is(elem.nodeName, 'DIV');
t.is(elem.textContent, 'hi'); t.is(elem.textContent, 'hi');
}); });
test('Works with asynchronous components', async t => {
const originalDocument = global.document;
const { done, render } = ReactJSDOM.async;
class Test extends React.Component {
constructor(props) {
super(props);
this.state = {
children: 'test'
};
}
componentDidMount() {
setTimeout(() => {
this.setState({
children: 'updated'
});
}, 500);
}
componentDidUpdate() {
t.is(this.state.children, 'updated');
done();
}
render() {
return React.createElement('div', {}, this.state.children);
}
}
const { element, restore } = await render(React.createElement(Test));
t.is(element.nodeName, 'DIV');
restore();
t.is(global.document, originalDocument);
});

4220
yarn.lock

File diff suppressed because it is too large
Loading…
Cancel
Save