def test_conversion_event(self): project_config = self.project_config user_id = 'test_user' event_key = 'test_event' user_attributes = {'test_attribute': 'test_value', 'boolean_key': True} conversion_event = UserEventFactory.create_conversion_event( project_config, event_key, user_id, user_attributes, None) expected_attrs = EventFactory.build_attribute_list( user_attributes, project_config) self.assertEqual(self.project_config.project_id, conversion_event.event_context.project_id) self.assertEqual(self.project_config.revision, conversion_event.event_context.revision) self.assertEqual(self.project_config.account_id, conversion_event.event_context.account_id) self.assertEqual( self.project_config.anonymize_ip, conversion_event.event_context.anonymize_ip, ) self.assertEqual(self.project_config.bot_filtering, conversion_event.bot_filtering) self.assertEqual(self.project_config.get_event(event_key), conversion_event.event) self.assertEqual(user_id, conversion_event.user_id) self.assertEqual( [x.__dict__ for x in expected_attrs], [x.__dict__ for x in conversion_event.visitor_attributes], )
def test_create_conversion_event__with_user_agent_when_bot_filtering_is_disabled(self,): """ Test that create_conversion_event creates Event object with right params when user agent attribute is provided and bot filtering is disabled """ expected_params = { 'account_id': '12001', 'project_id': '111001', 'visitors': [ { 'visitor_id': 'test_user', 'attributes': [ { 'type': 'custom', 'value': 'Chrome', 'entity_id': '$opt_user_agent', 'key': '$opt_user_agent', }, { 'type': 'custom', 'value': False, 'entity_id': '$opt_bot_filtering', 'key': '$opt_bot_filtering', }, ], 'snapshots': [ { 'events': [ { 'timestamp': 42123, 'entity_id': '111095', 'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', 'key': 'test_event', } ] } ], } ], 'client_name': 'python-sdk', 'client_version': version.__version__, 'enrich_decisions': True, 'anonymize_ip': False, 'revision': '42', } with mock.patch('time.time', return_value=42.123), mock.patch( 'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c' ), mock.patch( 'optimizely.project_config.ProjectConfig.get_bot_filtering_value', return_value=False, ): event_obj = UserEventFactory.create_conversion_event( self.project_config, 'test_event', 'test_user', {'$opt_user_agent': 'Chrome'}, None, ) log_event = EventFactory.create_log_event(event_obj, self.logger) self._validate_event_object( log_event, EventFactory.EVENT_ENDPOINT, expected_params, EventFactory.HTTP_VERB, EventFactory.HTTP_HEADERS, )
def test_impression_event__with_attributes(self): project_config = self.project_config experiment = self.project_config.get_experiment_from_key( 'test_experiment') variation = self.project_config.get_variation_from_id( experiment.key, '111128') user_id = 'test_user' user_attributes = {'test_attribute': 'test_value', 'boolean_key': True} impression_event = UserEventFactory.create_impression_event( project_config, experiment, '111128', user_id, user_attributes) expected_attrs = EventFactory.build_attribute_list( user_attributes, project_config) self.assertEqual(self.project_config.project_id, impression_event.event_context.project_id) self.assertEqual(self.project_config.revision, impression_event.event_context.revision) self.assertEqual(self.project_config.account_id, impression_event.event_context.account_id) self.assertEqual( self.project_config.anonymize_ip, impression_event.event_context.anonymize_ip, ) self.assertEqual(self.project_config.bot_filtering, impression_event.bot_filtering) self.assertEqual(experiment, impression_event.experiment) self.assertEqual(variation, impression_event.variation) self.assertEqual(user_id, impression_event.user_id) self.assertEqual( [x.__dict__ for x in expected_attrs], [x.__dict__ for x in impression_event.visitor_attributes], )
def test_create_impression_event(self): """ Test that create_impression_event creates LogEvent object with right params. """ expected_params = { 'account_id': '12001', 'project_id': '111001', 'visitors': [ { 'visitor_id': 'test_user', 'attributes': [], 'snapshots': [ { 'decisions': [ {'variation_id': '111129', 'experiment_id': '111127', 'campaign_id': '111182', 'metadata': {'flag_key': '', 'rule_key': 'rule_key', 'rule_type': 'experiment', 'variation_key': 'variation', 'enabled': False}} ], 'events': [ { 'timestamp': 42123, 'entity_id': '111182', 'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', 'key': 'campaign_activated', } ], } ], } ], 'client_name': 'python-sdk', 'client_version': version.__version__, 'enrich_decisions': True, 'anonymize_ip': False, 'revision': '42', } with mock.patch('time.time', return_value=42.123), mock.patch( 'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c' ): event_obj = UserEventFactory.create_impression_event( self.project_config, self.project_config.get_experiment_from_key('test_experiment'), '111129', '', 'rule_key', 'experiment', False, 'test_user', None, ) log_event = EventFactory.create_log_event(event_obj, self.logger) self._validate_event_object( log_event, EventFactory.EVENT_ENDPOINT, expected_params, EventFactory.HTTP_VERB, EventFactory.HTTP_HEADERS, )
def test_create_conversion_event__when_event_is_used_in_multiple_experiments(self): """ Test that create_conversion_event creates Event object with right params when multiple experiments use the same event. """ expected_params = { 'client_version': version.__version__, 'project_id': '111001', 'visitors': [ { 'attributes': [ {'entity_id': '111094', 'type': 'custom', 'value': 'test_value', 'key': 'test_attribute'} ], 'visitor_id': 'test_user', 'snapshots': [ { 'events': [ { 'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', 'tags': {'non-revenue': 'abc', 'revenue': 4200, 'value': 1.234}, 'timestamp': 42123, 'revenue': 4200, 'value': 1.234, 'key': 'test_event', 'entity_id': '111095', } ] } ], } ], 'account_id': '12001', 'client_name': 'python-sdk', 'enrich_decisions': True, 'anonymize_ip': False, 'revision': '42', } with mock.patch('time.time', return_value=42.123), mock.patch( 'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c' ): event_obj = UserEventFactory.create_conversion_event( self.project_config, 'test_event', 'test_user', {'test_attribute': 'test_value'}, {'revenue': 4200, 'value': 1.234, 'non-revenue': 'abc'}, ) log_event = EventFactory.create_log_event(event_obj, self.logger) self._validate_event_object( log_event, EventFactory.EVENT_ENDPOINT, expected_params, EventFactory.HTTP_VERB, EventFactory.HTTP_HEADERS, )
def test_event_processor__dispatch_raises_exception(self): """ Test that process logs dispatch failure gracefully. """ user_event = self._build_conversion_event(self.event_name) log_event = EventFactory.create_log_event(user_event, self.optimizely.logger) with mock.patch.object(self.optimizely, 'logger') as mock_client_logging, mock.patch.object( self.event_dispatcher, 'dispatch_event', side_effect=Exception('Failed to send.'), ): event_processor = ForwardingEventProcessor( self.event_dispatcher, mock_client_logging, self.notification_center ) event_processor.process(user_event) mock_client_logging.exception.assert_called_once_with( 'Error dispatching event: ' + str(log_event) + ' Failed to send.' )
def test_create_conversion_event(self): """ Test that create_conversion_event creates Event object with right params when no attributes are provided. """ expected_params = { 'account_id': '12001', 'project_id': '111001', 'visitors': [ { 'visitor_id': 'test_user', 'attributes': [], 'snapshots': [ { 'events': [ { 'timestamp': 42123, 'entity_id': '111095', 'uuid': 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c', 'key': 'test_event', } ] } ], } ], 'client_name': 'python-sdk', 'client_version': version.__version__, 'enrich_decisions': True, 'anonymize_ip': False, 'revision': '42', } with mock.patch('time.time', return_value=42.123), mock.patch( 'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c' ): event_obj = UserEventFactory.create_conversion_event( self.project_config, 'test_event', 'test_user', None, None ) log_event = EventFactory.create_log_event(event_obj, self.logger) self._validate_event_object( log_event, EventFactory.EVENT_ENDPOINT, expected_params, EventFactory.HTTP_VERB, EventFactory.HTTP_HEADERS, )
def side_effect(*args, **kwargs): attribute_key = args[0] if attribute_key == 'boolean_key' or attribute_key == 'double_key': return True return False attributes = { 'test_attribute': 'test_value', 'boolean_key': True, 'integer_key': 0, 'double_key': 5.5, } with mock.patch('time.time', return_value=42.123), mock.patch( 'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c' ), mock.patch( 'optimizely.helpers.validator.is_attribute_valid', side_effect=side_effect, ): event_obj = UserEventFactory.create_impression_event( self.project_config, self.project_config.get_experiment_from_key('test_experiment'), '111129', '', 'experiment', 'test_user', attributes, ) log_event = EventFactory.create_log_event(event_obj, self.logger) self._validate_event_object( log_event, EventFactory.EVENT_ENDPOINT, expected_params, EventFactory.HTTP_VERB, EventFactory.HTTP_HEADERS, )