Skip to content

Commit d18ba6b

Browse files
committed
Fixing unit tests
1 parent cd459e9 commit d18ba6b

File tree

4 files changed

+161
-26
lines changed

4 files changed

+161
-26
lines changed

optimizely/helpers/audience.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def does_user_meet_audience_conditions(
2727
config: project_config.ProjectConfig object representing the project.
2828
audience_conditions: Audience conditions corresponding to the experiment or rollout rule.
2929
experiment_or_rollout_rule: String representing whether entity being evaluated is experiment or rollout rule.
30-
logging_key: String representing experiment key or rollout rule's index. To be used in log messages only.
30+
logging_key: String representing experiment key or rollout rule. To be used in log messages only.
3131
attributes: Dict representing user attributes which will be used in determining
3232
if the audience conditions are met. If not provided, default to an empty dict.
3333
logger: Provides a logger to send log messages to.

tests/helpers_tests/test_audience.py

Lines changed: 120 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,46 @@ def test_does_user_meet_audience_conditions__no_audience(self):
3434
experiment.audienceIds = []
3535
experiment.audienceConditions = []
3636
self.assertStrictTrue(
37-
audience.does_user_meet_audience_conditions(self.project_config, experiment, user_attributes, self.mock_client_logger,)
37+
audience.does_user_meet_audience_conditions(
38+
self.project_config,
39+
experiment.get_audience_conditions_or_ids(),
40+
'experiment',
41+
'test_experiment',
42+
user_attributes,
43+
self.mock_client_logger
44+
)
3845
)
3946

4047
# Audience Ids exist but Audience Conditions is Empty
4148
experiment = self.project_config.get_experiment_from_key('test_experiment')
4249
experiment.audienceIds = ['11154']
4350
experiment.audienceConditions = []
4451
self.assertStrictTrue(
45-
audience.does_user_meet_audience_conditions(self.project_config, experiment, user_attributes, self.mock_client_logger,)
52+
audience.does_user_meet_audience_conditions(
53+
self.project_config,
54+
experiment.get_audience_conditions_or_ids(),
55+
'experiment',
56+
'test_experiment',
57+
user_attributes,
58+
self.mock_client_logger
59+
)
60+
4661
)
4762

4863
# Audience Ids is Empty and Audience Conditions is None
4964
experiment = self.project_config.get_experiment_from_key('test_experiment')
5065
experiment.audienceIds = []
5166
experiment.audienceConditions = None
5267
self.assertStrictTrue(
53-
audience.does_user_meet_audience_conditions(self.project_config, experiment, user_attributes, self.mock_client_logger,)
68+
audience.does_user_meet_audience_conditions(
69+
self.project_config,
70+
experiment.get_audience_conditions_or_ids(),
71+
'experiment',
72+
'test_experiment',
73+
user_attributes,
74+
self.mock_client_logger
75+
)
76+
5477
)
5578

5679
def test_does_user_meet_audience_conditions__with_audience(self):
@@ -72,7 +95,12 @@ def test_does_user_meet_audience_conditions__with_audience(self):
7295
['or', '3988293899', '3468206646', '3468206647', '3468206644', '3468206643'],
7396
]
7497
audience.does_user_meet_audience_conditions(
75-
self.project_config, experiment, user_attributes, self.mock_client_logger,
98+
self.project_config,
99+
experiment.get_audience_conditions_or_ids(),
100+
'experiment',
101+
'test_experiment',
102+
user_attributes,
103+
self.mock_client_logger
76104
)
77105

78106
self.assertEqual(experiment.audienceConditions, cond_tree_eval.call_args[0][0])
@@ -82,7 +110,12 @@ def test_does_user_meet_audience_conditions__with_audience(self):
82110

83111
experiment.audienceConditions = None
84112
audience.does_user_meet_audience_conditions(
85-
self.project_config, experiment, user_attributes, self.mock_client_logger,
113+
self.project_config,
114+
experiment.get_audience_conditions_or_ids(),
115+
'experiment',
116+
'test_experiment',
117+
user_attributes,
118+
self.mock_client_logger
86119
)
87120

88121
self.assertEqual(experiment.audienceIds, cond_tree_eval.call_args[0][0])
@@ -95,17 +128,31 @@ def test_does_user_meet_audience_conditions__no_attributes(self):
95128

