From cb28ea4f708cec179a0d0e81231ea03596f4249e Mon Sep 17 00:00:00 2001 From: Owais Akbani Date: Mon, 12 Mar 2018 23:37:14 +0500 Subject: [PATCH] sort enabled feature keys (#104) * :pen: sort enabled feature keys response * :pen: Dictionary values are called in different orders in python versions --- optimizely/optimizely.py | 3 ++- tests/test_optimizely.py | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/optimizely/optimizely.py b/optimizely/optimizely.py index 2d4ef288..183f224b 100644 --- a/optimizely/optimizely.py +++ b/optimizely/optimizely.py @@ -421,7 +421,7 @@ def get_enabled_features(self, user_id, attributes=None): attributes: Dict representing user attributes. Returns: - A list of the keys of the features that are enabled for the user. + A sorted list of the keys of the features that are enabled for the user. """ enabled_features = [] @@ -433,6 +433,7 @@ def get_enabled_features(self, user_id, attributes=None): if self.is_feature_enabled(feature.key, user_id, attributes): enabled_features.append(feature.key) + enabled_features.sort() return enabled_features def get_feature_variable_boolean(self, feature_key, variable_key, user_id, attributes=None): diff --git a/tests/test_optimizely.py b/tests/test_optimizely.py index 555e8b03..d0a25da4 100644 --- a/tests/test_optimizely.py +++ b/tests/test_optimizely.py @@ -1438,6 +1438,29 @@ def side_effect(*args, **kwargs): mock_is_feature_enabled.assert_any_call('test_feature_in_group', 'user_1', None) mock_is_feature_enabled.assert_any_call('test_feature_in_experiment_and_rollout', 'user_1', None) + def test_get_enabled_features_returns_a_sorted_list(self): + """ Test that get_enabled_features returns a sorted list of enabled feature keys. """ + + opt_obj = optimizely.Optimizely(json.dumps(self.config_dict_with_features)) + + with mock.patch('optimizely.optimizely.Optimizely.is_feature_enabled', + return_value=True) as mock_is_feature_enabled: + received_features = opt_obj.get_enabled_features('user_1') + + mock_is_feature_enabled.assert_any_call('test_feature_in_experiment', 'user_1', None) + mock_is_feature_enabled.assert_any_call('test_feature_in_rollout', 'user_1', None) + mock_is_feature_enabled.assert_any_call('test_feature_in_group', 'user_1', None) + mock_is_feature_enabled.assert_any_call('test_feature_in_experiment_and_rollout', 'user_1', None) + + expected_sorted_features = [ + 'test_feature_in_experiment', + 'test_feature_in_experiment_and_rollout', + 'test_feature_in_group', + 'test_feature_in_rollout' + ] + + self.assertEqual(expected_sorted_features, received_features) + def test_get_enabled_features__invalid_object(self): """ Test that get_enabled_features returns empty list if Optimizely object is not valid. """