diff --git a/splitio/sync/split.py b/splitio/sync/split.py index 1d1722f6..e5d1f645 100644 --- a/splitio/sync/split.py +++ b/splitio/sync/split.py @@ -433,7 +433,8 @@ def _make_feature_flag(feature_flag_name, conditions, configs=None): 'defaultTreatment': 'control', 'algo': 2, 'conditions': conditions, - 'configurations': configs + 'configurations': configs, + 'prerequisites': [] }) @staticmethod @@ -542,6 +543,8 @@ def _sanitize_feature_flag_elements(self, parsed_feature_flags): if 'sets' not in feature_flag: feature_flag['sets'] = [] feature_flag['sets'] = validate_flag_sets(feature_flag['sets'], 'Localhost Validator') + if 'prerequisites' not in feature_flag: + feature_flag['prerequisites'] = [] sanitized_feature_flags.append(feature_flag) return sanitized_feature_flags @@ -560,6 +563,7 @@ def _sanitize_rb_segment_elements(self, parsed_rb_segments): if 'name' not in rb_segment or rb_segment['name'].strip() == '': _LOGGER.warning("A rule based segment in json file does not have (Name) or property is empty, skipping.") continue + for element in [('trafficTypeName', 'user', None, None, None, None), ('status', splits.Status.ACTIVE.value, None, None, [e.value for e in splits.Status], None), ('changeNumber', 0, 0, None, None, None)]: diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index bec5cd6f..845e8c72 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -3,7 +3,7 @@ rbsegments_json = [{"changeNumber": 12, "name": "some_segment", "status": "ACTIVE","trafficTypeName": "user","excluded":{"keys":[],"segments":[]},"conditions": []}] split11 = {"ff": {"t": 1675443569027, "s": -1, "d": [ - {"trafficTypeName": "user", "name": "SPLIT_2","trafficAllocation": 100,"trafficAllocationSeed": 1057590779, "seed": -113875324, "status": "ACTIVE","killed": False, "defaultTreatment": "off", "changeNumber": 1675443569027,"algo": 2, "configurations": {},"conditions": [{"conditionType": "ROLLOUT","matcherGroup": {"combiner": "AND","matchers": [{"keySelector": { "trafficType": "user", "attribute": None },"matcherType": "ALL_KEYS","negate": False,"userDefinedSegmentMatcherData": None,"whitelistMatcherData": None,"unaryNumericMatcherData": None,"betweenMatcherData": None,"booleanMatcherData": None,"dependencyMatcherData": None,"stringMatcherData": None}]},"partitions": [{ "treatment": "on", "size": 100 },{ "treatment": "off", "size": 0 }],"label": "default rule"}], "sets": ["set_1"], "impressionsDisabled": False}, + {"trafficTypeName": "user", "name": "SPLIT_2","trafficAllocation": 100,"trafficAllocationSeed": 1057590779, "seed": -113875324, "status": "ACTIVE","killed": False, "defaultTreatment": "off", "changeNumber": 1675443569027,"algo": 2, "configurations": {},"conditions": [{"conditionType": "ROLLOUT","matcherGroup": {"combiner": "AND","matchers": [{"keySelector": { "trafficType": "user", "attribute": None },"matcherType": "ALL_KEYS","negate": False,"userDefinedSegmentMatcherData": None,"whitelistMatcherData": None,"unaryNumericMatcherData": None,"betweenMatcherData": None,"booleanMatcherData": None,"dependencyMatcherData": None,"stringMatcherData": None}]},"partitions": [{ "treatment": "on", "size": 100 },{ "treatment": "off", "size": 0 }],"label": "default rule"}], "sets": ["set_1"], "impressionsDisabled": False, 'prerequisites': []}, {"trafficTypeName": "user", "name": "SPLIT_1", "trafficAllocation": 100, "trafficAllocationSeed": -1780071202,"seed": -1442762199, "status": "ACTIVE","killed": False, "defaultTreatment": "off", "changeNumber": 1675443537882,"algo": 2, "configurations": {},"conditions": [{"conditionType": "ROLLOUT", "matcherGroup": {"combiner": "AND","matchers": [{"keySelector": { "trafficType": "user", "attribute": None },"matcherType": "ALL_KEYS","negate": False,"userDefinedSegmentMatcherData": None,"whitelistMatcherData": None,"unaryNumericMatcherData": None,"betweenMatcherData": None,"booleanMatcherData": None,"dependencyMatcherData": None,"stringMatcherData": None}]},"partitions": [{ "treatment": "on", "size": 0 },{ "treatment": "off", "size": 100 }],"label": "default rule"}], "sets": ["set_1", "set_2"]}, {"trafficTypeName": "user", "name": "SPLIT_3","trafficAllocation": 100,"trafficAllocationSeed": 1057590779, "seed": -113875324, "status": "ACTIVE","killed": False, "defaultTreatment": "off", "changeNumber": 1675443569027,"algo": 2, "configurations": {},"conditions": [{"conditionType": "ROLLOUT","matcherGroup": {"combiner": "AND","matchers": [{"keySelector": { "trafficType": "user", "attribute": None },"matcherType": "ALL_KEYS","negate": False,"userDefinedSegmentMatcherData": None,"whitelistMatcherData": None,"unaryNumericMatcherData": None,"betweenMatcherData": None,"booleanMatcherData": None,"dependencyMatcherData": None,"stringMatcherData": None}]},"partitions": [{ "treatment": "on", "size": 100 },{ "treatment": "off", "size": 0 }],"label": "default rule"}], "sets": ["set_1"], "impressionsDisabled": True} ]}, "rbs": {"t": -1, "s": -1, "d": rbsegments_json}} diff --git a/tests/sync/test_splits_synchronizer.py b/tests/sync/test_splits_synchronizer.py index c0ea38fb..fd9ac585 100644 --- a/tests/sync/test_splits_synchronizer.py +++ b/tests/sync/test_splits_synchronizer.py @@ -1185,6 +1185,10 @@ def test_elements_sanitization(self, mocker): split[0]['algo'] = 1 assert (split_synchronizer._sanitize_feature_flag_elements(split)[0]['algo'] == 2) + split = splits_json["splitChange1_1"]['ff']['d'].copy() + del split[0]['prerequisites'] + assert (split_synchronizer._sanitize_feature_flag_elements(split)[0]['prerequisites'] == []) + # test 'status' is set to ACTIVE when None rbs = copy.deepcopy(json_body["rbs"]["d"]) rbs[0]['status'] = None