96129
# attributes set to empty dict
97130
with mock.patch('optimizely.helpers.condition.CustomAttributeConditionEvaluator') as custom_attr_eval:
98-
audience.does_user_meet_audience_conditions(self.project_config, experiment, {}, self.mock_client_logger)
131+
audience.does_user_meet_audience_conditions(
132+
self.project_config,
133+
experiment.get_audience_conditions_or_ids(),
134+
'experiment',
135+
'test_experiment',
136+
{},
137+
self.mock_client_logger
138+
)
99139

100140
self.assertEqual({}, custom_attr_eval.call_args[0][1])
101141

102142
# attributes set to None
103143
with mock.patch('optimizely.helpers.condition.CustomAttributeConditionEvaluator') as custom_attr_eval:
104-
audience.does_user_meet_audience_conditions(self.project_config, experiment, None, self.mock_client_logger)
144+
audience.does_user_meet_audience_conditions(
145+
self.project_config,
146+
experiment.get_audience_conditions_or_ids(),
147+
'experiment',
148+
'test_experiment',
149+
None,
150+
self.mock_client_logger
151+
)
105152

106153
self.assertEqual({}, custom_attr_eval.call_args[0][1])
107154

108-
def test_does_user_meet_audience_conditions__returns_True__when_condition_tree_evaluator_returns_True(self,):
155+
def test_does_user_meet_audience_conditions__returns_true__when_condition_tree_evaluator_returns_true(self):
109156
""" Test that does_user_meet_audience_conditions returns True when call to condition_tree_evaluator returns True. """
110157

111158
user_attributes = {'test_attribute': 'test_value_1'}
@@ -114,11 +161,16 @@ def test_does_user_meet_audience_conditions__returns_True__when_condition_tree_e
114161

115162
self.assertStrictTrue(
116163
audience.does_user_meet_audience_conditions(
117-
self.project_config, experiment, user_attributes, self.mock_client_logger,
164+
self.project_config,
165+
experiment.get_audience_conditions_or_ids(),
166+
'experiment',
167+
'test_experiment',
168+
user_attributes,
169+
self.mock_client_logger
118170
)
119171
)
120172

121-
def test_does_user_meet_audience_conditions__returns_False__when_condition_tree_evaluator_returns_None_or_False(self,):
173+
def test_does_user_meet_audience_conditions__returns_false__when_condition_tree_evaluator_returns_none_or_false(self):
122174
""" Test that does_user_meet_audience_conditions returns False
123175
when call to condition_tree_evaluator returns None or False. """
124176

@@ -128,15 +180,25 @@ def test_does_user_meet_audience_conditions__returns_False__when_condition_tree_
128180

129181
self.assertStrictFalse(
130182
audience.does_user_meet_audience_conditions(
131-
self.project_config, experiment, user_attributes, self.mock_client_logger,
183+
self.project_config,
184+
experiment.get_audience_conditions_or_ids(),
185+
'experiment',
186+
'test_experiment',
187+
user_attributes,
188+
self.mock_client_logger
132189
)
133190
)
134191

135192
with mock.patch('optimizely.helpers.condition_tree_evaluator.evaluate', return_value=False):
136193

137194
self.assertStrictFalse(
138195
audience.does_user_meet_audience_conditions(
139-
self.project_config, experiment, user_attributes, self.mock_client_logger,
196+
self.project_config,
197+
experiment.get_audience_conditions_or_ids(),
198+
'experiment',
199+
'test_experiment',
200+
user_attributes,
201+
self.mock_client_logger
140202
)
141203
)
142204

@@ -149,7 +211,14 @@ def test_is_user_in_experiment__evaluates_audience_ids(self):
149211
experiment.audienceConditions = None
150212

151213
with mock.patch('optimizely.helpers.condition.CustomAttributeConditionEvaluator') as custom_attr_eval:
152-
audience.does_user_meet_audience_conditions(self.project_config, experiment, {}, self.mock_client_logger)
214+
audience.does_user_meet_audience_conditions(
215+
self.project_config,
216+
experiment.get_audience_conditions_or_ids(),
217+
'experiment',
218+
'test_experiment',
219+
{},
220+
self.mock_client_logger
221+
)
153222

