Skip to content

Commit 993ddec

Browse files
[AI-FSSDK] [FSSDK-12418] Remove experiment type validation from config parsing
1 parent 55924e5 commit 993ddec

3 files changed

Lines changed: 37 additions & 19 deletions

File tree

optimizely/entities.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
if TYPE_CHECKING:
2424
# prevent circular dependenacy by skipping import at runtime
25-
from .helpers.types import ExperimentDict, ExperimentType, TrafficAllocation, VariableDict, VariationDict, CmabDict
25+
from .helpers.types import ExperimentDict, TrafficAllocation, VariableDict, VariationDict, CmabDict
2626

2727

2828
class BaseEntity:
@@ -87,7 +87,7 @@ def __init__(
8787
groupId: Optional[str] = None,
8888
groupPolicy: Optional[str] = None,
8989
cmab: Optional[CmabDict] = None,
90-
type: Optional[ExperimentType] = None,
90+
type: Optional[str] = None,
9191
**kwargs: Any
9292
):
9393
self.id = id

optimizely/project_config.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -189,24 +189,7 @@ def __init__(self, datafile: str | bytes, logger: Logger, error_handler: Any):
189189
self.variation_key_map_by_experiment_id: dict[str, dict[str, Union[entities.Variation, VariationDict]]] = {}
190190
self.flag_variations_map: dict[str, list[entities.Variation]] = {}
191191

192-
valid_experiment_types = {
193-
enums.ExperimentTypes.ab,
194-
enums.ExperimentTypes.mab,
195-
enums.ExperimentTypes.cmab,
196-
enums.ExperimentTypes.td,
197-
enums.ExperimentTypes.fr,
198-
}
199192
for experiment in self.experiment_id_map.values():
200-
if experiment.type is not None and experiment.type not in valid_experiment_types:
201-
self.logger.error(
202-
f'Experiment "{experiment.key}" has invalid type "{experiment.type}". '
203-
f'Valid types: {valid_experiment_types}.'
204-
)
205-
self.error_handler.handle_error(
206-
exceptions.InvalidExperimentException(
207-
f'Invalid experiment type: {experiment.type}'
208-
)
209-
)
210193
self.experiment_key_map[experiment.key] = experiment
211194
self.variation_key_map[experiment.key] = self._generate_key_map(
212195
experiment.variations, 'key', entities.Variation

tests/test_config.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,6 +1651,41 @@ def test_experiment_type_field_none_when_missing(self):
16511651
experiment = config.experiment_id_map['exp_ab']
16521652
self.assertIsNone(experiment.type)
16531653

1654+
def test_unknown_experiment_type_accepted(self):
1655+
"""Test that experiments with unknown type values are accepted without error."""
1656+
datafile = self._build_datafile(
1657+
experiments=[
1658+
{
1659+
'id': 'exp_unknown',
1660+
'key': 'unknown_type_exp',
1661+
'status': 'Running',
1662+
'forcedVariations': {},
1663+
'layerId': 'layer_1',
1664+
'audienceIds': [],
1665+
'trafficAllocation': [{'entityId': 'var_1', 'endOfRange': 5000}],
1666+
'variations': [{'key': 'var_1', 'id': 'var_1', 'featureEnabled': True}],
1667+
'type': 'new_unknown_type',
1668+
},
1669+
],
1670+
feature_flags=[
1671+
{
1672+
'id': 'flag_1',
1673+
'key': 'test_flag',
1674+
'experimentIds': ['exp_unknown'],
1675+
'rolloutId': '',
1676+
'variables': [],
1677+
},
1678+
],
1679+
)
1680+
1681+
opt = optimizely.Optimizely(json.dumps(datafile))
1682+
config = opt.config_manager.get_config()
1683+
1684+
self.assertIsNotNone(config)
1685+
experiment = config.experiment_id_map['exp_unknown']
1686+
self.assertEqual(experiment.type, 'new_unknown_type')
1687+
self.assertEqual(experiment.key, 'unknown_type_exp')
1688+
16541689
def test_feature_rollout_injects_everyone_else_variation(self):
16551690
"""Test that feature_rollout experiments get the everyone else variation injected."""
16561691
datafile = self._build_datafile(

0 commit comments

Comments
 (0)