def test_integration_standard_nv_pairs(self): s = subject.Subject() s.set_platform("mob") s.set_user_id("user12345") s.set_screen_resolution(100, 200) s.set_color_depth(24) s.set_timezone("Europe London") s.set_lang("en") t = tracker.Tracker(emitters.Emitter("localhost"), s, "cf", app_id="angry-birds-android") with HTTMock(pass_response_content): t.track_page_view("localhost", "local host") expected_fields = { "tna": "cf", "res": "100x200", "lang": "en", "aid": "angry-birds-android", "cd": "24", "tz": "Europe+London", "p": "mob", "tv": "py-" + _version.__version__ } for key in expected_fields: self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
def test_timestamps(self): emitter = emitters.Emitter("localhost", protocol="http", port=80, method='post', buffer_size=4) t = tracker.Tracker([emitter], default_subject) with HTTMock(pass_post_response_content): with freeze_time("2013-01-14 03:21:34"): t.track_page_view("localhost", "stamp0", None, tstamp=None) t.track_page_view("localhost", "stamp1", None, tstamp=1358933694000) with freeze_time("2013-01-14 03:22:36"): t.track_page_view("localhost", "stamp2", None, tstamp=DeviceTimestamp(1458133694000)) t.track_page_view("localhost", "stamp3", None, tstamp=TrueTimestamp(1458033694000)) expected_timestamps = [ { "dtm": "1358133694000", "ttm": None, "stm": "1358133756000" }, { "dtm": "1358933694000", "ttm": None, "stm": "1358133756000" }, { "dtm": "1458133694000", "ttm": None, "stm": "1358133756000" }, { "dtm": None, "ttm": "1458033694000", "stm": "1358133756000" }, ] request = querystrings[-1] for i, event in enumerate(expected_timestamps): self.assertEquals(request["data"][i].get("dtm"), expected_timestamps[i]["dtm"]) self.assertEquals(request["data"][i].get("ttm"), expected_timestamps[i]["ttm"]) self.assertEquals(request["data"][i].get("stm"), expected_timestamps[i]["stm"]) self.assertEquals(request["data"][i].get("page"), "stamp" + str(i))
def test_integration_failure_callback(self): callback_success_queue = [] callback_failure_queue = [] callback_emitter = emitters.Emitter( "localhost", on_success=lambda x: callback_success_queue.append(x), on_failure=lambda x, y: callback_failure_queue.append(x)) t = tracker.Tracker(callback_emitter, default_subject) with HTTMock(fail_response_content): t.track_page_view("http://www.example.com") self.assertEquals(callback_success_queue, []) self.assertEquals(callback_failure_queue[0], 0)
def test_post_batched(self): post_emitter = emitters.Emitter("localhost", protocol="http", port=80, method='post', buffer_size=2) t = tracker.Tracker(post_emitter, default_subject) with HTTMock(pass_post_response_content): t.track_struct_event("Test", "A") t.track_struct_event("Test", "B") self.assertEquals(querystrings[-1]["data"][0]["se_ac"], "A") self.assertEquals(querystrings[-1]["data"][1]["se_ac"], "B")
def test_integration_failure_callback(self): callback_success_queue = [] callback_failure_queue = [] callback_emitter = emitters.Emitter( "localhost", on_success=lambda x: callback_success_queue.append(x), on_failure=lambda x, y: callback_failure_queue.append(x)) t = tracker.Tracker([callback_emitter], default_subject) with HTTMock(fail_response_content): t.track_struct_event("Test", "A") self.assertEquals(callback_success_queue, []) self.assertEquals(callback_failure_queue[0], 0)
def test_bytelimit(self): post_emitter = emitters.Emitter("localhost", protocol="http", port=80, method='post', buffer_size=5, byte_limit=420) t = tracker.Tracker(post_emitter, default_subject) with HTTMock(pass_post_response_content): t.track_struct_event("Test", "A") # 140 bytes t.track_struct_event("Test", "A") # 280 bytes t.track_struct_event("Test", "A") # 420 bytes. Send t.track_struct_event("Test", "AA") # 141 self.assertEquals(len(querystrings[-1]["data"]), 3) self.assertEqual(post_emitter.bytes_queued, 141)
def test_integration_success_callback(self): callback_success_queue = [] callback_failure_queue = [] callback_emitter = emitters.Emitter( "localhost", on_success=lambda x: callback_success_queue.append(x), on_failure=lambda x, y: callback_failure_queue.append(x)) t = tracker.Tracker([callback_emitter], default_subject) with HTTMock(pass_response_content): t.track_page_view("http://www.example.com") expected = { "e": "pv", "url": "http://www.example.com", } self.assertEqual(len(callback_success_queue), 1) for k in expected.keys(): self.assertEqual(callback_success_queue[0][0][k], expected[k]) self.assertEqual(callback_failure_queue, [])
def test_integration_event_subject(self): s = subject.Subject() s.set_domain_user_id("4616bfb38f872d16") s.set_ip_address("255.255.255.255") t = tracker.Tracker([emitters.Emitter("localhost")], s, "cf", app_id="angry-birds-android") evSubject = subject.Subject().set_domain_user_id( "1111aaa11a111a11").set_lang("EN") with HTTMock(pass_response_content): t.track_page_view("localhost", "local host", event_subject=evSubject) expected_fields = {"duid": "1111aaa11a111a11", "lang": "EN"} for key in expected_fields: self.assertEqual(from_querystring(key, querystrings[-1]), expected_fields[key])
def test_timestamps(self): emitter = emitters.Emitter("localhost", protocol="http", port=80, method='post', buffer_size=3) t = tracker.Tracker([emitter], default_subject) with HTTMock(pass_post_response_content): t.track_page_view("localhost", "stamp0", None, tstamp=None) t.track_page_view("localhost", "stamp1", None, tstamp=1358933694000) t.track_page_view("localhost", "stamp2", None, tstamp=1358933694000.00) expected_timestamps = [{ "dtm": "1618790401000", "ttm": None, "stm": "1618790401000" }, { "dtm": "1618790401000", "ttm": "1358933694000", "stm": "1618790401000" }, { "dtm": "1618790401000", "ttm": "1358933694000", "stm": "1618790401000" }] request = querystrings[-1] for i, event in enumerate(expected_timestamps): self.assertEqual(request["data"][i].get("dtm"), expected_timestamps[i]["dtm"]) self.assertEqual(request["data"][i].get("ttm"), expected_timestamps[i]["ttm"]) self.assertEqual(request["data"][i].get("stm"), expected_timestamps[i]["stm"])
def test_integration_identification_methods(self): s = subject.Subject() s.set_domain_user_id("4616bfb38f872d16") s.set_ip_address("255.255.255.255") s.set_useragent( "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)") s.set_network_user_id("fbc6c76c-bce5-43ce-8d5a-31c5") t = tracker.Tracker([emitters.Emitter("localhost")], s, "cf", app_id="angry-birds-android") with HTTMock(pass_response_content): t.track_page_view("localhost", "local host") expected_fields = { "duid": "4616bfb38f872d16", "ip": "255.255.255.255", "ua": "Mozilla%2F5.0+%28compatible%3B+MSIE+9.0%3B+Windows+NT+6.0%3B+Trident%2F5.0%29", "tnuid": "fbc6c76c-bce5-43ce-8d5a-31c5" } for key in expected_fields: self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
import re import redis import json import base64 from snowplow_tracker import tracker, _version, emitters, subject from httmock import all_requests, HTTMock try: from urllib.parse import unquote_plus # Python 3 except ImportError: from urllib import unquote_plus # Python 2 querystrings = [""] default_emitter = emitters.Emitter("localhost", protocol="http", port=80) default_subject = subject.Subject() def from_querystring(field, url): pattern = re.compile("^[^#]*[?&]" + field + "=([^&#]*)") match = pattern.match(url) if match: return match.groups()[0] @all_requests def pass_response_content(url, request): querystrings.append(request.url) return {"url": request.url, "status_code": 200}
import base64 try: from urllib.parse import unquote_plus # Python 3 except ImportError: from urllib import unquote_plus # Python 2 from httmock import all_requests, HTTMock from freezegun import freeze_time from snowplow_tracker import tracker, _version, emitters, subject from snowplow_tracker.timestamp import DeviceTimestamp, TrueTimestamp from snowplow_tracker.self_describing_json import SelfDescribingJson querystrings = [""] default_emitter = emitters.Emitter("localhost", protocol="http", port=80) post_emitter = emitters.Emitter("localhost", protocol="http", port=80, method='post', buffer_size=1) default_subject = subject.Subject() def from_querystring(field, url): pattern = re.compile("^[^#]*[?&]" + field + "=([^&#]*)") match = pattern.match(url) if match: return match.groups()[0]