def setUp(self): self.maxDiff = None # Main test project: https://mixpanel.com/report/1039339/ self.mixpanel = Mixpanel('691bfbf163af2deff808fcc3d4c2a9e8', 'd92eb752ebbffe57556ff6ea4f8a9125') # Import only test project: https://mixpanel.com/report/1039477/ self.import_project = Mixpanel('0360aa57ccea3a589d216aa6a2c59a35', '8b3b4ca883462e2d98d3879b5d259e59') # For testing token assertion self.no_token = Mixpanel('123') self.gold_people_items = {u'status': u'ok', u'results': [{u'$distinct_id': u'77d57cbd-ec0b-4e02-93c0-c738a9ed59d8', u'$properties': {u'Invited User?': False, u'App Version': 3, u'$country_code': u'US', u'$model': u'iPhone5,2', u'$predict_grade': u'A', u'$unsubscribed': u':true', u'Registration Date': u'2016-08-17T01:30:20', u'$email': u'*****@*****.**', u'$region': u'California', u'$last_name': u'Cooper', u'Experiment Group': u'Group B', u'Campaign Name': u'Huge Discounts!', u'Referrering Domain': u'http://bing.com', u'$city': u'Salinas', u'$first_name': u'Kelly', u'$os': u'iPhone OS', u'$timezone': u'America/Los_Angeles', u'Campaign Source': u'Facebook'}}, {u'$distinct_id': u'34dcb1f3-f6a6-433b-b402-436717ceaa82', u'$properties': {u'Invited User?': False, u'App Version': 3, u'$country_code': u'US', u'$model': u'iPad2,5', u'$predict_grade': u'A', u'$unsubscribed': u':true', u'Registration Date': u'2016-08-16T18:23:01', u'$email': u'*****@*****.**', u'$region': u'Pennsylvania', u'$last_name': u'Burton', u'Campaign Name': u'Super Sale', u'Referrering Domain': u'http://facebook.com', u'$city': u'Hershey', u'$first_name': u'Kelly', u'$os': u'iPhone OS', u'$timezone': u'America/New_York', u'Campaign Source': u'Facebook'}}, {u'$distinct_id': u'55c86fe3-1f7e-4842-a276-3b6e7ae4456b', u'$properties': {u'Invited User?': True, u'App Version': 3, u'$country_code': u'ID', u'$model': u'iPhone5,2', u'$predict_grade': u'A', u'$unsubscribed': u':true', u'$email': u'*****@*****.**', u'$last_name': u'Fernandez', u'Campaign Name': u'Huge Discounts!', u'Referrering Domain': u'http://facebook.com', u'$first_name': u'Kelly', u'$os': u'iPhone OS', u'Registration Date': u'2016-08-16T23:57:46', u'Campaign Source': u'Facebook'}}], u'session_id': u'1472215655-vkhHzc', u'page_size': 1000, u'total': 3, u'page': 0}
class TestMixpanel(TestCase): def setUp(self): self.maxDiff = None # Main test project: https://mixpanel.com/report/1039339/ self.mixpanel = Mixpanel('691bfbf163af2deff808fcc3d4c2a9e8', 'd92eb752ebbffe57556ff6ea4f8a9125') # Import only test project: https://mixpanel.com/report/1039477/ self.import_project = Mixpanel('0360aa57ccea3a589d216aa6a2c59a35', '8b3b4ca883462e2d98d3879b5d259e59') # For testing token assertion self.no_token = Mixpanel('123') self.gold_people_items = {u'status': u'ok', u'results': [{u'$distinct_id': u'77d57cbd-ec0b-4e02-93c0-c738a9ed59d8', u'$properties': {u'Invited User?': False, u'App Version': 3, u'$country_code': u'US', u'$model': u'iPhone5,2', u'$predict_grade': u'A', u'$unsubscribed': u':true', u'Registration Date': u'2016-08-17T01:30:20', u'$email': u'*****@*****.**', u'$region': u'California', u'$last_name': u'Cooper', u'Experiment Group': u'Group B', u'Campaign Name': u'Huge Discounts!', u'Referrering Domain': u'http://bing.com', u'$city': u'Salinas', u'$first_name': u'Kelly', u'$os': u'iPhone OS', u'$timezone': u'America/Los_Angeles', u'Campaign Source': u'Facebook'}}, {u'$distinct_id': u'34dcb1f3-f6a6-433b-b402-436717ceaa82', u'$properties': {u'Invited User?': False, u'App Version': 3, u'$country_code': u'US', u'$model': u'iPad2,5', u'$predict_grade': u'A', u'$unsubscribed': u':true', u'Registration Date': u'2016-08-16T18:23:01', u'$email': u'*****@*****.**', u'$region': u'Pennsylvania', u'$last_name': u'Burton', u'Campaign Name': u'Super Sale', u'Referrering Domain': u'http://facebook.com', u'$city': u'Hershey', u'$first_name': u'Kelly', u'$os': u'iPhone OS', u'$timezone': u'America/New_York', u'Campaign Source': u'Facebook'}}, {u'$distinct_id': u'55c86fe3-1f7e-4842-a276-3b6e7ae4456b', u'$properties': {u'Invited User?': True, u'App Version': 3, u'$country_code': u'ID', u'$model': u'iPhone5,2', u'$predict_grade': u'A', u'$unsubscribed': u':true', u'$email': u'*****@*****.**', u'$last_name': u'Fernandez', u'Campaign Name': u'Huge Discounts!', u'Referrering Domain': u'http://facebook.com', u'$first_name': u'Kelly', u'$os': u'iPhone OS', u'Registration Date': u'2016-08-16T23:57:46', u'Campaign Source': u'Facebook'}}], u'session_id': u'1472215655-vkhHzc', u'page_size': 1000, u'total': 3, u'page': 0} def test_unicode_urlencode(self): params = {'$key 1': 'value!', 'key2': '"Hello, World"', '$list': ['a', '%', '_8']} encoded_params = 'key2=%22Hello%2C+World%22&%24key+1=value%21&%24list=%5B%22a%22%2C+%22%25%22%2C+%22_8%22%5D' self.assertEqual(self.mixpanel.unicode_urlencode(params), encoded_params) def test_response_handler_callback(self): response = '{"status": 0, "error": "missing required parameters"}' self.assertRaises(RuntimeError, self.mixpanel.response_handler_callback, response) def test_write_items_to_csv_with_events(self): items = [{'event': 'page view', 'properties': {'prop1': 'val1', 'prop2': 'val2'}}, {'event': 'login', 'properties': {'prop3': 'val3', 'prop2': 'val2'}}] expected_output = 'event,prop1,prop2,prop3\r\npage view,val1,val2,\r\nlogin,,val2,val3\r\n' with open('event_items.csv', 'a+') as f: try: self.mixpanel.write_items_to_csv(items, f) f.seek(0) test_output = f.read() self.assertEqual(expected_output, test_output) finally: os.remove('event_items.csv') def test_write_items_to_csv_with_people(self): items = [{'$distinct_id': 'abc123', '$properties': {'prop1': 'val1', 'prop2': 'val2'}}, {'$distinct_id': 'xyz456', '$properties': {'prop3': 'val3', 'prop2': 'val2'}}] expected_output = '$distinct_id,prop1,prop2,prop3\r\nabc123,val1,val2,\r\nxyz456,,val2,val3\r\n' with open('people_items.csv', 'a+') as f: try: self.mixpanel.write_items_to_csv(items, f) f.seek(0) test_output = f.read() self.assertEqual(expected_output, test_output) finally: os.remove('people_items.csv') def test_properties_from_csv_row_events(self): with open('events_items_gold.csv', 'rbU') as f: reader = csv.reader(f) header = reader.next() row = reader.next() ignored = ['event', 'distinct_id', 'time'] expected_props = {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://duckduckgo.com', '$model': 'iPad3,4', '$import': True, 'Campaign Name': 'Buy Now', '$os': 'iPhone OS', 'Registration Date': '2016-07-21T00:00:11', 'Campaign Source': 'Email', 'mp_country_code': 'US'} test_props = self.mixpanel.properties_from_csv_row(row, header, ignored) self.assertEqual(expected_props, test_props) def test_properties_from_csv_row_people(self): with open('people_items_gold.csv', 'rbU') as f: reader = csv.reader(f) header = reader.next() row = reader.next() ignored = ['$distinct_id'] expected_props = {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://reddit.com', '$model': 'iPhone6,1', '$region': 'Florida', '$unsubscribed': ':true', '$timezone': 'America/New_York', '$email': '*****@*****.**', '$last_name': 'Miller', 'Campaign Name': 'Super Sale', '$country_code': 'US', '$city': 'Orange Park', '$first_name': 'Jeffery', 'Current Level': 1, '$os': 'iPhone OS', 'Registration Date': '2016-08-16T04:55:06', 'Campaign Source': 'Google Adwords', '$predict_grade': 'A'} test_props = self.mixpanel.properties_from_csv_row(row, header, ignored) self.assertEqual(expected_props, test_props) def test_event_object_from_csv_row(self): with open('events_items_gold.csv', 'rbU') as f: reader = csv.reader(f) header = reader.next() row = reader.next() expected_object = {'event': 'Registration Complete', 'properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://duckduckgo.com', '$model': 'iPad3,4', '$import': True, 'Campaign Name': 'Buy Now', 'distinct_id': '693888f8-235f-44dc-8987-ab4f18c20e67', 'time': 1469059211, '$os': 'iPhone OS', 'Registration Date': '2016-07-21T00:00:11', 'Campaign Source': 'Email', 'mp_country_code': 'US'}} test_object = self.mixpanel.event_object_from_csv_row(row, header) self.assertEqual(expected_object, test_object) def test_people_object_from_csv_row(self): with open('people_items_gold.csv', 'rbU') as f: reader = csv.reader(f) header = reader.next() row = reader.next() expected_object = {'$distinct_id': '5c4f0859-80b1-40ab-bbc0-0b7457310138', '$properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://reddit.com', '$model': 'iPhone6,1', '$region': 'Florida', '$unsubscribed': ':true', '$timezone': 'America/New_York', '$email': '*****@*****.**', '$last_name': 'Miller', 'Campaign Name': 'Super Sale', '$country_code': 'US', '$city': 'Orange Park', '$first_name': 'Jeffery', 'Current Level': 1, '$os': 'iPhone OS', 'Registration Date': '2016-08-16T04:55:06', 'Campaign Source': 'Google Adwords', '$predict_grade': 'A'}} test_object = self.mixpanel.people_object_from_csv_row(row, header) self.assertEqual(expected_object, test_object) def test_list_from_items_filename_with_events_csv(self): expected_list = [{'event': 'Registration Complete', 'properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://duckduckgo.com', '$model': 'iPad3,4', '$import': True, 'Campaign Name': 'Buy Now', 'distinct_id': '693888f8-235f-44dc-8987-ab4f18c20e67', 'time': 1469059211, '$os': 'iPhone OS', 'Registration Date': '2016-07-21T00:00:11', 'Campaign Source': 'Email', 'mp_country_code': 'US'}}, {'event': 'Registration Complete', 'properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://bing.com', '$model': 'iPhone6,1', '$import': True, 'Campaign Name': 'Organic', 'distinct_id': '16bc248f-446d-418f-85cd-c76cf26ce29c', 'time': 1469059215, '$os': 'iPhone OS', 'Registration Date': '2016-07-21T00:00:15', 'Campaign Source': 'Organic', 'mp_country_code': 'US'}}, {'event': 'App Install', 'properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'Organic', '$model': 'iPhone6,1', '$region': 'Michigan', '$import': True, 'Campaign Name': 'Super Sale', 'distinct_id': '1cb813e7-72c6-4a8f-a34a-68bf26d43652', '$city': 'Dearborn', 'time': 1469059217, '$os': 'iPhone OS', 'Campaign Source': 'Twitter', 'mp_country_code': 'US'}}] test_list = self.mixpanel.list_from_items_filename('events_items_gold.csv') self.assertEqual(expected_list, test_list) def test_list_from_items_filename_with_events_json(self): expected_list = [{u'event': u'Registration Complete', u'properties': {u'Invited User?': u'False', u'App Version': u'3', u'Referrering Domain': u'http://duckduckgo.com', u'$model': u'iPad3,4', u'$import': True, u'Campaign Name': u'Buy Now', u'distinct_id': u'693888f8-235f-44dc-8987-ab4f18c20e67', u'time': 1469059211, u'$os': u'iPhone OS', u'Registration Date': u'2016-07-21T00:00:11', u'Campaign Source': u'Email', u'mp_country_code': u'US'}}, {u'event': u'Registration Complete', u'properties': {u'Invited User?': u'False', u'App Version': u'3', u'Referrering Domain': u'http://bing.com', u'$model': u'iPhone6,1', u'$import': True, u'Campaign Name': u'Organic', u'distinct_id': u'16bc248f-446d-418f-85cd-c76cf26ce29c', u'time': 1469059215, u'$os': u'iPhone OS', u'Registration Date': u'2016-07-21T00:00:15', u'Campaign Source': u'Organic', u'mp_country_code': u'US'}}, {u'event': u'App Install', u'properties': {u'Invited User?': u'False', u'App Version': u'3', u'Referrering Domain': u'Organic', u'$model': u'iPhone6,1', u'$region': u'Michigan', u'$import': True, u'Campaign Name': u'Super Sale', u'distinct_id': u'1cb813e7-72c6-4a8f-a34a-68bf26d43652', u'$city': u'Dearborn', u'time': 1469059217, u'$os': u'iPhone OS', u'Campaign Source': u'Twitter', u'mp_country_code': u'US'}}] test_list = self.mixpanel.list_from_items_filename('events_items_gold.json') self.assertEqual(expected_list, test_list) def test_list_from_items_filename_with_people_csv(self): expected_list = [{'$distinct_id': '5c4f0859-80b1-40ab-bbc0-0b7457310138', '$properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'http://reddit.com', '$model': 'iPhone6,1', '$region': 'Florida', '$unsubscribed': ':true', '$timezone': 'America/New_York', '$email': '*****@*****.**', '$last_name': 'Miller', 'Campaign Name': 'Super Sale', '$country_code': 'US', '$city': 'Orange Park', '$first_name': 'Jeffery', 'Current Level': 1, '$os': 'iPhone OS', 'Registration Date': '2016-08-16T04:55:06', 'Campaign Source': 'Google Adwords', '$predict_grade': 'A'}}, {'$distinct_id': '20b54c07-6e7a-4014-a4e9-2ab9bc48378e', '$properties': {'Invited User?': False, 'App Version': 3, 'Referrering Domain': 'Organic', '$model': 'GT-I9500', '$predict_grade': 'A', '$unsubscribed': ':true', '$email': '*****@*****.**', '$last_name': 'Peterson', 'Campaign Name': 'Organic', '$first_name': 'Walter', 'Current Level': 1, '$os': 'Android', 'Registration Date': '2016-08-16T09:10:02', 'Campaign Source': 'Organic'}}, {'$distinct_id': '58d0f6a3-d533-41dd-9e31-2d6f84d7de2e', '$properties': {'Referrering Domain': 'http://baidu.com', 'Total Games Played': 2, '$city': 'Beijing', 'Current Level': 3, '$timezone': 'Asia/Shanghai', 'Invited User?': False, 'Last Visit': '2016-08-16T19:42:29', '$unsubscribed': ':true', 'Registration Date': '2016-08-16T09:33:08', 'Last Game Played': '2016-08-16T19:34:03', '$os': 'iPhone OS', '$email': '*****@*****.**', 'Campaign Name': 'Organic', '$country_code': 'CN', 'Last Level Completed': '2016-08-16T19:40:13', 'App Version': 3, '$model': 'iPad4,1', '$region': 'Beijing Shi', '$last_name': 'West', '$first_name': 'Ray', '$predict_grade': 'A', 'Campaign Source': 'Organic'}}] test_list = self.mixpanel.list_from_items_filename('people_items_gold.csv') self.assertEqual(expected_list, test_list) def test_list_from_items_filename_with_people_json(self): expected_list = [{u'$distinct_id': u'5c4f0859-80b1-40ab-bbc0-0b7457310138', u'$properties': {u'Invited User?': u'False', u'App Version': u'3', u'$country_code': u'US', u'$model': u'iPhone6,1', u'$region': u'Florida', u'$unsubscribed': u':true', u'$timezone': u'America/New_York', u'$email': u'*****@*****.**', u'$last_name': u'Miller', u'$os': u'iPhone OS', u'Campaign Name': u'Super Sale', u'Referrering Domain': u'http://reddit.com', u'$city': u'Orange Park', u'$first_name': u'Jeffery', u'Current Level': 1, u'$predict_grade': u'A', u'Registration Date': u'2016-08-16T04:55:06', u'Campaign Source': u'Google Adwords'}}, {u'$distinct_id': u'20b54c07-6e7a-4014-a4e9-2ab9bc48378e', u'$properties': {u'Invited User?': u'False', u'App Version': u'3', u'Referrering Domain': u'Organic', u'$model': u'GT-I9500', u'$unsubscribed': u':true', u'$email': u'*****@*****.**', u'$last_name': u'Peterson', u'$os': u'Android', u'Campaign Name': u'Organic', u'$first_name': u'Walter', u'Current Level': 1, u'$predict_grade': u'A', u'Registration Date': u'2016-08-16T09:10:02', u'Campaign Source': u'Organic'}}, {u'$distinct_id': u'58d0f6a3-d533-41dd-9e31-2d6f84d7de2e', u'$properties': {u'Referrering Domain': u'http://baidu.com', u'Total Games Played': 2, u'$city': u'Beijing', u'Current Level': 3, u'$timezone': u'Asia/Shanghai', u'Invited User?': u'False', u'Last Visit': u'2016-08-16T19:42:29', u'$unsubscribed': u':true', u'Registration Date': u'2016-08-16T09:33:08', u'Last Game Played': u'2016-08-16T19:34:03', u'$os': u'iPhone OS', u'$email': u'*****@*****.**', u'Campaign Name': u'Organic', u'$country_code': u'CN', u'Last Level Completed': u'2016-08-16T19:40:13', u'App Version': u'3', u'$model': u'iPad4,1', u'$region': u'Beijing Shi', u'$last_name': u'West', u'$first_name': u'Ray', u'$predict_grade': u'A', u'Campaign Source': u'Organic'}}] test_list = self.mixpanel.list_from_items_filename('people_items_gold.json') self.assertEqual(expected_list, test_list) def test__export_data_with_events(self): with open('events_items_gold.json', 'rbU') as gold_json_file: gold_json_data = json.load(gold_json_file) self.mixpanel._export_data(gold_json_data, 'events_data.json') self.mixpanel._export_data(gold_json_data, 'events_data.csv', format='csv') with open('events_data.json', 'rbU') as j, open('events_data.csv', 'rbU') as c, \ open('events_items_gold.csv', 'rbU') as g: try: gold_csv_data = csv.reader(g) test_csv_data = csv.reader(c) test_json_data = json.load(j) self.assertItemsEqual(gold_json_data, test_json_data, msg="Exported JSON events data doesn't match.") self.assertItemsEqual(gold_csv_data, test_csv_data, msg="Exported CSV events data doesn't match.") finally: os.remove('events_data.json') os.remove('events_data.csv') def test__export_data_with_people(self): with open('people_items_gold.json', 'rbU') as gold_json_file: gold_json_data = json.load(gold_json_file) self.mixpanel._export_data(gold_json_data, 'people_data.json') self.mixpanel._export_data(gold_json_data, 'people_data.csv', format='csv') with open('people_data.json', 'rbU') as j, open('people_data.csv', 'rbU') as c, \ open('people_items_gold.csv', 'rbU') as g: try: gold_csv_data = csv.reader(g) test_csv_data = csv.reader(c) test_json_data = json.load(j) self.assertItemsEqual(gold_json_data, test_json_data, msg="Exported JSON People data doesn't match.") self.assertItemsEqual(gold_csv_data, test_csv_data, msg="Exported CSV People data doesn't match.") finally: os.remove('people_data.json') os.remove('people_data.csv') def test__prep_event_for_import(self): valid_event = {'event': 'page view', 'properties': {'distinct_id': 12345, 'prop1': 'val1', 'prop2': 'val2', 'time': 1471503600}} gold_event = {'event': 'page view', 'properties': {'token': '123', 'distinct_id': 12345, 'prop1': 'val1', 'prop2': 'val2', 'time': 1471528800}} no_time_event = {'event': 'page view', 'properties': {'distinct_id': 12345, 'prop1': 'val1', 'prop2': 'val2'}} no_distinct_id_event = {'event': 'page view', 'properties': {'prop1': 'val1', 'prop2': 'val2', 'time': 1471503600}} test_valid_event = self.mixpanel._prep_event_for_import(valid_event, '123', -7) test_no_time_event = self.mixpanel._prep_event_for_import(no_time_event, '123', -7) test_no_distinct_id_event = self.mixpanel._prep_event_for_import(no_distinct_id_event, '123', -7) self.assertEqual(gold_event, test_valid_event) self.assertIsNone(test_no_time_event) self.assertIsNone(test_no_distinct_id_event) with open('invalid_events_gold.txt', 'r') as g, open('invalid_events.txt') as t: try: gold_file_lines = g.readlines() gold_data = [] for line in gold_file_lines: gold_data.append(json.loads(line)) test_file_lines = t.readlines() test_data = [] for l in test_file_lines: test_data.append(json.loads(l)) self.assertItemsEqual(gold_data, test_data) finally: os.remove('invalid_events.txt') def test__prep_params_for_profile(self): input_profile = {'$distinct_id': 'abc123', '$properties': {'prop1': 'val1', 'prop2': 'val2'}} gold_profile = {'$ignore_time': True, '$ignore_alias': False, '$set': {'prop1': 'val1', 'prop2': 'val2'}, '$token': '123', '$distinct_id': 'abc123', '$ip': 0} test_profile = self.mixpanel._prep_params_for_profile(input_profile, '123', '$set', lambda profile: profile['$properties'], False, True) self.assertEqual(gold_profile, test_profile) def test__get_engage_page(self): params = {'where': '(("Kelly" in properties["$first_name"]) and (defined (properties["$first_name"])))'} test_data = self.mixpanel._get_engage_page(params) for item in self.gold_people_items[u'results']: self.assertIn(item, test_data['results']) def test__send_batch(self): event_batch = [] event_batch_with_token = [] people_batch = [] people_batch_with_token = [] random_name = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10)) from_date = (date.today() - timedelta(days=6)).strftime('%Y-%m-%d') to_date = date.today().strftime('%Y-%m-%d') for x in range(0, 50): event = {'event': random_name, 'properties': {'distinct_id': 'abc123', 'prop1': 'val1', '$import': True, 'time': (int(time.time()) - 5 * 24 * 60 * 60)}} event_batch.append(event) event_with_token = deepcopy(event) event_with_token['properties']['token'] = self.import_project.token event_batch_with_token.append(event_with_token) profile = {'$distinct_id': str(uuid.uuid4()), '$properties': {'prop 1': 'val1', '$name': random_name}} people_batch.append(profile) profile_with_token = deepcopy(profile) profile_with_token['$set'] = profile_with_token.pop('$properties') profile_with_token.update({'$token': self.import_project.token, '$ignore_time': True, '$ip': 0}) people_batch_with_token.append(profile_with_token) self.import_project._send_batch('import', event_batch_with_token) self.import_project._send_batch('engage', people_batch_with_token) # Delay to make sure items are ready for export time.sleep(10) events_params = {'from_date': from_date, 'to_date': to_date, 'event': [random_name]} test_event_data = self.import_project.query_export(events_params) people_params = {'where': '((properties["$name"] == "' + random_name + '"))'} test_people_data = self.import_project.query_engage(people_params) self.assertItemsEqual(event_batch, test_event_data) self.assertItemsEqual(people_batch, test_people_data) def test_request(self): seg_params = {'from_date': '2016-07-20', 'to_date': '2016-07-21', 'event': 'App Install'} seg_gold_data = '{"legend_size": 1, "data": {"series": ["2016-07-20", "2016-07-21"], "values": {"App Install": {"2016-07-20": 867, "2016-07-21": 2118}}}}' seg_test_data = self.mixpanel.request(Mixpanel.API_URL, ['segmentation'], seg_params) self.assertEqual(seg_gold_data, seg_test_data, msg='/segmentation data does not match') import_data = [{'event': 'page view', 'properties': {'prop1': 'val1', 'prop2': 'val2', 'distinct_id': 'abc123', 'token': '8b3b4ca883462e2d98d3879b5d259e59'}}, {'event': 'login', 'properties': {'prop3': 'val3', 'prop2': 'val2', 'distinct_id': 'xyz456', 'token': '8b3b4ca883462e2d98d3879b5d259e59'}}] payload = {"data": base64.b64encode(json.dumps(import_data)), "verbose": 1} import_response = self.import_project.request(Mixpanel.IMPORT_URL, ['import'], payload, method='POST') self.assertEqual('{"status": 1, "error": null}', import_response, msg='/import error in response') def test_query_export(self): with open('events_export_gold.json', 'rbU') as f: gold_data = json.load(f) params = {'from_date': '2016-07-20', 'to_date': '2016-07-21', 'event': ['App Install', 'Registration Complete']} test_data = self.mixpanel.query_export(params) self.assertItemsEqual(gold_data, test_data) def test_query_engage(self): params = {'where': '(("Kelly" in properties["$first_name"]) and (defined (properties["$first_name"])))'} gold_data = self.gold_people_items[u'results'] test_data = self.mixpanel.query_engage(params) for item in gold_data: self.assertIn(item, test_data) def test_export_events_to_json(self): params = {'from_date': '2016-07-20', 'to_date': '2016-07-21', 'event': ['App Install', 'Registration Complete']} self.mixpanel.export_events('events_export.json', params) with open('events_export_gold.json', 'rbU') as gold_file, \ open('events_export.json', 'rbU') as test_file: try: gold_file.seek(0) test_file.seek(0) gold_data = json.load(gold_file) test_data = json.load(test_file) self.assertItemsEqual(gold_data, test_data) finally: os.remove('events_export.json') def test_export_events_to_csv(self): params = {'from_date': '2016-07-20', 'to_date': '2016-07-21', 'event': ['App Install', 'Registration Complete']} self.mixpanel.export_events('events_export.csv', params, format='csv') with open('events_export_gold.csv', 'rbU') as gold_file, \ open('events_export.csv', 'rbU') as test_file: try: gold_file.seek(0) test_file.seek(0) gold_data = csv.reader(gold_file) test_data = csv.reader(test_file) self.assertItemsEqual(gold_data, test_data) finally: os.remove('events_export.csv') def test_export_people_to_json(self): params = {'where': '(("Kelly" in properties["$first_name"]) and (defined (properties["$first_name"])))'} gold_data = self.gold_people_items[u'results'] self.mixpanel.export_people('export_people.json', params) with open('export_people.json', 'rbU') as test: test_data = json.load(test) for item in gold_data: self.assertIn(item, test_data) os.remove('export_people.json') def test_export_people_to_csv(self): params = {'where': '(datetime(1472129993) > properties["Registration Date"])'} self.mixpanel.export_people('people_export.csv', params, format='csv') with open('people_export_gold.csv', 'rbU') as gold_file, open('people_export.csv', 'rbU') as test_file: try: gold_file.seek(0) test_file.seek(0) gold_data = csv.reader(gold_file) test_data = csv.reader(test_file) self.assertItemsEqual(gold_data, test_data) finally: os.remove('people_export.csv') def test_people_operation(self): self.assertRaises(AssertionError, self.no_token.people_operation, '$set', {'k', 'v'}) query_params = {'selector': '((properties["$city"] == "Amsterdam"))'} list = [{'$distinct_id': 'f19d1ece-cde1-4028-97ae-4d74fe45d426', '$properties': {'$city': 'Amsterdam'}}, {'$distinct_id': '1b9a8f3f-c249-40e8-b8f7-7ff0a88c1ebb', '$properties': {'$city': 'Amsterdam'}}, {'$distinct_id': '08966880-aa70-4363-b171-30527f4260dc', '$properties': {'$city': 'Amsterdam'}}, {'$distinct_id': '1f7fb2b4-3df2-4d2e-b720-aff5dc20a31e', '$properties': {'$city': 'Amsterdam'}}, {'$distinct_id': '072ddcd7-4065-42ba-af86-56c42459a480', '$properties': {'$city': 'Amsterdam'}}, {'$distinct_id': '1a403f78-3d50-4aca-98ce-bd4139d16625', '$properties': {'$city': 'Amsterdam'}}] self.mixpanel.people_operation('$set', {'test': True}, query_params=query_params) time.sleep(10) amsterdam_profiles = self.mixpanel.query_engage(query_params) test_profiles = self.mixpanel.query_engage({'selector': '(properties["test"] == true)'}) self.assertItemsEqual(amsterdam_profiles, test_profiles) self.mixpanel.people_operation('$set', lambda p: {'test': p['$properties']['$city']}, profiles=list, backup=True, backup_file='del_bak.json') time.sleep(10) amsterdam_profiles = self.mixpanel.query_engage(query_params) test_profiles = self.mixpanel.query_engage({'selector': '((properties["test"] == "Amsterdam"))'}) self.assertItemsEqual(amsterdam_profiles, test_profiles) with open('del_bak_gold.json', 'rbU') as gold, open('del_bak.json', 'rbU') as test: gold_data = json.load(gold) test_data = json.load(test) self.assertItemsEqual(gold_data, test_data) # Unset test prop so that export tests are not affected self.mixpanel.people_operation('$unset', ['test'], query_params={'selector': '(defined (properties["test"]))'}) os.remove('del_bak.json') # THE TESTS BELOW REQUIRE MANUALLY RESETTING THE import_mixpanelapi PROJECT - RESET NOW # https://mixpanel.com/report/1039391/ def test_import_events_json(self): with open('events_export_gold.json', 'rbU') as gold_json_file: gold_json_data = json.load(gold_json_file) self.import_project.import_events('events_export_gold.json') # Add a delay to ensure all imported events are ready for export time.sleep(10) params = {'from_date': '2016-07-20', 'to_date': '2016-07-21', 'event': ['App Install', 'Registration Complete']} test_json_data = self.import_project.query_export(params) self.assertItemsEqual(gold_json_data, test_json_data) def test_import_people_json(self): with open('people_export_gold.json', 'rbU') as gold_json_file: gold_json_data = json.load(gold_json_file) self.import_project.import_people('people_export_gold.json') # Add a delay to ensure all imported profiles are ready for export time.sleep(10) params = {'where': '(datetime(1472129993) > properties["Registration Date"])'} test_json_data = self.import_project.query_engage(params) self.assertItemsEqual(gold_json_data, test_json_data) # ANOTHER MANUAL RESET IS REQUIRED HERE def test_import_events_csv(self): with open('events_export_gold.json', 'rbU') as gold_json_file: gold_json_data = json.load(gold_json_file) self.import_project.import_events('events_export_gold.csv') # Add a delay to ensure all imported events are ready for export time.sleep(10) params = {'from_date': '2016-07-20', 'to_date': '2016-07-21', 'event': ['App Install', 'Registration Complete']} test_json_data = self.import_project.query_export(params) self.assertItemsEqual(gold_json_data, test_json_data) def test_import_people_csv(self): params = {'where': '(("Kelly" in properties["$first_name"]) and (defined (properties["$first_name"])))'} gold_data = self.gold_people_items[u'results'] self.import_project.import_people(gold_data) time.sleep(10) test_data = self.import_project.query_engage(params) self.assertItemsEqual(gold_data, test_data)