154223
audience_11154 = self.project_config.get_audience('11154')
155224
audience_11159 = self.project_config.get_audience('11159')
@@ -178,7 +247,14 @@ def test_does_user_meet_audience_conditions__evaluates_audience_conditions(self)
178247
]
179248

180249
with mock.patch('optimizely.helpers.condition.CustomAttributeConditionEvaluator') as custom_attr_eval:
181-
audience.does_user_meet_audience_conditions(project_config, experiment, {}, self.mock_client_logger)
250+
audience.does_user_meet_audience_conditions(
251+
self.project_config,
252+
experiment.get_audience_conditions_or_ids(),
253+
'experiment',
254+
'audience_combinations_experiment',
255+
{},
256+
self.mock_client_logger
257+
)
182258

183259
audience_3468206642 = project_config.get_audience('3468206642')
184260
audience_3988293898 = project_config.get_audience('3988293898')
@@ -208,7 +284,14 @@ def test_does_user_meet_audience_conditions__evaluates_audience_conditions_leaf_
208284
experiment.audienceConditions = '3468206645'
209285

210286
with mock.patch('optimizely.helpers.condition.CustomAttributeConditionEvaluator') as custom_attr_eval:
211-
audience.does_user_meet_audience_conditions(project_config, experiment, {}, self.mock_client_logger)
287+
audience.does_user_meet_audience_conditions(
288+
self.project_config,
289+
experiment.get_audience_conditions_or_ids(),
290+
'experiment',
291+
'audience_combinations_experiment',
292+
{},
293+
self.mock_client_logger
294+
)
212295

213296
audience_3468206645 = project_config.get_audience('3468206645')
214297

@@ -232,7 +315,14 @@ def test_does_user_meet_audience_conditions__with_no_audience(self):
232315
experiment.audienceIds = []
233316
experiment.audienceConditions = []
234317

235-
audience.does_user_meet_audience_conditions(self.project_config, experiment, {}, self.mock_client_logger)
318+
audience.does_user_meet_audience_conditions(
319+
self.project_config,
320+
experiment.get_audience_conditions_or_ids(),
321+
'experiment',
322+
'test_experiment',
323+
{},
324+
self.mock_client_logger
325+
)
236326

