'use strict';
let useSyncExternalStore;
let React;
let ReactDOM;
let ReactDOMServer;
let Scheduler;
let assertLog;
describe('useSyncExternalStore (userspace shim, server rendering)', () => {
beforeEach(() => {
jest.resetModules();
jest.mock('react', () => {
const {
startTransition: _,
useSyncExternalStore: __,
...otherExports
} = jest.requireActual('react');
return otherExports;
});
React = require('react');
ReactDOM = require('react-dom');
ReactDOMServer = require('react-dom/server');
Scheduler = require('scheduler');
const InternalTestUtils = require('internal-test-utils');
assertLog = InternalTestUtils.assertLog;
useSyncExternalStore =
require('use-sync-external-store/shim').useSyncExternalStore;
});
function Text({text}) {
Scheduler.log(text);
return text;
}
function createExternalStore(initialState) {
const listeners = new Set();
let currentState = initialState;
return {
set(text) {
currentState = text;
ReactDOM.unstable_batchedUpdates(() => {
listeners.forEach(listener => listener());
});
},
subscribe(listener) {
listeners.add(listener);
return () => listeners.delete(listener);
},
getState() {
return currentState;
},
getSubscriberCount() {
return listeners.size;
},
};
}
it('basic server render', async () => {
const store = createExternalStore('client');
function App() {
const text = useSyncExternalStore(
store.subscribe,
store.getState,
() => 'server',
);
return <Text text={text} />;
}
const html = ReactDOMServer.renderToString(<App />);
assertLog(['client']);
expect(html).toEqual('client');
});
});