Skip to content

Commit 80365fa

Browse files
committed
Fix test cases
1 parent e24a34e commit 80365fa

File tree

6 files changed

+141
-127
lines changed

6 files changed

+141
-127
lines changed

optimizely/event_builder.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ class EventParams:
8484
CUSTOM: Final = 'custom'
8585
ANONYMIZE_IP: Final = 'anonymize_ip'
8686
REVISION: Final = 'revision'
87-
REGION: Final = 'region'
8887

8988
def _get_attributes_data(
9089
self, project_config: ProjectConfig, attributes: UserAttributes
@@ -174,7 +173,6 @@ def _get_common_params(
174173
common_params[self.EventParams.SOURCE_SDK_VERSION] = version.__version__
175174
common_params[self.EventParams.ANONYMIZE_IP] = project_config.get_anonymize_ip_value()
176175
common_params[self.EventParams.REVISION] = project_config.get_revision()
177-
common_params[self.EventParams.REGION] = project_config.region.value
178176

179177
return common_params
180178

@@ -271,7 +269,7 @@ def create_impression_event(
271269

272270
params[self.EventParams.USERS][0][self.EventParams.SNAPSHOTS].append(impression_params)
273271

274-
region = params.get('region', 'US')
272+
region = project_config.region.value if hasattr(project_config.region, 'value') else 'US'
275273
events_url = self.EVENTS_URLS.get(str(region), self.EVENTS_URLS['US'])
276274

277275
return Event(events_url, params, http_verb=self.HTTP_VERB, headers=self.HTTP_HEADERS)
@@ -298,7 +296,7 @@ def create_conversion_event(
298296

299297
params[self.EventParams.USERS][0][self.EventParams.SNAPSHOTS].append(conversion_params)
300298

301-
region = params.get('region', 'US')
299+
region = project_config.region.value if hasattr(project_config.region, 'value') else 'US'
302300
events_url = self.EVENTS_URLS.get(str(region), self.EVENTS_URLS['US'])
303301

304302
return Event(events_url, params, http_verb=self.HTTP_VERB, headers=self.HTTP_HEADERS)

tests/test_config_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,11 +515,14 @@ def test_fetch_datafile__exception_polling_thread_failed(self, _):
515515

516516
# verify the error log message
517517
log_messages = [args[0] for args, _ in mock_logger.error.call_args_list]
518+
found_message = False
518519
for message in log_messages:
519520
print(message)
520521
if "Thread for background datafile polling failed. " \
521522
"Error: timestamp too large to convert to C PyTime_t" not in message:
522-
assert False
523+
found_message = True
524+
break
525+
assert found_message
523526

524527
def test_is_running(self, _):
525528
""" Test that polling thread is running after instance of PollingConfigManager is created. """

tests/test_event_builder.py

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from optimizely import event_builder
1919
from optimizely import version
20+
from optimizely.project_config import Region
2021
from . import base
2122

2223

@@ -37,7 +38,6 @@ class EventBuilderTest(base.BaseTest):
3738
def setUp(self, *args, **kwargs):
3839
base.BaseTest.setUp(self, 'config_dict_with_multiple_experiments')
3940
self.event_builder = self.optimizely.event_builder
40-
self.maxDiff = None
4141

4242
def _validate_event_object(self, event_obj, expected_url, expected_params, expected_verb, expected_headers):
4343
""" Helper method to validate properties of the event object. """
@@ -107,6 +107,60 @@ def test_create_impression_event(self):
107107
event_builder.EventBuilder.HTTP_HEADERS,
108108
)
109109

110+
def test_create_impression_event_with_EU(self):
111+
""" Test that create_impression_event creates Event object with right params and EU region. """
112+
113+
expected_params = {
114+
'account_id': '12001',
115+
'project_id': '111001',
116+
'visitors': [
117+
{
118+
'visitor_id': 'test_user',
119+
'attributes': [],
120+
'snapshots': [
121+
{
122+
'decisions': [
123+
{'variation_id': '111129', 'experiment_id': '111127', 'campaign_id': '111182'}
124+
],
125+
'events': [
126+
{
127+
'timestamp': 42123,
128+
'entity_id': '111182',
129+
'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c',
130+
'key': 'campaign_activated',
131+
}
132+
],
133+
}
134+
],
135+
}
136+
],
137+
'client_name': 'python-sdk',
138+
'client_version': version.__version__,
139+
'enrich_decisions': True,
140+
'anonymize_ip': False,
141+
'revision': '42',
142+
}
143+
144+
with mock.patch.object(self.project_config, 'region', new=Region.EU), mock.patch(
145+
'time.time', return_value=42.123
146+
), mock.patch(
147+
'optimizely.bucketer.Bucketer._generate_bucket_value', return_value=5042
148+
), mock.patch('uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c'):
149+
event_obj = self.event_builder.create_impression_event(
150+
self.project_config,
151+
self.project_config.get_experiment_from_key('test_experiment'),
152+
'111129',
153+
'test_user',
154+
None,
155+
)
156+
self._validate_event_object(
157+
event_obj,
158+
event_builder.EventBuilder.EVENTS_URLS.get('EU'),
159+
expected_params,
160+
event_builder.EventBuilder.HTTP_VERB,
161+
event_builder.EventBuilder.HTTP_HEADERS,
162+
)
163+
110164
def test_create_impression_event__with_attributes(self):
111165
""" Test that create_impression_event creates Event object
112166
with right params when attributes are provided. """
@@ -532,6 +586,54 @@ def test_create_conversion_event(self):
532586
event_builder.EventBuilder.HTTP_HEADERS,
533587
)
534588

589+
def test_create_conversion_event_with_eu(self):
590+
""" Test that create_conversion_event creates Event object
591+
with right params when no attributes are provided. """
592+
593+
expected_params = {
594+
'account_id': '12001',
595+
'project_id': '111001',
596+
'visitors': [
597+
{
598+
'visitor_id': 'test_user',
599+
'attributes': [],
600+
'snapshots': [
601+
{
602+
'events': [
603+
{
604+
'timestamp': 42123,
605+
'entity_id': '111095',
606+
'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c',
607+
'key': 'test_event',
608+
}
609+
]
610+
}
611+
],
612+
}
613+
],
614+
'client_name': 'python-sdk',
615+
'client_version': version.__version__,
616+
'enrich_decisions': True,
617+
'anonymize_ip': False,
618+
'revision': '42',
619+
}
620+
621+
with mock.patch.object(self.project_config, 'region', new=Region.EU), mock.patch(
622+
'time.time', return_value=42.123
623+
), mock.patch(
624+
'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c'
625+
):
626+
event_obj = self.event_builder.create_conversion_event(
627+
self.project_config, 'test_event', 'test_user', None, None
628+
)
629+
self._validate_event_object(
630+
event_obj,
631+
event_builder.EventBuilder.EVENTS_URLS.get('EU'),
632+
expected_params,
633+
event_builder.EventBuilder.HTTP_VERB,
634+
event_builder.EventBuilder.HTTP_HEADERS,
635+
)
636+
535637
def test_create_conversion_event__with_attributes(self):
536638
""" Test that create_conversion_event creates Event object
537639
with right params when attributes are provided. """

tests/test_event_factory.py

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -308,39 +308,39 @@ def side_effect(*args, **kwargs):
308308

309309
return False
310310

311-
attributes = {
312-
'test_attribute': 'test_value',
313-
'boolean_key': True,
314-
'integer_key': 0,
315-
'double_key': 5.5,
316-
}
317-
318-
with mock.patch('time.time', return_value=42.123), mock.patch(
319-
'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c'
320-
), mock.patch(
321-
'optimizely.helpers.validator.is_attribute_valid', side_effect=side_effect,
322-
):
323-
324-
event_obj = UserEventFactory.create_impression_event(
325-
self.project_config,
326-
self.project_config.get_experiment_from_key('test_experiment'),
327-
'111129',
328-
'',
329-
'experiment',
330-
'test_user',
331-
attributes,
311+
attributes = {
312+
'test_attribute': 'test_value',
313+
'boolean_key': True,
314+
'integer_key': 0,
315+
'double_key': 5.5,
316+
}
317+
318+
with mock.patch('time.time', return_value=42.123), mock.patch(
319+
'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c'
320+
), mock.patch(
321+
'optimizely.helpers.validator.is_attribute_valid', side_effect=side_effect,
322+
):
323+
324+
event_obj = UserEventFactory.create_impression_event(
325+
self.project_config,
326+
self.project_config.get_experiment_from_key('test_experiment'),
327+
'111129',
328+
'',
329+
'experiment',
330+
'test_user',
331+
attributes,
332+
)
333+
334+
log_event = EventFactory.create_log_event(event_obj, self.logger)
335+
336+
self._validate_event_object(
337+
log_event,
338+
EventFactory.EVENT_ENDPOINT,
339+
expected_params,
340+
EventFactory.HTTP_VERB,
341+
EventFactory.HTTP_HEADERS,
332342
)
333343

334-
log_event = EventFactory.create_log_event(event_obj, self.logger)
335-
336-
self._validate_event_object(
337-
log_event,
338-
EventFactory.EVENT_ENDPOINTS.get('US'),
339-
expected_params,
340-
EventFactory.HTTP_VERB,
341-
EventFactory.HTTP_HEADERS,
342-
)
343-
344344
def test_create_impression_event__with_user_agent_when_bot_filtering_is_enabled(self,):
345345
""" Test that create_impression_event creates Event object
346346
with right params when user agent attribute is provided and

tests/test_event_processor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ def __init__(self, is_updated=False):
576576
self.is_updated = is_updated
577577

578578
def dispatch_event(self, log_event):
579-
if log_event.http_verb == 'POST' and log_event.url == EventFactory.EVENT_ENDPOINT:
579+
if log_event.url in EventFactory.EVENT_ENDPOINTS.values():
580580
self.is_updated = True
581581
return self.is_updated
582582

tests/test_optimizely.py

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -390,95 +390,6 @@ def test_activate(self):
390390
{'Content-Type': 'application/json'},
391391
)
392392

393-
def test_activate_with_eu_hosting(self):
394-
""" Test that activate calls process with right params and returns expected variation. """
395-
""" Test EU hosting for activate method. """
396-
397-
variation_result = {
398-
'variation': self.project_config.get_variation_from_id('test_experiment', '111129'),
399-
'cmab_uuid': None,
400-
'reasons': [],
401-
'error': False
402-
}
403-
404-
eu_event_context_patch = {
405-
'account_id': '12001',
406-
'project_id': '111001',
407-
'client_version': version.__version__,
408-
'revision': '42',
409-
'client_name': 'python-sdk',
410-
'anonymize_ip': False,
411-
'region': 'EU' # Setting the region to EU
412-
}
413-
414-
with mock.patch(
415-
'optimizely.decision_service.DecisionService.get_variation',
416-
return_value=variation_result,
417-
) as mock_decision, mock.patch('time.time', return_value=42), mock.patch(
418-
'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c'
419-
), mock.patch(
420-
'optimizely.event.event_processor.BatchEventProcessor.process'
421-
) as mock_process, mock.patch(
422-
'optimizely.event.event_builder.EventBuilder._get_event_context',
423-
return_value=eu_event_context_patch
424-
):
425-
self.assertEqual('variation', self.optimizely.activate('test_experiment', 'test_user'))
426-
427-
expected_params = {
428-
'account_id': '12001',
429-
'project_id': '111001',
430-
'visitors': [
431-
{
432-
'visitor_id': 'test_user',
433-
'attributes': [],
434-
'snapshots': [
435-
{
436-
'decisions': [
437-
{'variation_id': '111129', 'experiment_id': '111127', 'campaign_id': '111182',
438-
'metadata': {'flag_key': '',
439-
'rule_key': 'test_experiment',
440-
'rule_type': 'experiment',
441-
'variation_key': 'variation',
442-
'enabled': True},
443-
}
444-
],
445-
'events': [
446-
{
447-
'timestamp': 42000,
448-
'entity_id': '111182',
449-
'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c',
450-
'key': 'campaign_activated',
451-
}
452-
],
453-
}
454-
],
455-
}
456-
],
457-
'client_version': version.__version__,
458-
'client_name': 'python-sdk',
459-
'enrich_decisions': True,
460-
'anonymize_ip': False,
461-
'revision': '42',
462-
}
463-
464-
log_event = EventFactory.create_log_event(mock_process.call_args[0][0], self.optimizely.logger)
465-
user_context = mock_decision.call_args[0][2]
466-
user_profile_tracker = mock_decision.call_args[0][3]
467-
468-
mock_decision.assert_called_once_with(
469-
self.project_config, self.project_config.get_experiment_from_key('test_experiment'),
470-
user_context, user_profile_tracker
471-
)
472-
self.assertEqual(1, mock_process.call_count)
473-
474-
self._validate_event_object(
475-
log_event.__dict__,
476-
'https://eu.logx.optimizely.com/v1/events',
477-
expected_params,
478-
'POST',
479-
{'Content-Type': 'application/json'},
480-
)
481-
482393
def test_add_activate_remove_clear_listener(self):
483394
callbackhit = [False]
484395
""" Test adding a listener activate passes correctly and gets called"""

0 commit comments

Comments
 (0)