237327
self.mock_client_logger.assert_has_calls(
238328
[
@@ -253,7 +343,12 @@ def test_is_user_in_experiment__evaluates_audience_ids(self):
253343
'optimizely.helpers.condition.CustomAttributeConditionEvaluator.evaluate', side_effect=[None, None],
254344
):
255345
audience.does_user_meet_audience_conditions(
256-
self.project_config, experiment, user_attributes, self.mock_client_logger,
346+
self.project_config,
347+
experiment.get_audience_conditions_or_ids(),
348+
'experiment',
349+
'test_experiment',
350+
user_attributes,
351+
self.mock_client_logger
257352
)
258353

259354
self.assertEqual(5, self.mock_client_logger.debug.call_count)
@@ -290,7 +385,14 @@ def test_does_user_meet_audience_conditions__evaluates_audience_conditions(self)
290385
with mock.patch(
291386
'optimizely.helpers.condition.CustomAttributeConditionEvaluator.evaluate', side_effect=[False, None, True],
292387
):
293-
audience.does_user_meet_audience_conditions(project_config, experiment, {}, self.mock_client_logger)
388+
audience.does_user_meet_audience_conditions(
389+
self.project_config,
390+
experiment.get_audience_conditions_or_ids(),
391+
'experiment',
392+
'audience_combinations_experiment',
393+
{},
394+
self.mock_client_logger
395+
)
294396

295397
self.assertEqual(7, self.mock_client_logger.debug.call_count)
296398
self.assertEqual(1, self.mock_client_logger.info.call_count)

tests/test_decision_service.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,12 @@ def test_get_variation__user_bucketed_for_new_experiment__user_profile_service_a
596596
mock_lookup.assert_called_once_with("test_user")
597597
self.assertEqual(1, mock_get_stored_variation.call_count)
598598
mock_audience_check.assert_called_once_with(
599-
self.project_config, experiment, None, mock_decision_service_logging
599+
self.project_config,
600+
experiment.get_audience_conditions_or_ids(),
601+
"experiment",
602+
"test_experiment",
603+
None,
604+
mock_decision_service_logging
600605
)
601606
mock_bucket.assert_called_once_with(
602607
self.project_config, experiment, "test_user", "test_user"
@@ -649,7 +654,12 @@ def test_get_variation__user_bucketed_for_new_experiment__user_profile_service_n
649654
self.assertEqual(0, mock_lookup.call_count)
650655
self.assertEqual(0, mock_get_stored_variation.call_count)
651656
mock_audience_check.assert_called_once_with(
652-
self.project_config, experiment, None, mock_decision_service_logging
657+
self.project_config,
658+
experiment.get_audience_conditions_or_ids(),
659+
"experiment",
660+
"test_experiment",
661+
None,
662+
mock_decision_service_logging
653663
)
654664
mock_bucket.assert_called_once_with(
655665
self.project_config, experiment, "test_user", "test_user"
@@ -693,7 +703,12 @@ def test_get_variation__user_does_not_meet_audience_conditions(self):
693703
self.project_config, experiment, user_profile.UserProfile("test_user")
694704
)
695705
mock_audience_check.assert_called_once_with(
696-
self.project_config, experiment, None, mock_decision_service_logging
706+
self.project_config,
707+
experiment.get_audience_conditions_or_ids(),
708+
"experiment",
709+
"test_experiment",
710+
None,
711+
mock_decision_service_logging
697712
)
698713
self.assertEqual(0, mock_bucket.call_count)
699714
self.assertEqual(0, mock_save.call_count)
@@ -735,7 +750,12 @@ def test_get_variation__user_profile_in_invalid_format(self):
735750
# Stored decision is not consulted as user profile is invalid
736751
self.assertEqual(0, mock_get_stored_variation.call_count)
737752
mock_audience_check.assert_called_once_with(
738-
self.project_config, experiment, None, mock_decision_service_logging
753+
self.project_config,
754+
experiment.get_audience_conditions_or_ids(),
755+
"experiment",
756+
"test_experiment",
757+
None,
758+
mock_decision_service_logging
739759
)
740760
mock_decision_service_logging.warning.assert_called_once_with(
741761
"User profile has invalid format."
@@ -787,7 +807,12 @@ def test_get_variation__user_profile_lookup_fails(self):
787807
# Stored decision is not consulted as lookup failed
788808
self.assertEqual(0, mock_get_stored_variation.call_count)
789809
mock_audience_check.assert_called_once_with(
790-
self.project_config, experiment, None, mock_decision_service_logging
810+
self.project_config,
811+
experiment.get_audience_conditions_or_ids(),
812+
"experiment",
813+
"test_experiment",
814+
None,
815+
mock_decision_service_logging
791816
)
792817
mock_decision_service_logging.exception.assert_called_once_with(
793818
'Unable to retrieve user profile for user "test_user" as lookup failed.'
@@ -893,7 +918,12 @@ def test_get_variation__ignore_user_profile_when_specified(self):
893918
self.project_config, experiment, "test_user"
894919
)
895920
mock_audience_check.assert_called_once_with(
896-
self.project_config, experiment, None, mock_decision_service_logging
921+
self.project_config,
922+
experiment.get_audience_conditions_or_ids(),
923+
"experiment",
924+
"test_experiment",
925+
None,
926+
mock_decision_service_logging
897927
)
898928
mock_bucket.assert_called_once_with(
899929
self.project_config, experiment, "test_user", "test_user"

tests/test_optimizely.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1033,9 +1033,12 @@ def test_activate__with_attributes__no_audience_match(self):
10331033
self.assertIsNone(
10341034
self.optimizely.activate('test_experiment', 'test_user', attributes={'test_attribute': 'test_value'},)
10351035
)
1036+
expected_experiment = self.project_config.get_experiment_from_key('test_experiment')
10361037
mock_audience_check.assert_called_once_with(
10371038
self.project_config,
1038-
self.project_config.get_experiment_from_key('test_experiment'),
1039+
expected_experiment.get_audience_conditions_or_ids(),
1040+
'experiment',
1041+
'test_experiment',
10391042
{'test_attribute': 'test_value'},
10401043
self.optimizely.logger,
10411044
)

0 commit comments

Comments
 (0)