diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js
index bdd26f6620407..cb7e7534344f6 100644
--- a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js
+++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js
@@ -483,6 +483,46 @@ describe('ReactDOMServerIntegration', () => {
}
});
+ it('does not pollute later renders when stream destroyed', () => {
+ const LoggedInUser = React.createContext('default');
+
+ const AppWithUser = user => (
+
+
+
+ );
+
+ const stream = ReactDOMServer.renderToNodeStream(
+ AppWithUser('Amy'),
+ ).setEncoding('utf8');
+
+ const {threadID} = stream.partialRenderer;
+
+ // Read enough to render Provider but not enough for it to be exited
+ stream._read(10);
+ expect(LoggedInUser[threadID]).toBe('Amy');
+
+ stream.destroy();
+
+ const AppWithUserNoProvider = () => (
+ {whoAmI => whoAmI}
+ );
+
+ const stream2 = ReactDOMServer.renderToNodeStream(
+ AppWithUserNoProvider(),
+ ).setEncoding('utf8');
+
+ // Sanity check to ensure 2nd render has same threadID as 1st render,
+ // otherwise this test is not testing what it's meant to
+ expect(stream2.partialRenderer.threadID).toBe(threadID);
+
+ const markup = stream2.read(Infinity);
+
+ expect(markup).toBe('default');
+ });
+
it('frees context value reference when stream destroyed', () => {
const LoggedInUser = React.createContext('default');