@@ -27,19 +27,15 @@ jest.mock('../util/feature-flags', () => ({
2727 isMinimumRequiredVersionSupported : jest . fn ( ) ,
2828} ) ) ;
2929
30- const mockToastRef = {
31- current : {
32- showToast : jest . fn ( ) ,
33- } ,
34- } ;
35-
36- jest . mock ( '../component-library/components/Toast' , ( ) => ( {
37- ToastContext : {
38- Provider : ( { children } : any ) => children ,
39- Consumer : ( { children } : any ) => children ( mockToastRef ) ,
40- displayName : 'ToastContext' ,
41- } ,
42- } ) ) ;
30+ // Mock the ToastContext to avoid dependency issues
31+ jest . mock ( '../component-library/components/Toast' , ( ) => {
32+ const React = jest . requireActual ( 'react' ) ;
33+ return {
34+ ToastContext : React . createContext ( {
35+ toastRef : { current : { showToast : jest . fn ( ) } } ,
36+ } ) ,
37+ } ;
38+ } ) ;
4339
4440describe ( 'FeatureFlagOverrideContext' , ( ) => {
4541 let mockUseSelector : jest . MockedFunction < typeof useSelector > ;
@@ -62,7 +58,6 @@ describe('FeatureFlagOverrideContext', () => {
6258
6359 // Default mock implementations
6460 mockIsMinimumRequiredVersionSupported . mockReturnValue ( true ) ;
65- mockToastRef . current . showToast . mockClear ( ) ;
6661 mockGetFeatureFlagDescription . mockImplementation (
6762 ( key : string ) => `Description for ${ key } ` ,
6863 ) ;
@@ -190,9 +185,7 @@ describe('FeatureFlagOverrideContext', () => {
190185 expect ( result . current . hasOverride ( 'newFlag' ) ) . toBe ( true ) ;
191186 expect ( result . current . getOverride ( 'newFlag' ) ) . toBe ( 'new value' ) ;
192187 expect ( result . current . getFeatureFlag ( 'newFlag' ) ) . toBe ( 'new value' ) ;
193- expect (
194- result . current . featureFlags . newFlag . originalValue ,
195- ) . toBeUndefined ( ) ;
188+ expect ( result . current . featureFlags . newFlag . originalValue ) . toBeUndefined ( ) ;
196189 expect ( result . current . featureFlags . newFlag . isOverridden ) . toBe ( true ) ;
197190 } ) ;
198191
@@ -635,7 +628,74 @@ describe('FeatureFlagOverrideContext', () => {
635628 expect ( result . current . getFeatureFlag ( 'testFlag' ) ) . toBe ( true ) ;
636629 } ) ;
637630
638- it ( 'returns enabled value for boolean with minimumVersion flags when version is not supported' , ( ) => {
631+ it ( 'returns false for boolean with minimumVersion flags when enabled is false and version is supported' , ( ) => {
632+ const mockFlags = {
633+ testFlag : { enabled : false , minimumVersion : '1.0.0' } ,
634+ } ;
635+ mockUseSelector . mockReturnValue ( mockFlags ) ;
636+ mockGetFeatureFlagType . mockReturnValue ( 'boolean with minimumVersion' ) ;
637+ mockIsMinimumRequiredVersionSupported . mockReturnValue ( true ) ;
638+
639+ const { result } = renderHook ( ( ) => useFeatureFlagOverride ( ) , {
640+ wrapper : createWrapper ,
641+ } ) ;
642+
643+ expect ( result . current . getFeatureFlag ( 'testFlag' ) ) . toBe ( false ) ;
644+ } ) ;
645+
646+ it ( 'returns false for boolean with minimumVersion flags when version is not supported in non-production' , ( ) => {
647+ const originalNodeEnv = process . env . NODE_ENV ;
648+ Object . defineProperty ( process . env , 'NODE_ENV' , {
649+ value : 'development' ,
650+ configurable : true ,
651+ } ) ;
652+
653+ const mockFlags = {
654+ testFlag : { enabled : true , minimumVersion : '99.0.0' } ,
655+ } ;
656+ mockUseSelector . mockReturnValue ( mockFlags ) ;
657+ mockGetFeatureFlagType . mockReturnValue ( 'boolean with minimumVersion' ) ;
658+ mockIsMinimumRequiredVersionSupported . mockReturnValue ( false ) ;
659+
660+ const { result } = renderHook ( ( ) => useFeatureFlagOverride ( ) , {
661+ wrapper : createWrapper ,
662+ } ) ;
663+
664+ expect ( result . current . getFeatureFlag ( 'testFlag' ) ) . toBe ( false ) ;
665+
666+ Object . defineProperty ( process . env , 'NODE_ENV' , {
667+ value : originalNodeEnv ,
668+ configurable : true ,
669+ } ) ;
670+ } ) ;
671+
672+ it ( 'returns false for boolean with minimumVersion flags when version is not supported in production' , ( ) => {
673+ const originalNodeEnv = process . env . NODE_ENV ;
674+ Object . defineProperty ( process . env , 'NODE_ENV' , {
675+ value : 'production' ,
676+ configurable : true ,
677+ } ) ;
678+
679+ const mockFlags = {
680+ testFlag : { enabled : true , minimumVersion : '99.0.0' } ,
681+ } ;
682+ mockUseSelector . mockReturnValue ( mockFlags ) ;
683+ mockGetFeatureFlagType . mockReturnValue ( 'boolean with minimumVersion' ) ;
684+ mockIsMinimumRequiredVersionSupported . mockReturnValue ( false ) ;
685+
686+ const { result } = renderHook ( ( ) => useFeatureFlagOverride ( ) , {
687+ wrapper : createWrapper ,
688+ } ) ;
689+
690+ expect ( result . current . getFeatureFlag ( 'testFlag' ) ) . toBe ( false ) ;
691+
692+ Object . defineProperty ( process . env , 'NODE_ENV' , {
693+ value : originalNodeEnv ,
694+ configurable : true ,
695+ } ) ;
696+ } ) ;
697+
698+ it ( 'returns enabled value for boolean with minimumVersion flags when enabled is false' , ( ) => {
639699 const mockFlags = {
640700 testFlag : { enabled : false , minimumVersion : '99.0.0' } ,
641701 } ;
@@ -648,8 +708,6 @@ describe('FeatureFlagOverrideContext', () => {
648708 } ) ;
649709
650710 expect ( result . current . getFeatureFlag ( 'testFlag' ) ) . toBe ( false ) ;
651- // Toast should be shown in non-production environment, but we don't test that here
652- // since it's an implementation detail and would require mocking NODE_ENV
653711 } ) ;
654712
655713 it ( 'returns flag value directly for non-boolean with minimumVersion flags' , ( ) => {
@@ -745,5 +803,63 @@ describe('FeatureFlagOverrideContext', () => {
745803 expect ( result . current . getFeatureFlag ( '' ) ) . toBe ( 'overridden empty' ) ;
746804 expect ( result . current . hasOverride ( '' ) ) . toBe ( true ) ;
747805 } ) ;
806+
807+ describe ( 'Version Support Logic' , ( ) => {
808+ it ( 'returns false for unsupported minimumVersion in development environment' , ( ) => {
809+ const originalNodeEnv = process . env . NODE_ENV ;
810+ Object . defineProperty ( process . env , 'NODE_ENV' , {
811+ value : 'development' ,
812+ configurable : true ,
813+ } ) ;
814+
815+ const mockFlags = {
816+ myFeatureFlag : { enabled : true , minimumVersion : '10.0.0' } ,
817+ } ;
818+ mockUseSelector . mockReturnValue ( mockFlags ) ;
819+ mockGetFeatureFlagType . mockReturnValue ( 'boolean with minimumVersion' ) ;
820+ mockIsMinimumRequiredVersionSupported . mockReturnValue ( false ) ;
821+
822+ const { result } = renderHook ( ( ) => useFeatureFlagOverride ( ) , {
823+ wrapper : createWrapper ,
824+ } ) ;
825+
826+ expect ( result . current . getFeatureFlag ( 'myFeatureFlag' ) ) . toBe ( false ) ;
827+
828+ Object . defineProperty ( process . env , 'NODE_ENV' , {
829+ value : originalNodeEnv ,
830+ configurable : true ,
831+ } ) ;
832+ } ) ;
833+
834+ it ( 'returns enabled value when feature flag version is supported' , ( ) => {
835+ const mockFlags = {
836+ supportedFlag : { enabled : true , minimumVersion : '1.0.0' } ,
837+ } ;
838+ mockUseSelector . mockReturnValue ( mockFlags ) ;
839+ mockGetFeatureFlagType . mockReturnValue ( 'boolean with minimumVersion' ) ;
840+ mockIsMinimumRequiredVersionSupported . mockReturnValue ( true ) ;
841+
842+ const { result } = renderHook ( ( ) => useFeatureFlagOverride ( ) , {
843+ wrapper : createWrapper ,
844+ } ) ;
845+
846+ expect ( result . current . getFeatureFlag ( 'supportedFlag' ) ) . toBe ( true ) ;
847+ } ) ;
848+
849+ it ( 'returns flag value directly for non-boolean with minimumVersion flag types' , ( ) => {
850+ const mockFlags = {
851+ stringFlag : 'test value' ,
852+ } ;
853+ mockUseSelector . mockReturnValue ( mockFlags ) ;
854+ mockGetFeatureFlagType . mockReturnValue ( 'string' ) ;
855+ mockIsMinimumRequiredVersionSupported . mockReturnValue ( false ) ;
856+
857+ const { result } = renderHook ( ( ) => useFeatureFlagOverride ( ) , {
858+ wrapper : createWrapper ,
859+ } ) ;
860+
861+ expect ( result . current . getFeatureFlag ( 'stringFlag' ) ) . toBe ( 'test value' ) ;
862+ } ) ;
863+ } ) ;
748864 } ) ;
749865} ) ;
0 commit comments