const React = require('react');
const ReactNoop = require('react-noop-renderer');
const Scheduler = require('scheduler');
const act = require('internal-test-utils').act;
const {assertLog, waitForAll} = require('internal-test-utils');
describe('internal act()', () => {
it('can use act to flush effects', async () => {
function App(props) {
React.useEffect(props.callback);
return null;
}
const calledLog = [];
await act(() => {
ReactNoop.render(
<App
callback={() => {
calledLog.push(calledLog.length);
}}
/>,
);
});
await waitForAll([]);
expect(calledLog).toEqual([0]);
});
it('should work with async/await', async () => {
function App() {
const [ctr, setCtr] = React.useState(0);
async function someAsyncFunction() {
Scheduler.log('stage 1');
await null;
Scheduler.log('stage 2');
await null;
setCtr(1);
}
React.useEffect(() => {
someAsyncFunction();
}, []);
return ctr;
}
await act(() => {
ReactNoop.render(<App />);
});
assertLog(['stage 1', 'stage 2']);
await waitForAll([]);
expect(ReactNoop).toMatchRenderedOutput('1');
});
});