Skip to content

Commit 8537831

Browse files
committed
track_transaction renamed to replace track_ecommerce_transaction (snowplow#25)
The transaction array argument has been split up.
1 parent 5f86d95 commit 8537831

3 files changed

Lines changed: 83 additions & 108 deletions

File tree

snowplow_tracker/test/integration/test_integration.py

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,44 @@ def test_integration_page_view(self):
5757
t.track_page_view("http://savethearctic.org", "Save The Arctic", None)
5858
self.assertEquals(from_querystring("page", querystrings[-1]),"Save+The+Arctic")
5959

60-
def test_integration_ecommerce_transaction(self):
60+
def test_integration_ecommerce_transaction_item(self):
6161
t = tracker.Tracker("localhost")
6262
with HTTMock(pass_response_content):
63-
t.track_ecommerce_transaction("12345", 9.99, "Web", 1.98, 3.05, "Sacramento", "California", "USA")
64-
expected_fields = {"tr_tt": "9.99", "e": "tr", "tr_id": "12345", "tr_sh": "3.05", "tr_st": "California", "tr_af": "Web", "tr_co": "USA", "tr_tx": "1.98", "tr_ci": "Sacramento"}
63+
t.track_ecommerce_transaction_item("12345", "pbz0025", 7.99, 2, "black-tarot", "tarot", ti_currency="GBP")
64+
expected_fields = {"ti_ca": "tarot", "ti_id": "12345", "ti_qu": "2", "ti_sk": "pbz0025", "e": "ti", "ti_nm": "black-tarot", "ti_pr": "7.99", "ti_cu": "GBP"}
6565
for key in expected_fields:
6666
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
6767

68-
def test_integration_ecommerce_transaction_item(self):
68+
def test_integration_ecommerce_transaction(self):
6969
t = tracker.Tracker("localhost")
7070
with HTTMock(pass_response_content):
71-
t.track_ecommerce_transaction_item("12345", "pbz0025", 7.99, 2, "black-tarot", "tarot", ti_currency="GBP")
72-
expected_fields = {"ti_ca": "tarot", "ti_id": "12345", "ti_qu": "2", "ti_sk": "pbz0025", "e": "ti", "ti_nm": "black-tarot", "ti_pr": "7.99", "ti_cu": "GBP"}
71+
t.track_ecommerce_transaction("6a8078be", 45, tr_city="London", tr_currency="GBP", items=
72+
[{
73+
"ti_sku": "pbz0026",
74+
"ti_price": 20,
75+
"ti_quantity": 1
76+
},
77+
{
78+
"ti_sku": "pbz0038",
79+
"ti_price": 15,
80+
"ti_quantity": 1
81+
}])
82+
83+
expected_fields = {"e": "tr", "tr_id": "6a8078be", "tr_tt": "45", "tr_ci": "London", "tr_cu": "GBP"}
84+
for key in expected_fields:
85+
self.assertEquals(from_querystring(key, querystrings[-3]), expected_fields[key])
86+
87+
expected_fields = {"e": "ti", "ti_id": "6a8078be", "ti_sk": "pbz0026", "ti_pr": "20", "ti_cu": "GBP"}
88+
for key in expected_fields:
89+
self.assertEquals(from_querystring(key, querystrings[-2]), expected_fields[key])
90+
91+
expected_fields = {"e": "ti", "ti_id": "6a8078be", "ti_sk": "pbz0038", "ti_pr": "15", "ti_cu": "GBP"}
7392
for key in expected_fields:
7493
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
7594

95+
for key in ["dtm", "tid"]:
96+
self.assertEquals(from_querystring(key, querystrings[-3]), from_querystring(key, querystrings[-2]))
97+
7698
def test_integration_screen_view(self):
7799
t = tracker.Tracker("localhost")
78100
with HTTMock(pass_response_content):
@@ -89,7 +111,6 @@ def test_integration_struct_event(self):
89111
for key in expected_fields:
90112
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
91113

92-
93114
def test_integration_unstruct_event_non_base64(self):
94115
t = tracker.Tracker("localhost", encode_base64=False)
95116
with HTTMock(pass_response_content):
@@ -145,45 +166,7 @@ def test_integration_standard_nv_pairs(self):
145166
for key in expected_fields:
146167
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
147168

148-
def test_integration_transaction(self):
149-
t = tracker.Tracker("localhost")
150-
with HTTMock(pass_response_content):
151-
t.track_transaction(
152-
{"order_id": "6a8078be",
153-
"tr_total_value": 45,
154-
"tr_city": "London",
155-
"tr_currency": "GBP"},
156-
157-
[{
158-
"ti_id": "6a8078be",
159-
"ti_sku": "pbz0026",
160-
"ti_price": 20,
161-
"ti_quantity": 1
162-
},
163-
{
164-
"ti_id": "6a8078be",
165-
"ti_sku": "pbz0038",
166-
"ti_price": 15,
167-
"ti_quantity": 1
168-
}])
169-
170-
expected_fields = {"e": "tr", "tr_id": "6a8078be", "tr_tt": "45", "tr_ci": "London", "tr_cu": "GBP"}
171-
for key in expected_fields:
172-
self.assertEquals(from_querystring(key, querystrings[-3]), expected_fields[key])
173-
174-
expected_fields = {"e": "ti", "ti_id": "6a8078be", "ti_sk": "pbz0026", "ti_pr": "20", "ti_cu": "GBP"}
175-
for key in expected_fields:
176-
self.assertEquals(from_querystring(key, querystrings[-2]), expected_fields[key])
177-
178-
expected_fields = {"e": "ti", "ti_id": "6a8078be", "ti_sk": "pbz0038", "ti_pr": "15", "ti_cu": "GBP"}
179-
for key in expected_fields:
180-
self.assertEquals(from_querystring(key, querystrings[-1]), expected_fields[key])
181-
182-
for key in ["dtm", "tid"]:
183-
self.assertEquals(from_querystring(key, querystrings[-3]), from_querystring(key, querystrings[-2]))
184-
185169
def test_integration_request_failure(self):
186170
t = tracker.Tracker("drnv83ldfo4ed.cloudfront.net")
187171
with HTTMock(fail_response_content):
188172
tracking_return_value = t.track_page_view("Title page")
189-
self.assertEquals(tracking_return_value, (False, 501))

snowplow_tracker/test/unit/test_tracker.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ class TestTracker(unittest.TestCase):
2929
def setUp(self):
3030
pass
3131

32-
"""
33-
Testing URI generator
34-
"""
35-
3632
def test_initialisation(self):
3733
t = Tracker("d3rkrsqld9gmqf.cloudfront.net", "cloudfront", encode_base64= False, app_id="AF003")
3834
self.assertEquals(t.standard_nv_pairs["tna"], "cloudfront")
3935
self.assertEquals(t.standard_nv_pairs["aid"], "AF003")
4036
self.assertEquals(t.config["encode_base64"], False)
4137

38+
"""
39+
Testing URI generator
40+
"""
41+
4242
def test_collector_uri_construction(self):
4343
host = "d3rkrsqld9gmqf.cloudfront.net"
4444
output = Tracker(host).collector_uri

snowplow_tracker/tracker.py

Lines changed: 51 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -219,57 +219,15 @@ def track_page_view(self, page_url, page_title=None, referrer=None, context=None
219219
pb.add_json(context, self.config["encode_base64"], "cx", "co")
220220
return self.track(pb)
221221

222-
@contract
223-
def track_ecommerce_transaction(self, order_id, tr_total_value,
224-
tr_affiliation=None, tr_tax_value=None, tr_shipping=None,
225-
tr_city=None, tr_state=None, tr_country=None, tr_currency=None,
226-
context=None,
227-
tstamp=None, tid=None):
228-
"""
229-
:param order_id: ID of the eCommerce transaction
230-
:type order_id: non_empty_string
231-
:param tr_total_value: Total transaction value
232-
:type tr_total_value: int | float
233-
:param tr_affiliation: Transaction affiliation
234-
:type tr_affiliation: string_or_none
235-
:param tr_tax_value: Transaction tax value
236-
:type tr_tax_value: int | float | None
237-
:param tr_shipping: Delivery cost charged
238-
:type tr_shipping: int | float | None
239-
:param tr_city: Delivery address city
240-
:type tr_city: string_or_none
241-
:param tr_state: Delivery address state
242-
:type tr_state: string_or_none
243-
:param tr_country: Delivery address country
244-
:type tr_country: string_or_none
245-
:param tr_currency: The currency the price is expressed in
246-
:type tr_currency: string_or_none
247-
:param context: Custom context for the event
248-
:type context: dict(str:*) | None
249-
:rtype: tuple(bool, int | str)
250-
"""
251-
pb = payload.Payload(tstamp)
252-
pb.add("e", "tr")
253-
pb.add("tr_id", order_id)
254-
pb.add("tr_af", tr_affiliation)
255-
pb.add("tr_tt", tr_total_value)
256-
pb.add("tr_tx", tr_tax_value)
257-
pb.add("tr_sh", tr_shipping)
258-
pb.add("tr_ci", tr_city)
259-
pb.add("tr_st", tr_state)
260-
pb.add("tr_co", tr_country)
261-
pb.add("tr_cu", tr_currency)
262-
pb.add("evn", DEFAULT_VENDOR)
263-
pb.add("tid", tid)
264-
pb.add_json(context, self.config["encode_base64"], "cx", "co")
265-
return self.track(pb)
266-
267222
@contract
268223
def track_ecommerce_transaction_item(self, ti_id, ti_sku, ti_price, ti_quantity,
269224
ti_name=None, ti_category=None, ti_currency=None,
270225
context=None,
271226
tstamp=None, tid=None):
272227
"""
228+
This is an internal method called by track_ecommerce_transaction.
229+
It is not for public use.
230+
273231
:param ti_id: Order ID
274232
:type ti_id: non_empty_string
275233
:param ti_sku: Item SKU
@@ -301,12 +259,32 @@ def track_ecommerce_transaction_item(self, ti_id, ti_sku, ti_price, ti_quantity,
301259
pb.add("tid", tid)
302260
pb.add_json(context, self.config["encode_base64"], "cx", "co")
303261
return self.track(pb)
304-
262+
305263
@contract
306-
def track_transaction(self, transaction, items, context=None, tstamp=None):
264+
def track_ecommerce_transaction(self, order_id, tr_total_value,
265+
tr_affiliation=None, tr_tax_value=None, tr_shipping=None,
266+
tr_city=None, tr_state=None, tr_country=None, tr_currency=None,
267+
items=None,
268+
context=None, tstamp=None):
307269
"""
308-
:param transaction The transaction event
309-
:type transaction dict(str:*)
270+
:param order_id: ID of the eCommerce transaction
271+
:type order_id: non_empty_string
272+
:param tr_total_value: Total transaction value
273+
:type tr_total_value: int | float
274+
:param tr_affiliation: Transaction affiliation
275+
:type tr_affiliation: string_or_none
276+
:param tr_tax_value: Transaction tax value
277+
:type tr_tax_value: int | float | None
278+
:param tr_shipping: Delivery cost charged
279+
:type tr_shipping: int | float | None
280+
:param tr_city: Delivery address city
281+
:type tr_city: string_or_none
282+
:param tr_state: Delivery address state
283+
:type tr_state: string_or_none
284+
:param tr_country: Delivery address country
285+
:type tr_country: string_or_none
286+
:param tr_currency: The currency the price is expressed in
287+
:type tr_currency: string_or_none
310288
:param items: The items in the transaction
311289
:type items: list(dict(str:*))
312290
:param context: Custom context for the event
@@ -315,26 +293,40 @@ def track_transaction(self, transaction, items, context=None, tstamp=None):
315293
"""
316294
if tstamp is None:
317295
tstamp = time.time()
296+
if tstamp and isinstance(tstamp, (int, float)):
297+
tstamp = int(tstamp * 1000)
318298

319299
tid = payload.Payload.set_transaction_id()
320300

321-
transaction["tstamp"] = tstamp
322-
transaction["tid"] = tid
323-
transaction_result = self.track_ecommerce_transaction(**transaction)
301+
pb = payload.Payload(tstamp)
302+
pb.add("e", "tr")
303+
pb.add("tr_id", order_id)
304+
pb.add("tr_tt", tr_total_value)
305+
pb.add("tr_af", tr_affiliation)
306+
pb.add("tr_tx", tr_tax_value)
307+
pb.add("tr_sh", tr_shipping)
308+
pb.add("tr_ci", tr_city)
309+
pb.add("tr_st", tr_state)
310+
pb.add("tr_co", tr_country)
311+
pb.add("tr_cu", tr_currency)
312+
pb.add("evn", DEFAULT_VENDOR)
313+
pb.add("tid", tid)
314+
pb.add("dtm", tstamp)
315+
pb.add_json(context, self.config["encode_base64"], "cx", "co")
316+
317+
transaction_result = self.track(pb)
324318

325319
item_results = []
326320

327-
if "tr_currency" in transaction:
328-
for item in items:
329-
item["ti_currency"] = transaction["tr_currency"]
330-
331321
for item in items:
332-
item["tstamp"] = tstamp
322+
item["tstamp"] = str(tstamp)
333323
item["tid"] = tid
324+
item["ti_id"] = order_id
325+
item["ti_currency"] = tr_currency
334326
item_results.append(self.track_ecommerce_transaction_item(**item))
335-
327+
336328
return {"transaction_result": transaction_result, "item_results": item_results}
337-
329+
338330
@contract
339331
def track_screen_view(self, name, id_=None, context=None, tstamp=None):
340332
"""

0 commit comments

Comments
 (0)