Skip to content

Commit 24b3257

Browse files
committed
Add DOM test
This surfaces a suspected bug since we build flight-hooks separately it creates a separate copy of the client contexts.
1 parent 4f331da commit 24b3257

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ let React;
3030
let ReactDOMClient;
3131
let ReactServerDOMWriter;
3232
let ReactServerDOMReader;
33+
let ReactServerDOMHooks;
3334

3435
describe('ReactFlightDOM', () => {
3536
beforeEach(() => {
@@ -42,6 +43,7 @@ describe('ReactFlightDOM', () => {
4243
ReactDOMClient = require('react-dom/client');
4344
ReactServerDOMWriter = require('react-server-dom-webpack/writer.node.server');
4445
ReactServerDOMReader = require('react-server-dom-webpack');
46+
ReactServerDOMHooks = require('react-server-dom-webpack/flight-hooks');
4547
});
4648

4749
function getTestStream() {
@@ -545,4 +547,105 @@ describe('ReactFlightDOM', () => {
545547
expect(inputB.tagName).toBe('INPUT');
546548
expect(inputB.value).toBe('goodbye');
547549
});
550+
551+
// @gate enableServerContext
552+
it('supports useServerContextsForRefetch', async () => {
553+
let ServerContext = React.createServerContext('ServerContext', 'default');
554+
555+
function Foo() {
556+
return (
557+
<>
558+
<ServerContext.Provider value="hi this is server outer">
559+
<ServerContext.Provider value="hi this is server">
560+
<Bar value="" />
561+
</ServerContext.Provider>
562+
<ServerContext.Provider value="hi this is server2">
563+
<Bar value="2" />
564+
</ServerContext.Provider>
565+
<Bar value="outer" />
566+
</ServerContext.Provider>
567+
<ServerContext.Provider value="hi this is server outer2">
568+
<Bar value="outer2" />
569+
</ServerContext.Provider>
570+
<Bar value="default" />
571+
</>
572+
);
573+
}
574+
const contextsForRefetch = [];
575+
function ClientBaz() {
576+
const context = React.useContext(ServerContext);
577+
contextsForRefetch.push(
578+
ReactServerDOMHooks.useServerContextsForRefetch(),
579+
);
580+
return <span>{context}</span>;
581+
}
582+
function ClientBar({value}) {
583+
return (
584+
<ServerContext.Provider
585+
value={'hi this is client' + (value ? ' ' + value : '')}>
586+
<ClientBaz />
587+
</ServerContext.Provider>
588+
);
589+
}
590+
const Bar = moduleReference(ClientBar);
591+
592+
const {writable, readable} = getTestStream();
593+
const {pipe} = ReactServerDOMWriter.renderToPipeableStream(
594+
<Foo />,
595+
webpackMap,
596+
);
597+
pipe(writable);
598+
599+
// Reset modules
600+
jest.resetModules();
601+
act = require('jest-react').act;
602+
Stream = require('stream');
603+
React = require('react');
604+
ReactDOMClient = require('react-dom/client');
605+
ReactServerDOMWriter = require('react-server-dom-webpack/writer.node.server');
606+
ReactServerDOMReader = require('react-server-dom-webpack');
607+
ReactServerDOMHooks = require('react-server-dom-webpack/flight-hooks');
608+
609+
ServerContext = React.createServerContext('ServerContext', 'default');
610+
611+
const response = ReactServerDOMReader.createFromReadableStream(readable);
612+
613+
const container = document.createElement('div');
614+
const root = ReactDOMClient.createRoot(container);
615+
616+
function App({response: res}) {
617+
return res.readRoot();
618+
}
619+
620+
await act(async () => {
621+
root.render(<App response={response} />);
622+
});
623+
624+
expect(container.innerHTML).toBe(
625+
'<span>hi this is client</span>' +
626+
'<span>hi this is client 2</span>' +
627+
'<span>hi this is client outer</span>' +
628+
'<span>hi this is client outer2</span>' +
629+
'<span>hi this is client default</span>',
630+
);
631+
632+
const outer = ['ServerContext', 'hi this is server outer', null];
633+
expect(contextsForRefetch[0]).toEqual([
634+
'ServerContext',
635+
'hi this is server',
636+
outer,
637+
]);
638+
expect(contextsForRefetch[1]).toEqual([
639+
'ServerContext',
640+
'hi this is server2',
641+
outer,
642+
]);
643+
expect(contextsForRefetch[2]).toEqual(outer);
644+
expect(contextsForRefetch[3]).toEqual([
645+
'ServerContext',
646+
'hi this is server outer2',
647+
null,
648+
]);
649+
expect(contextsForRefetch[4]).toEqual(null);
650+
});
548651
});

0 commit comments

Comments
 (0)