@@ -2,14 +2,13 @@ import React from 'react';
22import '@testing-library/dom' ;
33import '@testing-library/jest-dom' ;
44import { render } from '@testing-library/react' ;
5- import { initialize , LDContext , LDFlagChangeset , LDOptions } from 'launchdarkly-js-client-sdk' ;
5+ import { initialize , LDClient , LDContext , LDFlagChangeset , LDOptions } from 'launchdarkly-js-client-sdk' ;
66import { AsyncProviderConfig , LDReactOptions } from './types' ;
7- import { Consumer } from './context' ;
7+ import { Consumer , reactSdkContextFactory } from './context' ;
88import asyncWithLDProvider from './asyncWithLDProvider' ;
99import wrapperOptions from './wrapperOptions' ;
1010import { fetchFlags } from './utils' ;
1111
12-
1312jest . mock ( 'launchdarkly-js-client-sdk' , ( ) => {
1413 const actual = jest . requireActual ( 'launchdarkly-js-client-sdk' ) ;
1514
@@ -351,4 +350,120 @@ describe('asyncWithLDProvider', () => {
351350
352351 expect ( receivedNode ) . toHaveTextContent ( '{"testFlag":false}' ) ;
353352 } ) ;
353+
354+ test ( 'custom context is provided to consumer' , async ( ) => {
355+ const CustomContext = reactSdkContextFactory ( ) ;
356+ const customLDClient = {
357+ on : jest . fn ( ( _ : string , cb : ( ) => void ) => {
358+ cb ( ) ;
359+ } ) ,
360+ off : jest . fn ( ) ,
361+ allFlags : jest . fn ( ) . mockReturnValue ( { 'context-test-flag' : true } ) ,
362+ variation : jest . fn ( ( _ : string , v ) => v ) ,
363+ waitForInitialization : jest . fn ( ) ,
364+ } ;
365+ const config : AsyncProviderConfig = {
366+ clientSideID,
367+ ldClient : customLDClient as unknown as LDClient ,
368+ reactOptions : {
369+ reactContext : CustomContext ,
370+ } ,
371+ } ;
372+ const originalUtilsModule = jest . requireActual ( './utils' ) ;
373+ mockFetchFlags . mockImplementation ( originalUtilsModule . fetchFlags ) ;
374+
375+ const LDProvider = await asyncWithLDProvider ( config ) ;
376+ const LaunchDarklyApp = (
377+ < LDProvider >
378+ < CustomContext . Consumer >
379+ { ( { flags } ) => {
380+ return (
381+ < span >
382+ flag is { flags . contextTestFlag === undefined ? 'undefined' : JSON . stringify ( flags . contextTestFlag ) }
383+ </ span >
384+ ) ;
385+ } }
386+ </ CustomContext . Consumer >
387+ </ LDProvider >
388+ ) ;
389+
390+ const { findByText } = render ( LaunchDarklyApp ) ;
391+ expect ( await findByText ( 'flag is true' ) ) . not . toBeNull ( ) ;
392+
393+ const receivedNode = await renderWithConfig ( { clientSideID } ) ;
394+ expect ( receivedNode ) . not . toHaveTextContent ( '{"contextTestFlag":true}' ) ;
395+ } ) ;
396+
397+ test ( 'multiple providers' , async ( ) => {
398+ const customLDClient1 = {
399+ on : jest . fn ( ( _ : string , cb : ( ) => void ) => {
400+ cb ( ) ;
401+ } ) ,
402+ off : jest . fn ( ) ,
403+ allFlags : jest . fn ( ) . mockReturnValue ( { 'context1-test-flag' : true } ) ,
404+ variation : jest . fn ( ( _ : string , v ) => v ) ,
405+ waitForInitialization : jest . fn ( ) ,
406+ } ;
407+ const customLDClient2 = {
408+ on : jest . fn ( ( _ : string , cb : ( ) => void ) => {
409+ cb ( ) ;
410+ } ) ,
411+ off : jest . fn ( ) ,
412+ allFlags : jest . fn ( ) . mockReturnValue ( { 'context2-test-flag' : true } ) ,
413+ variation : jest . fn ( ( _ : string , v ) => v ) ,
414+ waitForInitialization : jest . fn ( ) ,
415+ } ;
416+ const originalUtilsModule = jest . requireActual ( './utils' ) ;
417+ mockFetchFlags . mockImplementation ( originalUtilsModule . fetchFlags ) ;
418+
419+ const CustomContext1 = reactSdkContextFactory ( ) ;
420+ const LDProvider1 = await asyncWithLDProvider ( {
421+ clientSideID,
422+ ldClient : customLDClient1 as unknown as LDClient ,
423+ reactOptions : {
424+ reactContext : CustomContext1 ,
425+ } ,
426+ } ) ;
427+ const CustomContext2 = reactSdkContextFactory ( ) ;
428+ const LDProvider2 = await asyncWithLDProvider ( {
429+ clientSideID,
430+ ldClient : customLDClient2 as unknown as LDClient ,
431+ reactOptions : {
432+ reactContext : CustomContext2 ,
433+ } ,
434+ } ) ;
435+ const safeValue = ( val ?: boolean ) => ( val === undefined ? 'undefined' : JSON . stringify ( val ) ) ;
436+ const LaunchDarklyApp = (
437+ < LDProvider1 >
438+ < LDProvider2 >
439+ < CustomContext1 . Consumer >
440+ { ( { flags } ) => {
441+ return (
442+ < >
443+ < span > consumer 1, flag 1 is { safeValue ( flags . context1TestFlag ) } </ span >
444+ < span > consumer 1, flag 2 is { safeValue ( flags . context2TestFlag ) } </ span >
445+ </ >
446+ ) ;
447+ } }
448+ </ CustomContext1 . Consumer >
449+ < CustomContext2 . Consumer >
450+ { ( { flags } ) => {
451+ return (
452+ < >
453+ < span > consumer 2, flag 1 is { safeValue ( flags . context1TestFlag ) } </ span >
454+ < span > consumer 2, flag 2 is { safeValue ( flags . context2TestFlag ) } </ span >
455+ </ >
456+ ) ;
457+ } }
458+ </ CustomContext2 . Consumer >
459+ </ LDProvider2 >
460+ </ LDProvider1 >
461+ ) ;
462+
463+ const { findByText } = render ( LaunchDarklyApp ) ;
464+ expect ( await findByText ( 'consumer 1, flag 1 is true' ) ) . not . toBeNull ( ) ;
465+ expect ( await findByText ( 'consumer 1, flag 2 is undefined' ) ) . not . toBeNull ( ) ;
466+ expect ( await findByText ( 'consumer 2, flag 1 is undefined' ) ) . not . toBeNull ( ) ;
467+ expect ( await findByText ( 'consumer 2, flag 2 is true' ) ) . not . toBeNull ( ) ;
468+ } ) ;
354469} ) ;
0 commit comments