Skip to content

Commit 27c9064

Browse files
committed
add tests
1 parent a9069be commit 27c9064

File tree

2 files changed

+137
-20
lines changed

2 files changed

+137
-20
lines changed

app/contexts/FeatureFlagOverrideContext.test.tsx

Lines changed: 136 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4440
describe('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
});

app/contexts/FeatureFlagOverrideContext.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ export const FeatureFlagOverrideProvider: React.FC<
167167
iconName: 'Warning' as any,
168168
hasNoTimeout: false,
169169
});
170+
return false;
170171
}
171172
return flag.value.enabled;
172173
}

0 commit comments

Comments
 (0)