Skip to content

Commit e21d66d

Browse files
Merge pull request #4294 from RedisInsight/be/feature/RI-5747-filter-per-ri-version-in-feature-config
RI-5747 filter per RI version in feature config
2 parents b4992c1 + 49123f1 commit e21d66d

File tree

3 files changed

+92
-0
lines changed

3 files changed

+92
-0
lines changed

redisinsight/api/src/modules/feature/providers/feature-flag/strategies/feature.flag.strategy.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import config, { Config } from 'src/utils/config';
1111
import { Feature } from 'src/modules/feature/model/feature';
1212
import { IFeatureFlag } from 'src/modules/feature/constants';
1313
import { SessionMetadata } from 'src/common/models';
14+
import { filterVersion } from 'src/utils/feature-version-filter.helper';
1415

1516
const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
1617

@@ -105,6 +106,10 @@ export abstract class FeatureFlagStrategy {
105106
if (filter instanceof FeatureConfigFilter) {
106107
const value = get(serverState, filter?.name);
107108

109+
if (filter?.name.match(/version/i)) {
110+
return filterVersion(filter.cond, value, filter?.value);
111+
}
112+
108113
switch (filter?.cond) {
109114
case FeatureConfigFilterCondition.Eq:
110115
return value === filter?.value;
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Import the function to test
2+
import { FeatureConfigFilterCondition } from 'src/modules/feature/model/features-config';
3+
import { filterVersion } from './feature-version-filter.helper';
4+
5+
describe('filterVersion', () => {
6+
it('should return true for Eq condition when versions are equal', () => {
7+
expect(filterVersion(FeatureConfigFilterCondition.Eq, '1.0.0', '1.0.0')).toBe(true);
8+
});
9+
10+
it('should return false for Eq condition when versions are not equal', () => {
11+
expect(filterVersion(FeatureConfigFilterCondition.Eq, '1.0.1', '1.0.0')).toBe(false);
12+
});
13+
14+
it('should return false for Neq condition when versions are equal', () => {
15+
expect(filterVersion(FeatureConfigFilterCondition.Neq, '1.0.0', '1.0.0')).toBe(false);
16+
});
17+
18+
it('should return true for Neq condition when versions are not equal', () => {
19+
expect(filterVersion(FeatureConfigFilterCondition.Neq, '1.0.1', '1.0.0')).toBe(true);
20+
});
21+
22+
it('should return true for Gt condition when first version is greater', () => {
23+
expect(filterVersion(FeatureConfigFilterCondition.Gt, '1.0.1', '1.0.0')).toBe(true);
24+
});
25+
26+
it('should return false for Gt condition when first version is not greater', () => {
27+
expect(filterVersion(FeatureConfigFilterCondition.Gt, '1.0.0', '1.0.1')).toBe(false);
28+
});
29+
30+
it('should return true for Gte condition when first version is greater', () => {
31+
expect(filterVersion(FeatureConfigFilterCondition.Gte, '1.0.1', '1.0.0')).toBe(true);
32+
});
33+
34+
it('should return true for Gte condition when versions are equal', () => {
35+
expect(filterVersion(FeatureConfigFilterCondition.Gte, '1.0.0', '1.0.0')).toBe(true);
36+
});
37+
38+
it('should return false for Gte condition when first version is less', () => {
39+
expect(filterVersion(FeatureConfigFilterCondition.Gte, '1.0.0', '1.0.1')).toBe(false);
40+
});
41+
42+
it('should return true for Lt condition when first version is less', () => {
43+
expect(filterVersion(FeatureConfigFilterCondition.Lt, '1.0.0', '1.0.1')).toBe(true);
44+
});
45+
46+
it('should return false for Lt condition when first version is not less', () => {
47+
expect(filterVersion(FeatureConfigFilterCondition.Lt, '1.0.1', '1.0.0')).toBe(false);
48+
});
49+
50+
it('should return true for Lte condition when first version is less', () => {
51+
expect(filterVersion(FeatureConfigFilterCondition.Lte, '1.0.0', '1.0.1')).toBe(true);
52+
});
53+
54+
it('should return true for Lte condition when versions are equal', () => {
55+
expect(filterVersion(FeatureConfigFilterCondition.Lte, '1.0.0', '1.0.0')).toBe(true);
56+
});
57+
58+
it('should return false for Lte condition when first version is greater', () => {
59+
expect(filterVersion(FeatureConfigFilterCondition.Lte, '1.0.1', '1.0.0')).toBe(false);
60+
});
61+
62+
it('should return false for unknown condition', () => {
63+
expect(filterVersion('UnknownCondition' as FeatureConfigFilterCondition, '1.0.0', '1.0.0')).toBe(false);
64+
});
65+
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { FeatureConfigFilterCondition } from 'src/modules/feature/model/features-config';
2+
import * as semverCompare from 'node-version-compare';
3+
4+
export const filterVersion = (cond: FeatureConfigFilterCondition, value: string, filterValue: string) => {
5+
const compareRes = semverCompare(value, filterValue);
6+
switch (cond) {
7+
case FeatureConfigFilterCondition.Eq:
8+
return compareRes === 0;
9+
case FeatureConfigFilterCondition.Neq:
10+
return compareRes !== 0;
11+
case FeatureConfigFilterCondition.Gt:
12+
return compareRes > 0;
13+
case FeatureConfigFilterCondition.Gte:
14+
return compareRes >= 0;
15+
case FeatureConfigFilterCondition.Lt:
16+
return compareRes < 0;
17+
case FeatureConfigFilterCondition.Lte:
18+
return compareRes <= 0;
19+
default:
20+
return false;
21+
}
22+
};

0 commit comments

Comments
 (0)