Skip to content

Commit 8088074

Browse files
committed
Test for pollution of later renders
1 parent 466fe06 commit 8088074

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,46 @@ describe('ReactDOMServerIntegration', () => {
483483
}
484484
});
485485

486+
it('does not pollute later renders when stream destroyed', () => {
487+
const LoggedInUser = React.createContext('default');
488+
489+
const AppWithUser = user => (
490+
<LoggedInUser.Provider value={user}>
491+
<header>
492+
<LoggedInUser.Consumer>{whoAmI => whoAmI}</LoggedInUser.Consumer>
493+
</header>
494+
</LoggedInUser.Provider>
495+
);
496+
497+
const stream = ReactDOMServer.renderToNodeStream(
498+
AppWithUser('Amy'),
499+
).setEncoding('utf8');
500+
501+
const {threadID} = stream.partialRenderer;
502+
503+
// Read enough to render Provider but not enough for it to be exited
504+
stream._read(10);
505+
expect(LoggedInUser[threadID]).toBe('Amy');
506+
507+
stream.destroy();
508+
509+
const AppWithUserNoProvider = () => (
510+
<LoggedInUser.Consumer>{whoAmI => whoAmI}</LoggedInUser.Consumer>
511+
);
512+
513+
const stream2 = ReactDOMServer.renderToNodeStream(
514+
AppWithUserNoProvider(),
515+
).setEncoding('utf8');
516+
517+
// Sanity check to ensure 2nd render has same threadID as 1st render,
518+
// otherwise this test is not testing what it's meant to
519+
expect(stream2.partialRenderer.threadID).toBe(threadID);
520+
521+
const markup = stream2.read(Infinity);
522+
523+
expect(markup).toBe('default');
524+
});
525+
486526
it('frees context value reference when stream destroyed', () => {
487527
const LoggedInUser = React.createContext('default');
488528

0 commit comments

Comments
 (0)