@@ -249,5 +249,104 @@ describe('ReactDOMServerIntegration', () => {
249
249
expect ( e . querySelector ( '#language2' ) . textContent ) . toBe ( 'sanskrit' ) ;
250
250
expect ( e . querySelector ( '#language3' ) . textContent ) . toBe ( 'french' ) ;
251
251
} ) ;
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
+ ) ;
252
351
} ) ;
253
352
} ) ;
0 commit comments