Skip to content

Commit cac0399

Browse files
committed
Added tests for contexts and unstructured events.
Removed event vendor from the payload and context vendor from tracker construction. (snowplow#87) (snowplow#88)
1 parent 3f6619c commit cac0399

3 files changed

Lines changed: 53 additions & 19 deletions

File tree

snowplow_tracker/test/integration/test_integration.py

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,16 @@
2424
import re
2525
import redis
2626
import json
27+
import base64
2728
from snowplow_tracker import tracker, _version, consumer, subject
2829
from httmock import all_requests, HTTMock
2930

31+
try:
32+
from urllib.parse import unquote_plus # Python 3
33+
34+
except ImportError:
35+
from urllib import unquote_plus # Python 2
36+
3037
querystrings = [""]
3138

3239
default_consumer = consumer.Consumer("localhost", protocol="http", port=80)
@@ -121,18 +128,52 @@ def test_integration_struct_event(self):
121128
def test_integration_unstruct_event_non_base64(self):
122129
t = tracker.Tracker(default_consumer, default_subject, encode_base64=False)
123130
with HTTMock(pass_response_content):
124-
t.track_unstruct_event({"schema": "com.acme/viewed_product/json/2-0-2", "data": {"product_id": "ASO01043", "price$flt": 49.95, "walrus$tms": int(time.time() * 1000)}})
131+
t.track_unstruct_event({"schema": "com.acme/viewed_product/json/2-0-2", "data": {"product_id": "ASO01043", "price$flt": 49.95, "walrus$tms": 1000}})
125132
expected_fields = {"e": "ue"}
126133
for key in expected_fields:
127134
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
135+
envelope_string = from_querystring("ue_pr", querystrings[-1])
136+
envelope = json.loads(unquote_plus(envelope_string))
137+
self.assertEquals(envelope, {
138+
"schema": "com.snowplowanalytics/unstruct_event/json/1-0-0",
139+
"data": {"schema": "com.acme/viewed_product/json/2-0-2", "data": {"product_id": "ASO01043", "price$flt": 49.95, "walrus$tms": 1000}}
140+
})
128141

129142
def test_integration_unstruct_event_base64(self):
130-
t = tracker.Tracker(default_consumer, default_subject)
143+
t = tracker.Tracker(default_consumer, default_subject, encode_base64=True)
131144
with HTTMock(pass_response_content):
132-
t.track_unstruct_event({"schema": "com.acme/viewed_product/json/2-0-2", "data": {"product_id": "ASO01043", "price$flt": 49.95, "walrus$tms": int(time.time() * 1000)}})
145+
t.track_unstruct_event({"schema": "com.acme/viewed_product/json/2-0-2", "data": {"product_id": "ASO01043", "price$flt": 49.95, "walrus$tms": 1000}})
133146
expected_fields = {"e": "ue"}
134147
for key in expected_fields:
135148
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
149+
envelope_string = from_querystring("ue_px", querystrings[-1])
150+
envelope = json.loads((base64.urlsafe_b64decode(envelope_string)).decode("utf-8"))
151+
self.assertEquals(envelope, {
152+
"schema": "com.snowplowanalytics/unstruct_event/json/1-0-0",
153+
"data": {"schema": "com.acme/viewed_product/json/2-0-2", "data": {"product_id": "ASO01043", "price$flt": 49.95, "walrus$tms": 1000}}
154+
})
155+
156+
def test_integration_context_non_base64(self):
157+
t = tracker.Tracker(default_consumer, default_subject, encode_base64=False)
158+
with HTTMock(pass_response_content):
159+
t.track_page_view("localhost", "local host", None, [{"schema": "com.example/user/json/2-0-3", "data": {"user_type": "tester"}}])
160+
envelope_string = from_querystring("co", querystrings[-1])
161+
envelope = json.loads(unquote_plus(envelope_string))
162+
self.assertEquals(envelope, {
163+
"schema": "com.snowplowanalytics/contexts/json/1-0-0",
164+
"data":[{"schema": "com.example/user/json/2-0-3", "data": {"user_type": "tester"}}]
165+
})
166+
167+
def test_integration_context_base64(self):
168+
t = tracker.Tracker(default_consumer, default_subject, encode_base64=True)
169+
with HTTMock(pass_response_content):
170+
t.track_page_view("localhost", "local host", None, [{"schema": "com.example/user/json/2-0-3", "data": {"user_type": "tester"}}])
171+
envelope_string = from_querystring("cx", querystrings[-1])
172+
envelope = json.loads((base64.urlsafe_b64decode(envelope_string)).decode("utf-8"))
173+
self.assertEquals(envelope, {
174+
"schema": "com.snowplowanalytics/contexts/json/1-0-0",
175+
"data":[{"schema": "com.example/user/json/2-0-3", "data": {"user_type": "tester"}}]
176+
})
136177

137178
def test_integration_standard_nv_pairs(self):
138179
s = subject.Subject()
@@ -146,7 +187,7 @@ def test_integration_standard_nv_pairs(self):
146187
t = tracker.Tracker(consumer.Consumer("localhost"), s, "cf", app_id="angry-birds-android")
147188
with HTTMock(pass_response_content):
148189
t.track_page_view("localhost", "local host")
149-
expected_fields = {"tna": "cf", "evn": "com.snowplowanalytics", "res": "100x200",
190+
expected_fields = {"tna": "cf", "res": "100x200",
150191
"lang": "en", "aid": "angry-birds-android", "cd": "24", "tz": "Europe+London",
151192
"p": "mob", "tv": "py-" + _version.__version__}
152193
for key in expected_fields:

snowplow_tracker/test/unit/test_tracker.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ def setUp(self):
3232
pass
3333

3434
def test_initialisation(self):
35-
t = Tracker(Consumer("d3rkrsqld9gmqf.cloudfront.net"), namespace="cloudfront", encode_base64= False, app_id="AF003", context_vendor="com.example")
35+
t = Tracker(Consumer("d3rkrsqld9gmqf.cloudfront.net"), namespace="cloudfront", encode_base64= False, app_id="AF003")
3636
self.assertEquals(t.standard_nv_pairs["tna"], "cloudfront")
3737
self.assertEquals(t.standard_nv_pairs["aid"], "AF003")
3838
self.assertEquals(t.encode_base64, False)
39-
self.assertEquals(t.context_vendor, "com.example")
4039

4140
def test_get_transaction_id(self):
4241
tid = Tracker.get_transaction_id()

snowplow_tracker/tracker.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131

3232
VERSION = "py-%s" % _version.__version__
3333
DEFAULT_ENCODE_BASE64 = True
34-
DEFAULT_VENDOR = "com.snowplowanalytics"
35-
CONTEXT_SCHEMA = "com.snowplowanalytics/contexts/1.0.0"
36-
UNSTRUCT_EVENT_SCHEMA = "com.snowplowanalytics/unstruct_event/1.0.0"
34+
SNOWPLOW_VENDOR = "com.snowplowanalytics"
35+
SCHEMA_TAG = "json"
36+
CONTEXT_SCHEMA = "com.snowplowanalytics/contexts/%s/1-0-0" % SCHEMA_TAG
37+
UNSTRUCT_EVENT_SCHEMA = "com.snowplowanalytics/unstruct_event/%s/1-0-0" % SCHEMA_TAG
3738

3839

3940
"""
@@ -54,7 +55,7 @@ class Tracker:
5455

5556
@contract
5657
def __init__(self, out_queue, _subject=None,
57-
namespace=None, app_id=None, context_vendor=None, encode_base64=DEFAULT_ENCODE_BASE64):
58+
namespace=None, app_id=None, encode_base64=DEFAULT_ENCODE_BASE64):
5859
"""
5960
:param out_queue: Consumer to which events will be sent
6061
:type out_queue: consumer
@@ -64,18 +65,15 @@ def __init__(self, out_queue, _subject=None,
6465
:type namespace: string_or_none
6566
:param app_id: Application ID
6667
:type app_id: string_or_none
67-
:param context_vendor: Reversed domain name of the company which defined the custom contexts
68-
:type context_vendor: string_or_none
6968
:param encode_base64: Whether JSONs in the payload should be base-64 encoded
7069
:type encode_base64: bool
7170
"""
7271
if _subject is None:
7372
_subject = subject.Subject()
7473

7574
self.out_queue = out_queue
76-
self.subject = _subject
75+
self.subject = _subject
7776
self.encode_base64 = encode_base64
78-
self.context_vendor = context_vendor
7977

8078
self.standard_nv_pairs = {
8179
"tv": VERSION,
@@ -173,7 +171,6 @@ def track_page_view(self, page_url, page_title=None, referrer=None, context=None
173171
pb.add("url", page_url)
174172
pb.add("page", page_title)
175173
pb.add("refr", referrer)
176-
pb.add("evn", DEFAULT_VENDOR)
177174

178175
return self.complete_payload(pb, context, tstamp)
179176

@@ -213,7 +210,6 @@ def track_ecommerce_transaction_item(self, order_id, sku, price, quantity,
213210
pb.add("ti_pr", price)
214211
pb.add("ti_qu", quantity)
215212
pb.add("ti_cu", currency)
216-
pb.add("evn", DEFAULT_VENDOR)
217213

218214
return self.complete_payload(pb, context, tstamp)
219215

@@ -259,7 +255,6 @@ def track_ecommerce_transaction(self, order_id, total_value,
259255
pb.add("tr_st", state)
260256
pb.add("tr_co", country)
261257
pb.add("tr_cu", currency)
262-
pb.add("evn", DEFAULT_VENDOR)
263258

264259
tstamp = Tracker.get_timestamp(tstamp)
265260

@@ -294,7 +289,7 @@ def track_screen_view(self, name, id_=None, context=None, tstamp=None):
294289
screen_view_properties["id"] = id_
295290

296291
event_json = {
297-
"schema": DEFAULT_VENDOR + "/screen_view/json/1-0-0",
292+
"schema": SNOWPLOW_VENDOR + "/screen_view/%s/1-0-0" % SCHEMA_TAG,
298293
"data": screen_view_properties
299294
}
300295
return self.track_unstruct_event(event_json, context, tstamp)
@@ -327,7 +322,6 @@ def track_struct_event(self, category, action, label=None, property_=None, value
327322
pb.add("se_la", label)
328323
pb.add("se_pr", property_)
329324
pb.add("se_va", value)
330-
pb.add("evn", DEFAULT_VENDOR)
331325

332326
return self.complete_payload(pb, context, tstamp)
333327

0 commit comments

Comments
 (0)