/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @jest-environment node
*/
// sanity tests for act()
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');
// TODO: These tests are no longer specific to the noop renderer
// implementation. They test the internal implementation we use in the React
// test suite.
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');
});
});