Skip to content

Commit 322fb3f

Browse files
committed
fix(tracking): support carrier_id selection
1 parent 8211f50 commit 322fb3f

5 files changed

Lines changed: 79 additions & 1 deletion

File tree

modules/core/karrio/server/core/serializers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,15 @@ class TrackingData(serializers.Serializer):
861861
required=True,
862862
help_text="The tracking carrier",
863863
)
864+
carrier_id = serializers.CharField(
865+
required=False,
866+
allow_blank=False,
867+
allow_null=True,
868+
help_text=(
869+
"Optional carrier connection identifier (connection id or carrier_id). "
870+
"Useful when multiple connections exist for the same carrier."
871+
),
872+
)
864873
account_number = serializers.CharField(
865874
required=False,
866875
allow_blank=True,

modules/manager/karrio/server/manager/serializers/tracking.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ class TrackingSerializer(TrackingDetails):
4747
def create(self, validated_data: dict, context, **kwargs) -> models.Tracking:
4848
options = validated_data["options"]
4949
metadata = validated_data["metadata"]
50-
carrier_filter = validated_data["carrier_filter"]
50+
carrier_filter = {
51+
**validated_data["carrier_filter"],
52+
**(
53+
{"carrier_id": validated_data["carrier_id"]}
54+
if validated_data.get("carrier_id")
55+
else {}
56+
),
57+
}
5158
tracking_number = validated_data["tracking_number"]
5259
account_number = validated_data.get("account_number")
5360
info = validated_data.get("info")

modules/manager/karrio/server/manager/tests/test_trackers.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,33 @@ def test_shipment_tracking_retry(self):
4444
self.assertDictEqual(response_data, TRACKING_RESPONSE)
4545
self.assertEqual(len(self.user.tracking_set.all()), 1)
4646

47+
def test_create_tracker_with_carrier_id(self):
48+
url = reverse("karrio.server.manager:trackers-list")
49+
data = dict(
50+
tracking_number="1Z12345E6205277936",
51+
carrier_name="ups",
52+
carrier_id="ups_domestic",
53+
)
54+
55+
with patch(
56+
"karrio.server.manager.serializers.tracking.Connections.first"
57+
) as connection_mock, patch("karrio.server.core.gateway.utils.identity") as mock:
58+
connection_mock.return_value = self.ups_carrier
59+
mock.return_value = RETURNED_VALUE
60+
61+
response = self.client.post(url, data)
62+
63+
self.assertResponseNoErrors(response)
64+
self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
65+
connection_mock.assert_called_once_with(
66+
context=ANY,
67+
raise_not_found=True,
68+
active=True,
69+
capability="tracking",
70+
carrier_name="ups",
71+
carrier_id="ups_domestic",
72+
)
73+
4774

4875
class TestTrackersUpdate(APITestCase):
4976
def setUp(self) -> None:

modules/proxy/karrio/server/proxy/tests/test_tracking.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,17 @@
33
from django.urls import reverse
44
from rest_framework import status
55
from karrio.core.models import TrackingDetails, TrackingEvent
6+
from karrio.server.core.serializers import TrackingData
67
from karrio.server.core.tests import APITestCase
78

89

910
class TestTracking(APITestCase):
11+
def test_tracking_data_accepts_carrier_id_without_test_mode_body_field(self):
12+
fields = TrackingData().fields
13+
14+
self.assertIn("carrier_id", fields)
15+
self.assertNotIn("test_mode", fields)
16+
1017
def test_tracking_shipment(self):
1118
url = reverse("karrio.server.proxy:get-tracking")
1219
data = dict(tracking_number="1Z12345E6205277936", carrier_name="ups")
@@ -19,6 +26,32 @@ def test_tracking_shipment(self):
1926
self.assertEqual(response.status_code, status.HTTP_200_OK)
2027
self.assertDictEqual(response_data, TRACKING_RESPONSE)
2128

29+
def test_tracking_shipment_with_carrier_id(self):
30+
url = reverse("karrio.server.proxy:get-tracking")
31+
data = dict(
32+
tracking_number="1Z12345E6205277936",
33+
carrier_name="ups",
34+
carrier_id="ups_domestic",
35+
)
36+
37+
with patch("karrio.server.core.gateway.Carriers.first") as carrier_mock, patch(
38+
"karrio.server.core.gateway.utils.identity"
39+
) as mock:
40+
carrier_mock.return_value = self.ups_carrier
41+
mock.return_value = RETURNED_VALUE
42+
43+
response = self.client.post(url, data)
44+
45+
self.assertEqual(response.status_code, status.HTTP_200_OK)
46+
carrier_mock.assert_called_once_with(
47+
active=True,
48+
capability="tracking",
49+
raise_not_found=True,
50+
context=ANY,
51+
carrier_name="ups",
52+
carrier_id="ups_domestic",
53+
)
54+
2255

2356
RETURNED_VALUE = [
2457
[

modules/proxy/karrio/server/proxy/views/tracking.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ def post(self, request: Request):
5757
query.get("hub") if "hub" in query else data["carrier_name"]
5858
),
5959
}
60+
if data.get("carrier_id"):
61+
carrier_filter["carrier_id"] = data["carrier_id"]
6062
data = {
6163
**data,
6264
"tracking_numbers": [data["tracking_number"]],

0 commit comments

Comments
 (0)