def test_synchronous(self): client = Client('testsecret', sync_mode=True) success, message = client.identify('userId') self.assertIsNone(client.consumer) self.assertTrue(client.queue.empty()) self.assertTrue(success)
def test_synchronous(self): client = Client('testsecret', sync_mode=True) success, _ = client.identify('userId') self.assertFalse(client.consumers) self.assertTrue(client.queue.empty()) self.assertTrue(success)
def test_overflow(self): client = Client('testsecret', max_queue_size=1) client.consumer.pause() time.sleep(5.1) # allow time for consumer to exit client.identify('userId') success, msg = client.identify('userId') self.assertFalse(success)
def test_synchronous(self): # Max queue size at 0 -> synchronous mode client = Client('testsecret', max_queue_size=0) # Ensure the consumer thread is not running client.consumer.pause() success, message = client.identify('userId') self.assertTrue(client.queue.empty()) self.assertTrue(success)
def test_overflow(self): client = Client('testsecret', max_queue_size=1) client.consumer.pause() time.sleep(5.1) # allow time for consumer to exit for i in range(10): client.identify('userId') success, msg = client.identify('userId') self.assertFalse(success)
def test_user_defined_upload_size(self): client = Client('testsecret', on_error=self.fail, upload_size=10, upload_interval=3) def mock_post_fn(*args, **kwargs): self.assertEquals(len(kwargs['batch']), 10) # the post function should be called 2 times, with a batch size of 10 # each time. with mock.patch('analytics.consumer.post', side_effect=mock_post_fn) as mock_post: for _ in range(20): client.identify('userId', {'trait': 'value'}) time.sleep(1) self.assertEquals(mock_post.call_count, 2)
def init(secret, **kwargs): """Create a default instance of a analytics-python client :param str secret: The Segment.io API Secret Kwargs: :param logging.LOG_LEVEL log_level: The logging log level for the client talks to. Use log_level=logging.DEBUG to troubleshoot : param bool log: False to turn off logging completely, True by default : param int flush_at: Specicies after how many messages the client will flush to the server. Use flush_at=1 to disable batching : param datetime.timedelta flush_after: Specifies after how much time of no flushing that the server will flush. Used in conjunction with the flush_at size policy : param bool async: True to have the client flush to the server on another thread, therefore not blocking code (this is the default). False to enable blocking and making the request on the calling thread. """ from analytics.client import Client # if we have already initialized, no-op if hasattr(this_module, 'default_client'): return default_client = Client(secret=secret, stats=stats, **kwargs) setattr(this_module, 'default_client', default_client)
def get_client(secret): '''Returns or creates a new client by the secret''' if secret not in clients: clients[secret] = Client(secret) return clients[secret]
def test_user_defined_flush_at(self): client = Client('testsecret', on_error=self.fail, flush_at=10, flush_interval=3) def mock_post_fn(*args, **kwargs): self.assertEqual(len(kwargs['batch']), 10) # the post function should be called 2 times, with a batch size of 10 # each time. with mock.patch('analytics.consumer.post', side_effect=mock_post_fn) \ as mock_post: for _ in range(20): client.identify('userId', {'trait': 'value'}) time.sleep(1) self.assertEqual(mock_post.call_count, 2)
def _proxy(method, *args, **kwargs): """Create an analytics client if one doesn't exist and send to it.""" global default_client if not default_client: default_client = Client(write_key, host=host, debug=debug, on_error=on_error, send=send) fn = getattr(default_client, method) fn(*args, **kwargs)
class SegmentWrapper(AbstractBaseIdentityIntegrationWrapper): def __init__(self, api_key: str): self.analytics = SegmentClient(write_key=api_key) def _identify_user(self, data: dict) -> None: self.analytics.identify(**data) logger.debug(f"Sent event to Segment.") def generate_user_data(self, user_id, feature_states): return { "user_id": user_id, "traits": { feature_state.feature.name: feature_state.get_feature_state_value() if feature_state.get_feature_state_value() is not None else "None" for feature_state in feature_states }, }
class SegmentWrapper(AbstractBaseIdentityIntegrationWrapper): def __init__(self, api_key: str): self.analytics = SegmentClient(write_key=api_key) def _identify_user(self, data: dict) -> None: self.analytics.identify(**data) logger.debug(f"Sent event to Segment.") def generate_user_data(self, user_id, feature_states): feature_properties = {} for feature_state in feature_states: value = feature_state.get_feature_state_value() feature_properties[feature_state.feature.name] = ( value if (feature_state.enabled and value) else feature_state.enabled ) return { "user_id": user_id, "traits": feature_properties, }
def test_overflow(self): client = Client('testsecret', max_queue_size=1) # Ensure consumer thread is no longer uploading client.join() for _ in range(10): client.identify('userId') success, _ = client.identify('userId') # Make sure we are informed that the queue is at capacity self.assertFalse(success)
def test_overflow(self): client = Client('testsecret', max_queue_size=1) # Ensure consumer thread is no longer uploading client.join() for i in range(10): client.identify('userId') success, msg = client.identify('userId') # Make sure we are informed that the queue is at capacity self.assertFalse(success)
def _proxy(method, *args, **kwargs): """Create an analytics client if one doesn't exist and send to it.""" global default_client if not default_client: default_client = Client(write_key, host=host, debug=debug, max_queue_size=max_queue_size, send=send, on_error=on_error, gzip=gzip, max_retries=max_retries, sync_mode=sync_mode, timeout=timeout) fn = getattr(default_client, method) fn(*args, **kwargs)
class TestClient(unittest.TestCase): def fail(self, e, batch): """Mark the failure handler""" self.failed = True def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail) def test_requires_write_key(self): self.assertRaises(AssertionError, Client) def test_empty_flush(self): self.client.flush() def test_basic_track(self): client = self.client success, msg = client.track('userId', 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['event'], 'python test event') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['properties'], {}) self.assertEqual(msg['type'], 'track') def test_stringifies_user_id(self): # A large number that loses precision in node: # node -e "console.log(157963456373623802 + 1)" > 157963456373623800 client = self.client success, msg = client.track(user_id=157963456373623802, event='python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['userId'], '157963456373623802') self.assertEqual(msg['anonymousId'], None) def test_stringifies_anonymous_id(self): # A large number that loses precision in node: # node -e "console.log(157963456373623803 + 1)" > 157963456373623800 client = self.client success, msg = client.track(anonymous_id=157963456373623803, event='python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['userId'], None) self.assertEqual(msg['anonymousId'], '157963456373623803') def test_advanced_track(self): client = self.client success, msg = client.track('userId', 'python test event', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['event'], 'python test event') self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'track') def test_basic_identify(self): client = self.client success, msg = client.identify('userId', {'trait': 'value'}) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_advanced_identify(self): client = self.client success, msg = client.identify('userId', {'trait': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_basic_group(self): client = self.client success, msg = client.group('userId', 'groupId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['groupId'], 'groupId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_advanced_group(self): client = self.client success, msg = client.group('userId', 'groupId', {'trait': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_basic_alias(self): client = self.client success, msg = client.alias('previousId', 'userId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['previousId'], 'previousId') self.assertEqual(msg['userId'], 'userId') def test_basic_page(self): client = self.client success, msg = client.page('userId', name='name') self.assertFalse(self.failed) client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_advanced_page(self): client = self.client success, msg = client.page('userId', 'category', 'name', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['category'], 'category') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_basic_screen(self): client = self.client success, msg = client.screen('userId', name='name') client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_advanced_screen(self): client = self.client success, msg = client.screen('userId', 'category', 'name', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['category'], 'category') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_flush(self): client = self.client # set up the consumer with more requests than a single batch will allow for _ in range(1000): _, _ = client.identify('userId', {'trait': 'value'}) # We can't reliably assert that the queue is non-empty here; that's # a race condition. We do our best to load it up though. client.flush() # Make sure that the client queue is empty after flushing self.assertTrue(client.queue.empty()) def test_shutdown(self): client = self.client # set up the consumer with more requests than a single batch will allow for _ in range(1000): _, _ = client.identify('userId', {'trait': 'value'}) client.shutdown() # we expect two things after shutdown: # 1. client queue is empty # 2. consumer thread has stopped self.assertTrue(client.queue.empty()) for consumer in client.consumers: self.assertFalse(consumer.is_alive()) def test_synchronous(self): client = Client('testsecret', sync_mode=True) success, _ = client.identify('userId') self.assertFalse(client.consumers) self.assertTrue(client.queue.empty()) self.assertTrue(success) def test_overflow(self): client = Client('testsecret', max_queue_size=1) # Ensure consumer thread is no longer uploading client.join() for _ in range(10): client.identify('userId') success, _ = client.identify('userId') # Make sure we are informed that the queue is at capacity self.assertFalse(success) def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed) def test_unicode(self): Client(six.u('unicode_key')) def test_numeric_user_id(self): self.client.track(1234, 'python event') self.client.flush() self.assertFalse(self.failed) def test_debug(self): Client('bad_key', debug=True) def test_identify_with_date_object(self): client = self.client success, msg = client.identify( 'userId', { 'birthdate': date(1981, 2, 2), }, ) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], {'birthdate': date(1981, 2, 2)}) def test_gzip(self): client = Client('testsecret', on_error=self.fail, gzip=True) for _ in range(10): client.identify('userId', {'trait': 'value'}) client.flush() self.assertFalse(self.failed) def test_user_defined_flush_at(self): client = Client('testsecret', on_error=self.fail, flush_at=10, flush_interval=3) def mock_post_fn(*args, **kwargs): self.assertEqual(len(kwargs['batch']), 10) # the post function should be called 2 times, with a batch size of 10 # each time. with mock.patch('analytics.consumer.post', side_effect=mock_post_fn) \ as mock_post: for _ in range(20): client.identify('userId', {'trait': 'value'}) time.sleep(1) self.assertEqual(mock_post.call_count, 2) def test_user_defined_timeout(self): client = Client('testsecret', timeout=10) for consumer in client.consumers: self.assertEqual(consumer.timeout, 10) def test_default_timeout_15(self): client = Client('testsecret') for consumer in client.consumers: self.assertEqual(consumer.timeout, 15) def test_proxies(self): client = Client('testsecret', proxies='203.243.63.16:80') success, msg = client.identify('userId', {'trait': 'value'}) self.assertTrue(success)
def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail)
def test_default_timeout_15(self): client = Client('testsecret') for consumer in client.consumers: self.assertEqual(consumer.timeout, 15)
def test_user_defined_timeout(self): client = Client('testsecret', timeout=10) self.assertEquals(client.consumer.timeout, 10)
def test_debug(self): Client('bad_key', debug=True)
def test_default_timeout_15(self): client = Client('testsecret') self.assertEquals(client.consumer.timeout, 15)
def get(self, request, *args, **kwargs): site_configuration = request.site.siteconfiguration segment_client = SegmentClient( write_key=site_configuration.segment_key) program_cert_record = get_object_or_404(ProgramCertRecord, uuid=kwargs.get("uuid")) record = get_record_data( program_cert_record.user, program_cert_record.program.uuid, request.site, platform_name=site_configuration.platform_name, ) user_metadata = [ ["Program Name", record["program"]["name"]], ["Program Type", record["program"]["type_name"]], ["Platform Provider", record["platform_name"]], ["Authoring Organization(s)", record["program"]["school"]], ["Learner Name", record["learner"]["full_name"]], ["Username", record["learner"]["username"]], ["Email", record["learner"]["email"]], [""], ] properties = { "category": "records", "program_uuid": program_cert_record.program.uuid.hex, "record_uuid": program_cert_record.uuid.hex, } context = { "page": { "path": request.path, "referrer": request.META.get("HTTP_REFERER"), "url": request.build_absolute_uri(), }, "userAgent": request.META.get("HTTP_USER_AGENT"), } segment_client.track( request.COOKIES.get("ajs_anonymous_id"), context=context, event="edx.bi.credentials.program_record.download_started", properties=properties, ) string_io = io.StringIO() writer = csv.writer(string_io, quoting=csv.QUOTE_ALL) writer.writerows(user_metadata) writer = csv.DictWriter(string_io, record["grades"][0].keys(), quoting=csv.QUOTE_ALL) writer.writeheader() writer.writerows(record["grades"]) string_io.seek(0) filename = "{username}_{program_name}_grades".format( username=record["learner"]["username"], program_name=record["program"]["name"]) response = ProgramRecordCsvView.SegmentHttpResponse( string_io, anonymous_id=request.COOKIES.get("ajs_anonymous_id"), content_type="text/csv", context=context, event="edx.bi.credentials.program_record.download_finished", properties=properties, segment_client=segment_client, ) filename = filename.replace(" ", "_").lower().encode("utf-8") response[ "Content-Disposition"] = 'attachment; filename="{filename}.csv"'.format( filename=filename) return response
def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed)
def test_fail(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertTrue(self.failed)
def test_max_retries(self): self.assertIsNone(analytics.default_client) client = Client('testsecret', max_retries=42) for consumer in client.consumers: self.assertEqual(consumer.retries, 42)
def test_gzip(self): client = Client('testsecret', on_error=self.fail, gzip=True) for _ in range(10): client.identify('userId', {'trait': 'value'}) client.flush() self.assertFalse(self.failed)
class TestClient(unittest.TestCase): def fail(self, e, batch): """Mark the failure handler""" self.failed = True def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail) def test_requires_write_key(self): self.assertRaises(AssertionError, Client) def test_empty_flush(self): self.client.flush() def test_basic_track(self): client = self.client success, msg = client.track('userId', 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['event'], 'python test event') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['properties'], {}) self.assertEqual(msg['type'], 'track') def test_stringifies_user_id(self): # A large number that loses precision in node: # node -e "console.log(157963456373623802 + 1)" > 157963456373623800 client = self.client success, msg = client.track(user_id = 157963456373623802, event = 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['userId'], '157963456373623802') self.assertEqual(msg['anonymousId'], None) def test_stringifies_anonymous_id(self): # A large number that loses precision in node: # node -e "console.log(157963456373623803 + 1)" > 157963456373623800 client = self.client success, msg = client.track(anonymous_id = 157963456373623803, event = 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['userId'], None) self.assertEqual(msg['anonymousId'], '157963456373623803') def test_advanced_track(self): client = self.client success, msg = client.track( 'userId', 'python test event', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['event'], 'python test event') self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'track') def test_basic_identify(self): client = self.client success, msg = client.identify('userId', { 'trait': 'value' }) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_advanced_identify(self): client = self.client success, msg = client.identify( 'userId', { 'trait': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_basic_group(self): client = self.client success, msg = client.group('userId', 'groupId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['groupId'], 'groupId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_advanced_group(self): client = self.client success, msg = client.group( 'userId', 'groupId', { 'trait': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_basic_alias(self): client = self.client success, msg = client.alias('previousId', 'userId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['previousId'], 'previousId') self.assertEqual(msg['userId'], 'userId') def test_basic_page(self): client = self.client success, msg = client.page('userId', name='name') self.assertFalse(self.failed) client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_advanced_page(self): client = self.client success, msg = client.page( 'userId', 'category', 'name', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['category'], 'category') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_basic_screen(self): client = self.client success, msg = client.screen('userId', name='name') client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_advanced_screen(self): client = self.client success, msg = client.screen( 'userId', 'category', 'name', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }, 'messageId') self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertEqual(msg['messageId'], 'messageId') self.assertEqual(msg['category'], 'category') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_flush(self): client = self.client # set up the consumer with more requests than a single batch will allow for i in range(1000): success, msg = client.identify('userId', { 'trait': 'value' }) # We can't reliably assert that the queue is non-empty here; that's # a race condition. We do our best to load it up though. client.flush() # Make sure that the client queue is empty after flushing self.assertTrue(client.queue.empty()) def test_shutdown(self): client = self.client # set up the consumer with more requests than a single batch will allow for i in range(1000): success, msg = client.identify('userId', {'trait': 'value'}) client.shutdown() # we expect two things after shutdown: # 1. client queue is empty # 2. consumer thread has stopped self.assertTrue(client.queue.empty()) self.assertFalse(client.consumer.is_alive()) def test_synchronous(self): client = Client('testsecret', sync_mode=True) success, message = client.identify('userId') self.assertIsNone(client.consumer) self.assertTrue(client.queue.empty()) self.assertTrue(success) def test_overflow(self): client = Client('testsecret', max_queue_size=1) # Ensure consumer thread is no longer uploading client.join() for i in range(10): client.identify('userId') success, msg = client.identify('userId') # Make sure we are informed that the queue is at capacity self.assertFalse(success) def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed) def test_unicode(self): Client(six.u('unicode_key')) def test_numeric_user_id(self): self.client.track(1234, 'python event') self.client.flush() self.assertFalse(self.failed) def test_debug(self): Client('bad_key', debug=True) def test_identify_with_date_object(self): client = self.client success, msg = client.identify( 'userId', { 'birthdate': date(1981, 2, 2), }, ) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], {'birthdate': date(1981, 2, 2)}) def test_gzip(self): client = Client('testsecret', on_error=self.fail, gzip=True) for _ in range(10): client.identify('userId', {'trait': 'value'}) client.flush() self.assertFalse(self.failed) def test_user_defined_upload_size(self): client = Client('testsecret', on_error=self.fail, upload_size=10, upload_interval=3) def mock_post_fn(*args, **kwargs): self.assertEquals(len(kwargs['batch']), 10) # the post function should be called 2 times, with a batch size of 10 # each time. with mock.patch('analytics.consumer.post', side_effect=mock_post_fn) as mock_post: for _ in range(20): client.identify('userId', {'trait': 'value'}) time.sleep(1) self.assertEquals(mock_post.call_count, 2)
class TestClient(unittest.TestCase): def fail(self, e, batch): """Mark the failure handler""" self.failed = True def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail) def test_requires_write_key(self): self.assertRaises(AssertionError, Client) def test_empty_flush(self): self.client.flush() def test_basic_track(self): client = self.client success, msg = client.track('userId', 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['event'], 'python test event') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['properties'], {}) self.assertEqual(msg['type'], 'track') def test_advanced_track(self): client = self.client success, msg = client.track( 'userId', 'python test event', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['event'], 'python test event') self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'track') def test_basic_identify(self): client = self.client success, msg = client.identify('userId', { 'trait': 'value' }) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_advanced_identify(self): client = self.client success, msg = client.identify( 'userId', { 'trait': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_basic_group(self): client = self.client success, msg = client.group('userId', 'groupId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['groupId'], 'groupId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_advanced_group(self): client = self.client success, msg = client.group( 'userId', 'groupId', { 'trait': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_basic_alias(self): client = self.client success, msg = client.alias('previousId', 'userId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['previousId'], 'previousId') self.assertEqual(msg['userId'], 'userId') def test_basic_page(self): client = self.client success, msg = client.page('userId', name='name') self.assertFalse(self.failed) client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_advanced_page(self): client = self.client success, msg = client.page( 'userId', 'category', 'name', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['category'], 'category') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_basic_screen(self): client = self.client success, msg = client.screen('userId', name='name') client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_advanced_screen(self): client = self.client success, msg = client.screen( 'userId', 'category', 'name', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['category'], 'category') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_flush(self): client = self.client # send a few more requests than a single batch will allow for i in range(60): success, msg = client.identify('userId', { 'trait': 'value' }) self.assertFalse(client.queue.empty()) client.flush() self.assertTrue(client.queue.empty()) def test_overflow(self): client = Client('testsecret', max_queue_size=1) client.consumer.pause() time.sleep(5.1) # allow time for consumer to exit for i in range(10): client.identify('userId') success, msg = client.identify('userId') self.assertFalse(success) def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed) def test_unicode(self): Client(six.u('unicode_key')) def test_numeric_user_id(self): self.client.track(1234, 'python event') self.client.flush() self.assertFalse(self.failed) def test_debug(self): Client('bad_key', debug=True)
class TestClient(unittest.TestCase): def fail(self, e, batch): """Mark the failure handler""" self.failed = True def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail) def test_requires_write_key(self): self.assertRaises(AssertionError, Client) def test_empty_flush(self): self.client.flush() def test_basic_track(self): client = self.client success, msg = client.track('userId', 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['event'], 'python test event') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['properties'], {}) self.assertEqual(msg['type'], 'track') def test_advanced_track(self): client = self.client success, msg = client.track( 'userId', 'python test event', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['event'], 'python test event') self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'track') def test_basic_identify(self): client = self.client success, msg = client.identify('userId', { 'trait': 'value' }) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_advanced_identify(self): client = self.client success, msg = client.identify( 'userId', { 'trait': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_basic_group(self): client = self.client success, msg = client.group('userId', 'groupId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['groupId'], 'groupId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_advanced_group(self): client = self.client success, msg = client.group( 'userId', 'groupId', { 'trait': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], { 'trait': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_basic_alias(self): client = self.client success, msg = client.alias('previousId', 'userId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['previousId'], 'previousId') self.assertEqual(msg['userId'], 'userId') def test_basic_page(self): client = self.client success, msg = client.page('userId', name='name') self.assertFalse(self.failed) client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_advanced_page(self): client = self.client success, msg = client.page( 'userId', 'category', 'name', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['category'], 'category') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_basic_screen(self): client = self.client success, msg = client.screen('userId', name='name') client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_advanced_screen(self): client = self.client success, msg = client.screen( 'userId', 'category', 'name', { 'property': 'value' }, { 'ip': '192.168.0.1' }, datetime(2014, 9, 3), 'anonymousId', { 'Amplitude': True }) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], { 'Amplitude': True }) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], { 'property': 'value' }) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['category'], 'category') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_flush(self): client = self.client # set up the consumer with more requests than a single batch will allow for i in range(1000): success, msg = client.identify('userId', { 'trait': 'value' }) # We can't reliably assert that the queue is non-empty here; that's # a race condition. We do our best to load it up though. client.flush() # Make sure that the client queue is empty after flushing self.assertTrue(client.queue.empty()) def test_overflow(self): client = Client('testsecret', max_queue_size=1) # Ensure consumer thread is no longer uploading client.join() for i in range(10): client.identify('userId') success, msg = client.identify('userId') # Make sure we are informed that the queue is at capacity self.assertFalse(success) def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed) def test_unicode(self): Client(six.u('unicode_key')) def test_numeric_user_id(self): self.client.track(1234, 'python event') self.client.flush() self.assertFalse(self.failed) def test_debug(self): Client('bad_key', debug=True)
class TestClient(unittest.TestCase): def fail(self, e, batch): """Mark the failure handler""" self.failed = True def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail) def test_requires_write_key(self): self.assertRaises(AssertionError, Client) def test_empty_flush(self): self.client.flush() def test_basic_track(self): client = self.client success, msg = client.track('userId', 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['event'], 'python test event') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['properties'], {}) self.assertEqual(msg['type'], 'track') def test_advanced_track(self): client = self.client success, msg = client.track('userId', 'python test event', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['event'], 'python test event') self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'track') def test_basic_identify(self): client = self.client success, msg = client.identify('userId', {'trait': 'value'}) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_advanced_identify(self): client = self.client success, msg = client.identify('userId', {'trait': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_basic_group(self): client = self.client success, msg = client.group('userId', 'groupId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['groupId'], 'groupId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_advanced_group(self): client = self.client success, msg = client.group('userId', 'groupId', {'trait': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_basic_alias(self): client = self.client success, msg = client.alias('previousId', 'userId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['previousId'], 'previousId') self.assertEqual(msg['userId'], 'userId') def test_basic_page(self): client = self.client success, msg = client.page('userId', name='name') self.assertFalse(self.failed) client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_advanced_page(self): client = self.client success, msg = client.page('userId', 'category', 'name', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['category'], 'category') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_basic_screen(self): client = self.client success, msg = client.screen('userId', name='name') client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_advanced_screen(self): client = self.client success, msg = client.screen('userId', 'category', 'name', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['category'], 'category') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_flush(self): client = self.client # send a few more requests than a single batch will allow for i in range(60): success, msg = client.identify('userId', {'trait': 'value'}) self.assertFalse(client.queue.empty()) client.flush() self.assertTrue(client.queue.empty()) def test_overflow(self): client = Client('testsecret', max_queue_size=1) client.consumer.pause() time.sleep(5.1) # allow time for consumer to exit for i in range(10): client.identify('userId') success, msg = client.identify('userId') self.assertFalse(success) def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed) def test_unicode(self): Client(six.u('unicode_key')) def test_numeric_user_id(self): self.client.track(1234, 'python event') self.client.flush() self.assertFalse(self.failed) def test_debug(self): Client('bad_key', debug=True)
class TestClient(unittest.TestCase): def fail(self, e, batch): """Mark the failure handler""" self.failed = True def setUp(self): self.failed = False self.client = Client('testsecret', on_error=self.fail) def test_requires_write_key(self): self.assertRaises(AssertionError, Client) def test_empty_flush(self): self.client.flush() def test_basic_track(self): client = self.client success, msg = client.track('userId', 'python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['event'], 'python test event') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['properties'], {}) self.assertEqual(msg['type'], 'track') def test_stringifies_user_id(self): # A large number that loses precision in node: # node -e "console.log(157963456373623802 + 1)" > 157963456373623800 client = self.client success, msg = client.track(user_id=157963456373623802, event='python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['userId'], '157963456373623802') self.assertEqual(msg['anonymousId'], None) def test_stringifies_anonymous_id(self): # A large number that loses precision in node: # node -e "console.log(157963456373623803 + 1)" > 157963456373623800 client = self.client success, msg = client.track(anonymous_id=157963456373623803, event='python test event') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['userId'], None) self.assertEqual(msg['anonymousId'], '157963456373623803') def test_advanced_track(self): client = self.client success, msg = client.track('userId', 'python test event', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['event'], 'python test event') self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'track') def test_basic_identify(self): client = self.client success, msg = client.identify('userId', {'trait': 'value'}) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_advanced_identify(self): client = self.client success, msg = client.identify('userId', {'trait': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'identify') def test_basic_group(self): client = self.client success, msg = client.group('userId', 'groupId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['groupId'], 'groupId') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_advanced_group(self): client = self.client success, msg = client.group('userId', 'groupId', {'trait': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['traits'], {'trait': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'group') def test_basic_alias(self): client = self.client success, msg = client.alias('previousId', 'userId') client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['previousId'], 'previousId') self.assertEqual(msg['userId'], 'userId') def test_basic_page(self): client = self.client success, msg = client.page('userId', name='name') self.assertFalse(self.failed) client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_advanced_page(self): client = self.client success, msg = client.page('userId', 'category', 'name', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertEqual(msg['category'], 'category') self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'page') self.assertEqual(msg['name'], 'name') def test_basic_screen(self): client = self.client success, msg = client.screen('userId', name='name') client.flush() self.assertTrue(success) self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_advanced_screen(self): client = self.client success, msg = client.screen('userId', 'category', 'name', {'property': 'value'}, {'ip': '192.168.0.1'}, datetime(2014, 9, 3), 'anonymousId', {'Amplitude': True}) self.assertTrue(success) self.assertEqual(msg['timestamp'], '2014-09-03T00:00:00+00:00') self.assertEqual(msg['integrations'], {'Amplitude': True}) self.assertEqual(msg['context']['ip'], '192.168.0.1') self.assertEqual(msg['properties'], {'property': 'value'}) self.assertEqual(msg['anonymousId'], 'anonymousId') self.assertEqual(msg['context']['library'], { 'name': 'analytics-python', 'version': VERSION }) self.assertTrue(isinstance(msg['timestamp'], str)) self.assertTrue(isinstance(msg['messageId'], str)) self.assertEqual(msg['category'], 'category') self.assertEqual(msg['userId'], 'userId') self.assertEqual(msg['type'], 'screen') self.assertEqual(msg['name'], 'name') def test_flush(self): client = self.client # set up the consumer with more requests than a single batch will allow for i in range(1000): success, msg = client.identify('userId', {'trait': 'value'}) # We can't reliably assert that the queue is non-empty here; that's # a race condition. We do our best to load it up though. client.flush() # Make sure that the client queue is empty after flushing self.assertTrue(client.queue.empty()) def test_synchronous(self): # Max queue size at 0 -> synchronous mode client = Client('testsecret', max_queue_size=0) # Ensure the consumer thread is not running client.consumer.pause() success, message = client.identify('userId') self.assertTrue(client.queue.empty()) self.assertTrue(success) def test_overflow(self): client = Client('testsecret', max_queue_size=1) # Ensure consumer thread is no longer uploading client.join() for i in range(10): client.identify('userId') success, msg = client.identify('userId') # Make sure we are informed that the queue is at capacity self.assertFalse(success) def test_success_on_invalid_write_key(self): client = Client('bad_key', on_error=self.fail) client.track('userId', 'event') client.flush() self.assertFalse(self.failed) def test_unicode(self): Client(six.u('unicode_key')) def test_numeric_user_id(self): self.client.track(1234, 'python event') self.client.flush() self.assertFalse(self.failed) def test_debug(self): Client('bad_key', debug=True) def test_identify_with_date_object(self): client = self.client success, msg = client.identify( 'userId', { 'birthdate': date(1981, 2, 2), }, ) client.flush() self.assertTrue(success) self.assertFalse(self.failed) self.assertEqual(msg['traits'], {'birthdate': date(1981, 2, 2)})
def test_unicode(self): Client(six.u('unicode_key'))
def __init__(self, api_key: str): self.analytics = SegmentClient(write_key=api_key)
def get(self, request, *args, **kwargs): site_configuration = request.site.siteconfiguration segment_client = SegmentClient( write_key=site_configuration.segment_key) program_cert_record = get_object_or_404(ProgramCertRecord, uuid=kwargs.get('uuid')) record = get_record_data( program_cert_record.user, program_cert_record.program.uuid, request.site, platform_name=site_configuration.platform_name) user_metadata = [ ['Program Name', record['program']['name']], ['Program Type', record['program']['type_name']], ['Platform Provider', record['platform_name']], ['Authoring Organization(s)', record['program']['school']], ['Learner Name', record['learner']['full_name']], ['Username', record['learner']['username']], ['Email', record['learner']['email']], [''], ] properties = { 'category': 'records', 'program_uuid': program_cert_record.program.uuid.hex, 'record_uuid': program_cert_record.uuid.hex, } context = { 'page': { 'path': request.path, 'referrer': request.META.get('HTTP_REFERER'), }, 'userAgent': request.META.get('HTTP_USER_AGENT'), } segment_client.track( request.COOKIES.get('ajs_anonymous_id'), context=context, event='edx.bi.credentials.program_record.download_started', properties=properties, ) string_io = io.StringIO() writer = csv.writer(string_io, quoting=csv.QUOTE_ALL) writer.writerows(user_metadata) writer = csv.DictWriter(string_io, record['grades'][0].keys(), quoting=csv.QUOTE_ALL) writer.writeheader() writer.writerows(record['grades']) string_io.seek(0) filename = '{username}_{program_name}_grades.csv'.format( username=record['learner']['username'], program_name=record['program']['name']) response = ProgramRecordCsvView.SegmentHttpResponse( string_io, anonymous_id=request.COOKIES.get('ajs_anonymous_id'), content_type='text/csv', context=context, event='edx.bi.credentials.program_record.download_finished', properties=properties, segment_client=segment_client, ) response[ 'Content-Disposition'] = 'attachment; filename={filename}'.format( filename=filename.replace(' ', '_').lower()) return response
def test_user_defined_timeout(self): client = Client('testsecret', timeout=10) for consumer in client.consumers: self.assertEqual(consumer.timeout, 10)
def test_unicode(self): Client('unicode_key')
def test_proxies(self): client = Client('testsecret', proxies='203.243.63.16:80') success, msg = client.identify('userId', {'trait': 'value'}) self.assertTrue(success)