diff --git a/snowplow_tracker/test/integration/test_integration.py b/snowplow_tracker/test/integration/test_integration.py index 7758a266..4772b473 100644 --- a/snowplow_tracker/test/integration/test_integration.py +++ b/snowplow_tracker/test/integration/test_integration.py @@ -81,82 +81,6 @@ def test_integration_page_view(self) -> None: from_querystring(key, querystrings[-1]), expected_fields[key] ) - def test_integration_ecommerce_transaction_item(self) -> None: - t = tracker.Tracker([get_emitter], default_subject) - with HTTMock(pass_response_content): - t.track_ecommerce_transaction_item( - "12345", "pbz0025", 7.99, 2, "black-tarot", "tarot", currency="GBP" - ) - 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", - } - for key in expected_fields: - self.assertEqual( - from_querystring(key, querystrings[-1]), expected_fields[key] - ) - - def test_integration_ecommerce_transaction(self) -> None: - t = tracker.Tracker([get_emitter], default_subject) - with HTTMock(pass_response_content): - t.track_ecommerce_transaction( - "6a8078be", - 35, - city="London", - currency="GBP", - items=[ - {"sku": "pbz0026", "price": 20, "quantity": 1}, - {"sku": "pbz0038", "price": 15, "quantity": 1}, - ], - ) - - expected_fields = { - "e": "tr", - "tr_id": "6a8078be", - "tr_tt": "35", - "tr_ci": "London", - "tr_cu": "GBP", - } - for key in expected_fields: - self.assertEqual( - from_querystring(key, querystrings[-3]), expected_fields[key] - ) - - expected_fields = { - "e": "ti", - "ti_id": "6a8078be", - "ti_sk": "pbz0026", - "ti_pr": "20", - "ti_cu": "GBP", - } - for key in expected_fields: - self.assertEqual( - from_querystring(key, querystrings[-2]), expected_fields[key] - ) - - expected_fields = { - "e": "ti", - "ti_id": "6a8078be", - "ti_sk": "pbz0038", - "ti_pr": "15", - "ti_cu": "GBP", - } - for key in expected_fields: - self.assertEqual( - from_querystring(key, querystrings[-1]), expected_fields[key] - ) - - self.assertEqual( - from_querystring("ttm", querystrings[-3]), - from_querystring("ttm", querystrings[-2]), - ) - def test_integration_mobile_screen_view(self) -> None: t = tracker.Tracker([get_emitter], default_subject, encode_base64=False) with HTTMock(pass_response_content): diff --git a/snowplow_tracker/test/unit/test_tracker.py b/snowplow_tracker/test/unit/test_tracker.py index 9db98395..0d4eed47 100644 --- a/snowplow_tracker/test/unit/test_tracker.py +++ b/snowplow_tracker/test/unit/test_tracker.py @@ -33,10 +33,7 @@ UNSTRUCT_SCHEMA = "iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0" CONTEXT_SCHEMA = "iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-1" LINK_CLICK_SCHEMA = "iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1" -ADD_TO_CART_SCHEMA = "iglu:com.snowplowanalytics.snowplow/add_to_cart/jsonschema/1-0-0" -REMOVE_FROM_CART_SCHEMA = ( - "iglu:com.snowplowanalytics.snowplow/remove_from_cart/jsonschema/1-0-0" -) + FORM_CHANGE_SCHEMA = "iglu:com.snowplowanalytics.snowplow/change_form/jsonschema/1-0-0" FORM_SUBMIT_SCHEMA = "iglu:com.snowplowanalytics.snowplow/submit_form/jsonschema/1-0-0" SITE_SEARCH_SCHEMA = "iglu:com.snowplowanalytics.snowplow/site_search/jsonschema/1-0-0" @@ -646,192 +643,6 @@ def test_track_page_ping(self, mok_complete_payload: Any) -> None: self.assertIs(actualContextArg[0], ctx) self.assertEqual(actualTstampArg, evTstamp) - @mock.patch("snowplow_tracker.Tracker.complete_payload") - def test_track_ecommerce_transaction_item(self, mok_complete_payload: Any) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_complete_payload.side_effect = mocked_complete_payload - - t = Tracker(e) - ctx = SelfDescribingJson("test.context.schema", {"user": "tester"}) - evTstamp = 1399021242030 - t.track_ecommerce_transaction_item( - "1234", - "sku1234", - 3.14, - 1, - "itemName", - "itemCategory", - "itemCurrency", - context=[ctx], - tstamp=evTstamp, - ) - self.assertEqual(mok_complete_payload.call_count, 1) - completeArgsList = mok_complete_payload.call_args_list[0][0] - self.assertEqual(len(completeArgsList), 4) - - actualPayloadArg = completeArgsList[0] - actualContextArg = completeArgsList[1] - actualTstampArg = completeArgsList[2] - actualPairs = actualPayloadArg.nv_pairs - - expectedPairs = { - "e": "ti", - "ti_id": "1234", - "ti_sk": "sku1234", - "ti_nm": "itemName", - "ti_ca": "itemCategory", - "ti_pr": 3.14, - "ti_qu": 1, - "ti_cu": "itemCurrency", - } - self.assertDictEqual(actualPairs, expectedPairs) - self.assertIs(actualContextArg[0], ctx) - self.assertEqual(actualTstampArg, evTstamp) - - @mock.patch("snowplow_tracker.Tracker.complete_payload") - def test_track_ecommerce_transaction_no_items( - self, mok_complete_payload: Any - ) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_complete_payload.side_effect = mocked_complete_payload - - t = Tracker(e) - ctx = SelfDescribingJson("test.context.schema", {"user": "tester"}) - evTstamp = 1399021242030 - t.track_ecommerce_transaction( - "1234", - 10, - "transAffiliation", - 2.5, - 1.5, - "transCity", - "transState", - "transCountry", - "transCurrency", - context=[ctx], - tstamp=evTstamp, - ) - self.assertEqual(mok_complete_payload.call_count, 1) - completeArgsList = mok_complete_payload.call_args_list[0][0] - self.assertEqual(len(completeArgsList), 4) - actualPayloadArg = completeArgsList[0] - actualContextArg = completeArgsList[1] - actualTstampArg = completeArgsList[2] - actualPairs = actualPayloadArg.nv_pairs - - expectedPairs = { - "e": "tr", - "tr_id": "1234", - "tr_tt": 10, - "tr_af": "transAffiliation", - "tr_tx": 2.5, - "tr_sh": 1.5, - "tr_ci": "transCity", - "tr_st": "transState", - "tr_co": "transCountry", - "tr_cu": "transCurrency", - } - self.assertDictEqual(actualPairs, expectedPairs) - self.assertIs(actualContextArg[0], ctx) - self.assertEqual(actualTstampArg, evTstamp) - - @mock.patch("snowplow_tracker.Tracker.track_ecommerce_transaction_item") - @mock.patch("snowplow_tracker.Tracker.complete_payload") - def test_track_ecommerce_transaction_with_items( - self, mok_complete_payload: Any, mok_track_trans_item: Any - ) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_complete_payload.side_effect = mocked_complete_payload - mok_track_trans_item.side_effect = mocked_track_trans_item - - t = Tracker(e) - ctx = SelfDescribingJson("test.context.schema", {"user": "tester"}) - evTstamp = 1399021242030 - transItems = [ - {"sku": "sku1234", "quantity": 3, "price": 3.14}, - {"sku": "sku5678", "quantity": 1, "price": 2.72}, - ] - t.track_ecommerce_transaction( - "1234", - 10, - "transAffiliation", - 2.5, - 1.5, - "transCity", - "transState", - "transCountry", - "transCurrency", - items=transItems, - context=[ctx], - tstamp=evTstamp, - ) - - # Transaction - callCompleteArgsList = mok_complete_payload.call_args_list - firstCallArgsList = callCompleteArgsList[0][0] - self.assertEqual(len(firstCallArgsList), 4) - actualPayloadArg = firstCallArgsList[0] - actualContextArg = firstCallArgsList[1] - actualTstampArg = firstCallArgsList[2] - actualPairs = actualPayloadArg.nv_pairs - - expectedTransPairs = { - "e": "tr", - "tr_id": "1234", - "tr_tt": 10, - "tr_af": "transAffiliation", - "tr_tx": 2.5, - "tr_sh": 1.5, - "tr_ci": "transCity", - "tr_st": "transState", - "tr_co": "transCountry", - "tr_cu": "transCurrency", - } - self.assertDictEqual(actualPairs, expectedTransPairs) - self.assertIs(actualContextArg[0], ctx) - self.assertEqual(actualTstampArg, evTstamp) - - # Items - calls_to_track_trans_item = mok_track_trans_item.call_count - self.assertEqual(calls_to_track_trans_item, 2) - callTrackItemsArgsList = mok_track_trans_item.call_args_list - # 1st item - firstItemCallArgs = callTrackItemsArgsList[0][0] - self.assertEqual((), firstItemCallArgs) - firstItemCallKwargs = callTrackItemsArgsList[0][1] - - expectedFirstItemPairs = { - "tstamp": evTstamp, - "order_id": "1234", - "currency": "transCurrency", - "sku": "sku1234", - "quantity": 3, - "price": 3.14, - "event_subject": None, - } - self.assertDictEqual(firstItemCallKwargs, expectedFirstItemPairs) - # 2nd item - secItemCallArgs = callTrackItemsArgsList[1][0] - self.assertEqual((), secItemCallArgs) - secItemCallKwargs = callTrackItemsArgsList[1][1] - - expectedSecItemPairs = { - "tstamp": evTstamp, - "order_id": "1234", - "currency": "transCurrency", - "sku": "sku5678", - "quantity": 1, - "price": 2.72, - "event_subject": None, - } - self.assertDictEqual(secItemCallKwargs, expectedSecItemPairs) - @mock.patch("snowplow_tracker.Tracker.track_self_describing_event") def test_track_link_click(self, mok_track_unstruct: Any) -> None: mokEmitter = self.create_patch("snowplow_tracker.Emitter") @@ -894,132 +705,6 @@ def test_track_link_click_optional_none(self, mok_track_unstruct: Any) -> None: self.assertTrue(callArgs[1] is None) self.assertTrue(callArgs[2] is None) - @mock.patch("snowplow_tracker.Tracker.track_self_describing_event") - def test_track_add_to_cart(self, mok_track_unstruct: Any) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_track_unstruct.side_effect = mocked_track_unstruct - - t = Tracker(e) - ctx = SelfDescribingJson("test.context.schema", {"user": "tester"}) - evTstamp = 1399021242030 - - t.track_add_to_cart( - "sku1234", - 3, - "testName", - "testCategory", - 3.14, - "testCurrency", - context=[ctx], - tstamp=evTstamp, - ) - - expected = { - "schema": ADD_TO_CART_SCHEMA, - "data": { - "sku": "sku1234", - "quantity": 3, - "name": "testName", - "category": "testCategory", - "unitPrice": 3.14, - "currency": "testCurrency", - }, - } - - callArgs = mok_track_unstruct.call_args_list[0][0] - self.assertEqual(len(callArgs), 4) - self.assertDictEqual(callArgs[0].to_json(), expected) - self.assertIs(callArgs[1][0], ctx) - self.assertEqual(callArgs[2], evTstamp) - - @mock.patch("snowplow_tracker.Tracker.track_self_describing_event") - def test_track_add_to_cart_optional_none(self, mok_track_unstruct: Any) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_track_unstruct.side_effect = mocked_track_unstruct - - t = Tracker(e) - - t.track_add_to_cart("sku1234", 1) - - expected = { - "schema": ADD_TO_CART_SCHEMA, - "data": {"sku": "sku1234", "quantity": 1}, - } - - callArgs = mok_track_unstruct.call_args_list[0][0] - self.assertEqual(len(callArgs), 4) - self.assertDictEqual(callArgs[0].to_json(), expected) - self.assertTrue(callArgs[1] is None) - self.assertTrue(callArgs[2] is None) - - @mock.patch("snowplow_tracker.Tracker.track_self_describing_event") - def test_track_remove_from_cart(self, mok_track_unstruct: Any) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_track_unstruct.side_effect = mocked_track_unstruct - - t = Tracker(e) - ctx = SelfDescribingJson("test.context.schema", {"user": "tester"}) - evTstamp = 1399021242030 - - t.track_remove_from_cart( - "sku1234", - 3, - "testName", - "testCategory", - 3.14, - "testCurrency", - context=[ctx], - tstamp=evTstamp, - ) - - expected = { - "schema": REMOVE_FROM_CART_SCHEMA, - "data": { - "sku": "sku1234", - "quantity": 3, - "name": "testName", - "category": "testCategory", - "unitPrice": 3.14, - "currency": "testCurrency", - }, - } - - callArgs = mok_track_unstruct.call_args_list[0][0] - self.assertEqual(len(callArgs), 4) - self.assertDictEqual(callArgs[0].to_json(), expected) - self.assertIs(callArgs[1][0], ctx) - self.assertEqual(callArgs[2], evTstamp) - - @mock.patch("snowplow_tracker.Tracker.track_self_describing_event") - def test_track_remove_from_cart_optional_none( - self, mok_track_unstruct: Any - ) -> None: - mokEmitter = self.create_patch("snowplow_tracker.Emitter") - e = mokEmitter() - - mok_track_unstruct.side_effect = mocked_track_unstruct - - t = Tracker(e) - - t.track_remove_from_cart("sku1234", 1) - - expected = { - "schema": REMOVE_FROM_CART_SCHEMA, - "data": {"sku": "sku1234", "quantity": 1}, - } - - callArgs = mok_track_unstruct.call_args_list[0][0] - self.assertEqual(len(callArgs), 4) - self.assertDictEqual(callArgs[0].to_json(), expected) - self.assertTrue(callArgs[1] is None) - self.assertTrue(callArgs[2] is None) - @mock.patch("snowplow_tracker.Tracker.track_self_describing_event") def test_track_form_change(self, mok_track_unstruct: Any) -> None: mokEmitter = self.create_patch("snowplow_tracker.Emitter") diff --git a/snowplow_tracker/tracker.py b/snowplow_tracker/tracker.py index 20882a4f..f8be6a03 100644 --- a/snowplow_tracker/tracker.py +++ b/snowplow_tracker/tracker.py @@ -312,126 +312,6 @@ def track_link_click( event_json, context, tstamp, event_subject ) - def track_add_to_cart( - self, - sku: str, - quantity: int, - name: Optional[str] = None, - category: Optional[str] = None, - unit_price: Optional[float] = None, - currency: Optional[str] = None, - context: Optional[List[SelfDescribingJson]] = None, - tstamp: Optional[float] = None, - event_subject: Optional[_subject.Subject] = None, - ) -> "Tracker": - """ - :param sku: Item SKU or ID - :type sku: non_empty_string - :param quantity: Number added to cart - :type quantity: int - :param name: Item's name - :type name: string_or_none - :param category: Item's category - :type category: string_or_none - :param unit_price: Item's price - :type unit_price: int | float | None - :param currency: Type of currency the price is in - :type currency: string_or_none - :param context: Custom context for the event - :type context: context_array | None - :param tstamp: Optional event timestamp in milliseconds - :type tstamp: int | float | None - :param event_subject: Optional per event subject - :type event_subject: subject | None - :rtype: tracker - """ - warn( - "track_add_to_cart will be deprecated in future versions.", - DeprecationWarning, - stacklevel=2, - ) - non_empty_string(sku) - - properties = {} - properties["sku"] = sku - properties["quantity"] = quantity - if name is not None: - properties["name"] = name - if category is not None: - properties["category"] = category - if unit_price is not None: - properties["unitPrice"] = unit_price - if currency is not None: - properties["currency"] = currency - - event_json = SelfDescribingJson( - "%s/add_to_cart/%s/1-0-0" % (BASE_SCHEMA_PATH, SCHEMA_TAG), properties - ) - - return self.track_self_describing_event( - event_json, context, tstamp, event_subject - ) - - def track_remove_from_cart( - self, - sku: str, - quantity: int, - name: Optional[str] = None, - category: Optional[str] = None, - unit_price: Optional[float] = None, - currency: Optional[str] = None, - context: Optional[List[SelfDescribingJson]] = None, - tstamp: Optional[float] = None, - event_subject: Optional[_subject.Subject] = None, - ) -> "Tracker": - """ - :param sku: Item SKU or ID - :type sku: non_empty_string - :param quantity: Number added to cart - :type quantity: int - :param name: Item's name - :type name: string_or_none - :param category: Item's category - :type category: string_or_none - :param unit_price: Item's price - :type unit_price: int | float | None - :param currency: Type of currency the price is in - :type currency: string_or_none - :param context: Custom context for the event - :type context: context_array | None - :param tstamp: Optional event timestamp in milliseconds - :type tstamp: int | float | None - :param event_subject: Optional per event subject - :type event_subject: subject | None - :rtype: tracker - """ - warn( - "track_remove_from_cart will be deprecated in future versions.", - DeprecationWarning, - stacklevel=2, - ) - non_empty_string(sku) - - properties = {} - properties["sku"] = sku - properties["quantity"] = quantity - if name is not None: - properties["name"] = name - if category is not None: - properties["category"] = category - if unit_price is not None: - properties["unitPrice"] = unit_price - if currency is not None: - properties["currency"] = currency - - event_json = SelfDescribingJson( - "%s/remove_from_cart/%s/1-0-0" % (BASE_SCHEMA_PATH, SCHEMA_TAG), properties - ) - - return self.track_self_describing_event( - event_json, context, tstamp, event_subject - ) - def track_form_change( self, form_id: str, @@ -577,144 +457,6 @@ def track_site_search( event_json, context, tstamp, event_subject ) - def track_ecommerce_transaction_item( - self, - order_id: str, - sku: str, - price: float, - quantity: int, - name: Optional[str] = None, - category: Optional[str] = None, - currency: Optional[str] = None, - context: Optional[List[SelfDescribingJson]] = None, - tstamp: Optional[float] = None, - event_subject: Optional[_subject.Subject] = None, - ) -> "Tracker": - """ - This is an internal method called by track_ecommerce_transaction. - It is not for public use. - - :param order_id: Order ID - :type order_id: non_empty_string - :param sku: Item SKU - :type sku: non_empty_string - :param price: Item price - :type price: int | float - :param quantity: Item quantity - :type quantity: int - :param name: Item name - :type name: string_or_none - :param category: Item category - :type category: string_or_none - :param currency: The currency the price is expressed in - :type currency: string_or_none - :param context: Custom context for the event - :type context: context_array | None - :param tstamp: Optional event timestamp in milliseconds - :type tstamp: int | float | None - :param event_subject: Optional per event subject - :type event_subject: subject | None - :rtype: tracker - """ - warn( - "track_ecommerce_transaction_item will be deprecated in future versions.", - DeprecationWarning, - stacklevel=2, - ) - non_empty_string(order_id) - non_empty_string(sku) - - pb = payload.Payload() - pb.add("e", "ti") - pb.add("ti_id", order_id) - pb.add("ti_sk", sku) - pb.add("ti_nm", name) - pb.add("ti_ca", category) - pb.add("ti_pr", price) - pb.add("ti_qu", quantity) - pb.add("ti_cu", currency) - - return self.complete_payload(pb, context, tstamp, event_subject) - - def track_ecommerce_transaction( - self, - order_id: str, - total_value: float, - affiliation: Optional[str] = None, - tax_value: Optional[float] = None, - shipping: Optional[float] = None, - city: Optional[str] = None, - state: Optional[str] = None, - country: Optional[str] = None, - currency: Optional[str] = None, - items: Optional[List[Dict[str, Any]]] = None, - context: Optional[List[SelfDescribingJson]] = None, - tstamp: Optional[float] = None, - event_subject: Optional[_subject.Subject] = None, - ) -> "Tracker": - """ - :param order_id: ID of the eCommerce transaction - :type order_id: non_empty_string - :param total_value: Total transaction value - :type total_value: int | float - :param affiliation: Transaction affiliation - :type affiliation: string_or_none - :param tax_value: Transaction tax value - :type tax_value: int | float | None - :param shipping: Delivery cost charged - :type shipping: int | float | None - :param city: Delivery address city - :type city: string_or_none - :param state: Delivery address state - :type state: string_or_none - :param country: Delivery address country - :type country: string_or_none - :param currency: The currency the price is expressed in - :type currency: string_or_none - :param items: The items in the transaction - :type items: list(dict(str:\\*)) | None - :param context: Custom context for the event - :type context: context_array | None - :param tstamp: Optional event timestamp in milliseconds - :type tstamp: int | float | None - :param event_subject: Optional per event subject - :type event_subject: subject | None - :rtype: tracker - """ - warn( - "track_ecommerce_transaction will be deprecated in future versions.", - DeprecationWarning, - stacklevel=2, - ) - non_empty_string(order_id) - - pb = payload.Payload() - pb.add("e", "tr") - pb.add("tr_id", order_id) - pb.add("tr_tt", total_value) - pb.add("tr_af", affiliation) - pb.add("tr_tx", tax_value) - pb.add("tr_sh", shipping) - pb.add("tr_ci", city) - pb.add("tr_st", state) - pb.add("tr_co", country) - pb.add("tr_cu", currency) - - tstamp = Tracker.get_timestamp(tstamp) - - self.complete_payload(pb, context, tstamp, event_subject) - - if items is None: - items = [] - for item in items: - item["tstamp"] = tstamp - item["event_subject"] = event_subject - item["order_id"] = order_id - item["currency"] = currency - self.track_ecommerce_transaction_item(**item) - - return self - def track_screen_view( self, name: Optional[str] = None,