@@ -249,5 +249,104 @@ describe('ReactDOMServerIntegration', () => {
249249 expect ( e . querySelector ( '#language2' ) . textContent ) . toBe ( 'sanskrit' ) ;
250250 expect ( e . querySelector ( '#language3' ) . textContent ) . toBe ( 'french' ) ;
251251 } ) ;
252+
253+ itRenders (
254+ 'should warn with an error message when using Context as consumer in DEV' ,
255+ async render => {
256+ const Theme = React . createContext ( 'dark' ) ;
257+ const Language = React . createContext ( 'french' ) ;
258+
259+ const App = ( ) => (
260+ < div >
261+ < Theme . Provider value = "light" >
262+ < Language . Provider value = "english" >
263+ < Theme . Provider value = "dark" >
264+ < Theme > { theme => < div id = "theme1" > { theme } </ div > } </ Theme >
265+ </ Theme . Provider >
266+ </ Language . Provider >
267+ </ Theme . Provider >
268+ </ div >
269+ ) ;
270+ // We expect 1 error.
271+ await render ( < App /> , 1 ) ;
272+ } ,
273+ ) ;
274+
275+ // False positive regression test.
276+ itRenders (
277+ 'should not warn when using Consumer from React < 16.6 with newer renderer' ,
278+ async render => {
279+ const Theme = React . createContext ( 'dark' ) ;
280+ const Language = React . createContext ( 'french' ) ;
281+ // React 16.5 and earlier didn't have a separate object.
282+ Theme . Consumer = Theme ;
283+
284+ const App = ( ) => (
285+ < div >
286+ < Theme . Provider value = "light" >
287+ < Language . Provider value = "english" >
288+ < Theme . Provider value = "dark" >
289+ < Theme > { theme => < div id = "theme1" > { theme } </ div > } </ Theme >
290+ </ Theme . Provider >
291+ </ Language . Provider >
292+ </ Theme . Provider >
293+ </ div >
294+ ) ;
295+ // We expect 0 errors.
296+ await render ( < App /> , 0 ) ;
297+ } ,
298+ ) ;
299+
300+ itRenders (
301+ 'should warn with an error message when using nested context consumers in DEV' ,
302+ async render => {
303+ const App = ( ) => {
304+ const Theme = React . createContext ( 'dark' ) ;
305+ const Language = React . createContext ( 'french' ) ;
306+
307+ return (
308+ < div >
309+ < Theme . Provider value = "light" >
310+ < Language . Provider value = "english" >
311+ < Theme . Provider value = "dark" >
312+ < Theme . Consumer . Consumer >
313+ { theme => < div id = "theme1" > { theme } </ div > }
314+ </ Theme . Consumer . Consumer >
315+ </ Theme . Provider >
316+ </ Language . Provider >
317+ </ Theme . Provider >
318+ </ div >
319+ ) ;
320+ } ;
321+ // We expect 1 error.
322+ await render ( < App /> , 1 ) ;
323+ } ,
324+ ) ;
325+
326+ itRenders (
327+ 'should warn with an error message when using Context.Consumer.Provider DEV' ,
328+ async render => {
329+ const App = ( ) => {
330+ const Theme = React . createContext ( 'dark' ) ;
331+ const Language = React . createContext ( 'french' ) ;
332+
333+ return (
334+ < div >
335+ < Theme . Provider value = "light" >
336+ < Language . Provider value = "english" >
337+ < Theme . Consumer . Provider value = "dark" >
338+ < Theme . Consumer >
339+ { theme => < div id = "theme1" > { theme } </ div > }
340+ </ Theme . Consumer >
341+ </ Theme . Consumer . Provider >
342+ </ Language . Provider >
343+ </ Theme . Provider >
344+ </ div >
345+ ) ;
346+ } ;
347+ // We expect 1 error.
348+ await render ( < App /> , 1 ) ;
349+ } ,
350+ ) ;
252351 } ) ;
253352} ) ;
0 commit comments