karrio-server-manager 2025.5rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. karrio/server/manager/__init__.py +1 -0
  2. karrio/server/manager/admin.py +1 -0
  3. karrio/server/manager/apps.py +13 -0
  4. karrio/server/manager/migrations/0001_initial.py +1358 -0
  5. karrio/server/manager/migrations/0002_auto_20201127_0721.py +61 -0
  6. karrio/server/manager/migrations/0003_auto_20201230_0820.py +34 -0
  7. karrio/server/manager/migrations/0004_auto_20210125_2125.py +18 -0
  8. karrio/server/manager/migrations/0005_auto_20210216_0758.py +27 -0
  9. karrio/server/manager/migrations/0006_auto_20210307_0438.py +24 -0
  10. karrio/server/manager/migrations/0006_auto_20210308_0302.py +53 -0
  11. karrio/server/manager/migrations/0007_merge_20210311_1428.py +14 -0
  12. karrio/server/manager/migrations/0008_remove_shipment_doc_images.py +17 -0
  13. karrio/server/manager/migrations/0009_auto_20210326_1425.py +28 -0
  14. karrio/server/manager/migrations/0010_auto_20210403_1404.py +28 -0
  15. karrio/server/manager/migrations/0011_auto_20210426_1924.py +48 -0
  16. karrio/server/manager/migrations/0012_auto_20210427_1319.py +24 -0
  17. karrio/server/manager/migrations/0013_customs_invoice_date.py +18 -0
  18. karrio/server/manager/migrations/0014_auto_20210515_0928.py +24 -0
  19. karrio/server/manager/migrations/0015_auto_20210601_0340.py +182 -0
  20. karrio/server/manager/migrations/0016_shipment_archived.py +18 -0
  21. karrio/server/manager/migrations/0017_auto_20210629_1650.py +22 -0
  22. karrio/server/manager/migrations/0018_auto_20210705_1049.py +23 -0
  23. karrio/server/manager/migrations/0019_auto_20210722_1131.py +43 -0
  24. karrio/server/manager/migrations/0020_tracking_messages.py +20 -0
  25. karrio/server/manager/migrations/0021_tracking_estimated_delivery.py +18 -0
  26. karrio/server/manager/migrations/0022_auto_20211122_2100.py +53 -0
  27. karrio/server/manager/migrations/0023_auto_20211227_2141.py +118 -0
  28. karrio/server/manager/migrations/0024_alter_parcel_items.py +18 -0
  29. karrio/server/manager/migrations/0025_auto_20220113_1158.py +25 -0
  30. karrio/server/manager/migrations/0026_parcel_reference_number.py +18 -0
  31. karrio/server/manager/migrations/0027_custom_migration_2021_1.py +47 -0
  32. karrio/server/manager/migrations/0028_auto_20220303_1153.py +39 -0
  33. karrio/server/manager/migrations/0029_auto_20220303_1249.py +55 -0
  34. karrio/server/manager/migrations/0030_alter_shipment_status.py +44 -0
  35. karrio/server/manager/migrations/0031_shipment_invoice.py +34 -0
  36. karrio/server/manager/migrations/0032_custom_migration_2022_3.py +26 -0
  37. karrio/server/manager/migrations/0033_auto_20220504_1335.py +57 -0
  38. karrio/server/manager/migrations/0034_commodity_hs_code.py +18 -0
  39. karrio/server/manager/migrations/0035_parcel_options.py +26 -0
  40. karrio/server/manager/migrations/0036_alter_tracking_shipment.py +24 -0
  41. karrio/server/manager/migrations/0037_auto_20220710_1350.py +28 -0
  42. karrio/server/manager/migrations/0038_alter_tracking_status.py +18 -0
  43. karrio/server/manager/migrations/0039_documentuploadrecord.py +43 -0
  44. karrio/server/manager/migrations/0040_parcel_freight_class.py +18 -0
  45. karrio/server/manager/migrations/0041_alter_commodity_options_alter_parcel_options.py +29 -0
  46. karrio/server/manager/migrations/0042_remove_shipment_shipment_tracking_number_idx_and_more.py +658 -0
  47. karrio/server/manager/migrations/0043_customs_duty_billing_address_and_more.py +62 -0
  48. karrio/server/manager/migrations/0044_address_address_line1_temp_and_more.py +326 -0
  49. karrio/server/manager/migrations/0045_alter_customs_duty_billing_address_and_more.py +45 -0
  50. karrio/server/manager/migrations/0046_auto_20230114_0930.py +78 -0
  51. karrio/server/manager/migrations/0047_remove_shipment_shipment_tracking_number_idx_and_more.py +595 -0
  52. karrio/server/manager/migrations/0048_commodity_title_alter_commodity_description_and_more.py +53 -0
  53. karrio/server/manager/migrations/0049_auto_20230318_0708.py +39 -0
  54. karrio/server/manager/migrations/0050_address_street_number_tracking_account_number_and_more.py +60 -0
  55. karrio/server/manager/migrations/0051_auto_20230330_0556.py +56 -0
  56. karrio/server/manager/migrations/0052_auto_20230520_0811.py +35 -0
  57. karrio/server/manager/migrations/0053_alter_commodity_weight_unit_alter_parcel_weight_unit.py +32 -0
  58. karrio/server/manager/migrations/0054_alter_address_company_name_alter_address_person_name.py +22 -0
  59. karrio/server/manager/migrations/0055_alter_tracking_status.py +32 -0
  60. karrio/server/manager/migrations/0056_tracking_delivery_image_tracking_signature_image.py +22 -0
  61. karrio/server/manager/migrations/0057_alter_customs_invoice_date.py +18 -0
  62. karrio/server/manager/migrations/0058_manifest_shipment_manifest.py +124 -0
  63. karrio/server/manager/migrations/0059_shipment_return_address.py +24 -0
  64. karrio/server/manager/migrations/0060_pickup_meta_alter_address_country_code_and_more.py +527 -0
  65. karrio/server/manager/migrations/0061_alter_customs_incoterm.py +37 -0
  66. karrio/server/manager/migrations/0062_alter_tracking_status.py +35 -0
  67. karrio/server/manager/migrations/__init__.py +0 -0
  68. karrio/server/manager/models.py +984 -0
  69. karrio/server/manager/router.py +3 -0
  70. karrio/server/manager/serializers/__init__.py +50 -0
  71. karrio/server/manager/serializers/address.py +82 -0
  72. karrio/server/manager/serializers/commodity.py +51 -0
  73. karrio/server/manager/serializers/customs.py +84 -0
  74. karrio/server/manager/serializers/document.py +113 -0
  75. karrio/server/manager/serializers/manifest.py +85 -0
  76. karrio/server/manager/serializers/parcel.py +84 -0
  77. karrio/server/manager/serializers/pickup.py +285 -0
  78. karrio/server/manager/serializers/rate.py +19 -0
  79. karrio/server/manager/serializers/shipment.py +869 -0
  80. karrio/server/manager/serializers/tracking.py +250 -0
  81. karrio/server/manager/signals.py +70 -0
  82. karrio/server/manager/tests/__init__.py +10 -0
  83. karrio/server/manager/tests/test_addresses.py +110 -0
  84. karrio/server/manager/tests/test_custom_infos.py +97 -0
  85. karrio/server/manager/tests/test_parcels.py +104 -0
  86. karrio/server/manager/tests/test_pickups.py +345 -0
  87. karrio/server/manager/tests/test_shipments.py +833 -0
  88. karrio/server/manager/tests/test_trackers.py +215 -0
  89. karrio/server/manager/urls.py +10 -0
  90. karrio/server/manager/views/__init__.py +9 -0
  91. karrio/server/manager/views/addresses.py +154 -0
  92. karrio/server/manager/views/customs.py +159 -0
  93. karrio/server/manager/views/documents.py +131 -0
  94. karrio/server/manager/views/manifests.py +160 -0
  95. karrio/server/manager/views/parcels.py +155 -0
  96. karrio/server/manager/views/pickups.py +182 -0
  97. karrio/server/manager/views/shipments.py +335 -0
  98. karrio/server/manager/views/trackers.py +364 -0
  99. karrio_server_manager-2025.5rc1.dist-info/METADATA +28 -0
  100. karrio_server_manager-2025.5rc1.dist-info/RECORD +102 -0
  101. karrio_server_manager-2025.5rc1.dist-info/WHEEL +5 -0
  102. karrio_server_manager-2025.5rc1.dist-info/top_level.txt +2 -0
@@ -0,0 +1,833 @@
1
+ import json
2
+ from unittest.mock import ANY, patch
3
+ from django.urls import reverse
4
+ from rest_framework import status
5
+ from karrio.core.models import (
6
+ RateDetails,
7
+ ChargeDetails,
8
+ ShipmentDetails,
9
+ ConfirmationDetails,
10
+ )
11
+ from karrio.server.core.tests import APITestCase
12
+ import karrio.server.manager.models as models
13
+ import karrio.server.providers.models as providers
14
+
15
+
16
+ class TestShipmentFixture(APITestCase):
17
+ def setUp(self) -> None:
18
+ super().setUp()
19
+
20
+ self.shipper: models.Address = models.Address.objects.create(
21
+ **{
22
+ "postal_code": "E1C4Z8",
23
+ "city": "Moncton",
24
+ "federal_tax_id": None,
25
+ "state_tax_id": None,
26
+ "person_name": "John Poop",
27
+ "company_name": "A corp.",
28
+ "country_code": "CA",
29
+ "email": None,
30
+ "phone_number": "514 000 0000",
31
+ "state_code": "NB",
32
+ "street_number": None,
33
+ "residential": False,
34
+ "address_line1": "125 Church St",
35
+ "address_line2": None,
36
+ "validate_location": False,
37
+ "validation": None,
38
+ "created_by": self.user,
39
+ }
40
+ )
41
+ self.recipient: models.Address = models.Address.objects.create(
42
+ **{
43
+ "postal_code": "V6M2V9",
44
+ "city": "Vancouver",
45
+ "federal_tax_id": None,
46
+ "state_tax_id": None,
47
+ "person_name": "Jane Doe",
48
+ "company_name": "B corp.",
49
+ "country_code": "CA",
50
+ "email": None,
51
+ "phone_number": "514 000 9999",
52
+ "state_code": "BC",
53
+ "street_number": None,
54
+ "residential": False,
55
+ "address_line1": "5840 Oak St",
56
+ "address_line2": None,
57
+ "validate_location": False,
58
+ "validation": None,
59
+ "created_by": self.user,
60
+ }
61
+ )
62
+ self.parcel: models.Parcel = models.Parcel.objects.create(
63
+ **{
64
+ "weight": 1.0,
65
+ "weight_unit": "KG",
66
+ "package_preset": "canadapost_corrugated_small_box",
67
+ "created_by": self.user,
68
+ }
69
+ )
70
+ self.shipment: models.Shipment = models.Shipment.objects.create(
71
+ shipper=self.shipper,
72
+ recipient=self.recipient,
73
+ created_by=self.user,
74
+ test_mode=True,
75
+ payment={"currency": "CAD", "paid_by": "sender"},
76
+ )
77
+ self.shipment.parcels.set([self.parcel])
78
+
79
+
80
+ class TestShipments(APITestCase):
81
+ def test_create_shipment(self):
82
+ url = reverse("karrio.server.manager:shipment-list")
83
+ data = SHIPMENT_DATA
84
+
85
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
86
+ mock.return_value = RETURNED_RATES_VALUE
87
+ response = self.client.post(url, data)
88
+ response_data = json.loads(response.content)
89
+
90
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
91
+ self.assertDictEqual(response_data, SHIPMENT_RESPONSE)
92
+
93
+
94
+ class TestShipmentDetails(TestShipmentFixture):
95
+ def test_update_shipment_options(self):
96
+ url = reverse(
97
+ "karrio.server.manager:shipment-details",
98
+ kwargs=dict(pk=self.shipment.pk),
99
+ )
100
+ data = SHIPMENT_OPTIONS
101
+
102
+ response = self.client.put(url, data)
103
+ response_data = json.loads(response.content)
104
+
105
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
106
+ self.assertDictEqual(
107
+ response_data.get("options"), SHIPMENT_OPTIONS.get("options")
108
+ )
109
+
110
+ def test_shipment_rates(self):
111
+ url = reverse(
112
+ "karrio.server.manager:shipment-rates", kwargs=dict(pk=self.shipment.pk)
113
+ )
114
+
115
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
116
+ mock.return_value = RETURNED_RATES_VALUE
117
+ response = self.client.post(url, {})
118
+ response_data = json.loads(response.content)
119
+
120
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
121
+ self.assertDictEqual(dict(rates=response_data["rates"]), SHIPMENT_RATES)
122
+
123
+
124
+ class TestShipmentPurchase(TestShipmentFixture):
125
+ def setUp(self) -> None:
126
+ super().setUp()
127
+ carrier = providers.Carrier.objects.get(carrier_id="canadapost")
128
+ self.shipment.rates = [
129
+ {
130
+ "id": "rat_f5c1317021cb4b3c8a5d3b7369ed99e4",
131
+ "carrier_id": "canadapost",
132
+ "carrier_name": "canadapost",
133
+ "currency": "CAD",
134
+ "estimated_delivery": None,
135
+ "extra_charges": [
136
+ {"amount": 101.83, "currency": "CAD", "name": "Base charge"},
137
+ {"amount": 2.7, "currency": "CAD", "name": "Fuel surcharge"},
138
+ {"amount": -11.74, "currency": "CAD", "name": "SMB Savings"},
139
+ {"amount": -9.04, "currency": "CAD", "name": "Discount"},
140
+ {"amount": 13.92, "currency": "CAD", "name": "Duties and taxes"},
141
+ ],
142
+ "service": "canadapost_priority",
143
+ "total_charge": 106.71,
144
+ "transit_days": 2,
145
+ "test_mode": True,
146
+ "meta": {
147
+ "rate_provider": "canadapost",
148
+ "service_name": "CANADAPOST PRIORITY",
149
+ "carrier_connection_id": carrier.pk,
150
+ },
151
+ }
152
+ ]
153
+ self.shipment.save()
154
+
155
+ def test_purchase_shipment(self):
156
+ url = reverse(
157
+ "karrio.server.manager:shipment-purchase",
158
+ kwargs=dict(pk=self.shipment.pk),
159
+ )
160
+ data = SHIPMENT_PURCHASE_DATA
161
+
162
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
163
+ mock.return_value = CREATED_SHIPMENT_RESPONSE
164
+ response = self.client.post(url, data)
165
+ response_data = json.loads(response.content)
166
+
167
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
168
+ self.assertDictEqual(response_data, PURCHASED_SHIPMENT)
169
+
170
+ # Assert a tracker is created for the newly purchased shipment
171
+ self.assertTrue(
172
+ models.Tracking.objects.filter(
173
+ tracking_number=PURCHASED_SHIPMENT["tracking_number"]
174
+ ).exists()
175
+ )
176
+
177
+ def test_cancel_shipment(self):
178
+ url = reverse(
179
+ "karrio.server.manager:shipment-cancel",
180
+ kwargs=dict(pk=self.shipment.pk),
181
+ )
182
+
183
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
184
+ response = self.client.post(url)
185
+ response_data = json.loads(response.content)
186
+
187
+ mock.assert_not_called()
188
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
189
+ self.assertDictEqual(response_data, CANCEL_RESPONSE)
190
+
191
+ def test_cancel_purchased_shipment(self):
192
+ url = reverse(
193
+ "karrio.server.manager:shipment-cancel",
194
+ kwargs=dict(pk=self.shipment.pk),
195
+ )
196
+ self.shipment.status = "purchased"
197
+ self.shipment.shipment_identifier = "123456789012"
198
+ self.shipment.selected_rate_carrier = self.carrier
199
+ self.shipment.save()
200
+
201
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
202
+ mock.return_value = RETURNED_CANCEL_VALUE
203
+ response = self.client.post(url)
204
+ response_data = json.loads(response.content)
205
+
206
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
207
+ self.assertDictEqual(response_data, CANCEL_PURCHASED_RESPONSE)
208
+
209
+ self.assertFalse(
210
+ models.Tracking.objects.filter(
211
+ tracking_number=self.shipment.tracking_number,
212
+ ).exists()
213
+ )
214
+
215
+
216
+ SHIPMENT_DATA = {
217
+ "recipient": {
218
+ "address_line1": "125 Church St",
219
+ "person_name": "John Poop",
220
+ "company_name": "A corp.",
221
+ "phone_number": "514 000 0000",
222
+ "city": "Moncton",
223
+ "country_code": "CA",
224
+ "postal_code": "E1C4Z8",
225
+ "residential": False,
226
+ "state_code": "NB",
227
+ },
228
+ "shipper": {
229
+ "address_line1": "5840 Oak St",
230
+ "person_name": "Jane Doe",
231
+ "company_name": "B corp.",
232
+ "phone_number": "514 000 9999",
233
+ "city": "Vancouver",
234
+ "country_code": "CA",
235
+ "postal_code": "V6M2V9",
236
+ "residential": False,
237
+ "state_code": "BC",
238
+ },
239
+ "parcels": [
240
+ {
241
+ "weight": 1,
242
+ "weight_unit": "KG",
243
+ "package_preset": "canadapost_corrugated_small_box",
244
+ }
245
+ ],
246
+ "payment": {"currency": "CAD", "paid_by": "sender"},
247
+ "carrier_ids": ["canadapost"],
248
+ }
249
+
250
+ SHIPMENT_RATES = {
251
+ "rates": [
252
+ {
253
+ "id": ANY,
254
+ "object_type": "rate",
255
+ "carrier_name": "canadapost",
256
+ "carrier_id": "canadapost",
257
+ "currency": "CAD",
258
+ "estimated_delivery": ANY,
259
+ "service": "canadapost_priority",
260
+ "total_charge": 106.71,
261
+ "transit_days": 2,
262
+ "extra_charges": [
263
+ {"name": "Duty and taxes", "amount": 13.92, "currency": "CAD"},
264
+ {"name": "Fuel surcharge", "amount": 2.7, "currency": "CAD"},
265
+ {"name": "SMB Savings", "amount": -11.74, "currency": "CAD"},
266
+ {"name": "Discount", "amount": -9.04, "currency": "CAD"},
267
+ {"name": "Base surcharge", "amount": 101.83, "currency": "CAD"},
268
+ ],
269
+ "meta": {
270
+ "ext": "canadapost",
271
+ "carrier": "canadapost",
272
+ "rate_provider": "canadapost",
273
+ "service_name": "CANADAPOST PRIORITY",
274
+ "carrier_connection_id": ANY,
275
+ },
276
+ "test_mode": True,
277
+ }
278
+ ]
279
+ }
280
+
281
+ SHIPMENT_RESPONSE = {
282
+ "id": ANY,
283
+ "object_type": "shipment",
284
+ "status": "draft",
285
+ "carrier_name": None,
286
+ "carrier_id": None,
287
+ "label_type": "PDF",
288
+ "label_url": None,
289
+ "invoice_url": None,
290
+ "meta": {},
291
+ "metadata": {},
292
+ "tracking_number": None,
293
+ "shipment_identifier": None,
294
+ "selected_rate": None,
295
+ "selected_rate_id": None,
296
+ **SHIPMENT_RATES,
297
+ "tracking_url": None,
298
+ "tracker_id": None,
299
+ "shipper": {
300
+ "id": ANY,
301
+ "object_type": "address",
302
+ "postal_code": "V6M2V9",
303
+ "city": "Vancouver",
304
+ "federal_tax_id": None,
305
+ "state_tax_id": None,
306
+ "person_name": "Jane Doe",
307
+ "company_name": "B corp.",
308
+ "country_code": "CA",
309
+ "email": None,
310
+ "phone_number": "+1 514-000-9999",
311
+ "state_code": "BC",
312
+ "street_number": None,
313
+ "residential": False,
314
+ "address_line1": "5840 Oak St",
315
+ "address_line2": None,
316
+ "validate_location": False,
317
+ "validation": None,
318
+ },
319
+ "recipient": {
320
+ "id": ANY,
321
+ "object_type": "address",
322
+ "postal_code": "E1C4Z8",
323
+ "city": "Moncton",
324
+ "federal_tax_id": None,
325
+ "state_tax_id": None,
326
+ "person_name": "John Poop",
327
+ "company_name": "A corp.",
328
+ "country_code": "CA",
329
+ "email": None,
330
+ "phone_number": "+1 514-000-0000",
331
+ "state_code": "NB",
332
+ "street_number": None,
333
+ "residential": False,
334
+ "address_line1": "125 Church St",
335
+ "address_line2": None,
336
+ "validate_location": False,
337
+ "validation": None,
338
+ },
339
+ "parcels": [
340
+ {
341
+ "id": ANY,
342
+ "object_type": "parcel",
343
+ "weight": 1.0,
344
+ "width": 42.0,
345
+ "height": 32.0,
346
+ "length": 32.0,
347
+ "packaging_type": None,
348
+ "package_preset": "canadapost_corrugated_small_box",
349
+ "description": None,
350
+ "content": None,
351
+ "is_document": False,
352
+ "items": [],
353
+ "weight_unit": "KG",
354
+ "dimension_unit": "CM",
355
+ "freight_class": None,
356
+ "reference_number": ANY,
357
+ "options": {},
358
+ }
359
+ ],
360
+ "payment": {"account_number": None, "currency": "CAD", "paid_by": "sender"},
361
+ "return_address": None,
362
+ "billing_address": None,
363
+ "services": [],
364
+ "options": {"shipping_date": ANY, "shipment_date": ANY},
365
+ "customs": None,
366
+ "reference": None,
367
+ "carrier_ids": ["canadapost"],
368
+ "service": None,
369
+ "created_at": ANY,
370
+ "test_mode": True,
371
+ "messages": [],
372
+ }
373
+
374
+ SHIPMENT_OPTIONS = {
375
+ "options": {
376
+ "insurance": 54,
377
+ "currency": "CAD",
378
+ "shipment_date": "2050-01-01",
379
+ "shipping_date": "2050-01-01T10:30",
380
+ },
381
+ }
382
+
383
+ RETURNED_RATES_VALUE = [
384
+ [
385
+ RateDetails(
386
+ carrier_id="canadapost",
387
+ carrier_name="canadapost",
388
+ currency="CAD",
389
+ transit_days=2,
390
+ service="canadapost_priority",
391
+ total_charge=106.71,
392
+ extra_charges=[
393
+ ChargeDetails(amount=13.92, currency="CAD", name="Duty and taxes"),
394
+ ChargeDetails(amount=2.7, currency="CAD", name="Fuel surcharge"),
395
+ ChargeDetails(amount=-11.74, currency="CAD", name="SMB Savings"),
396
+ ChargeDetails(amount=-9.04, currency="CAD", name="Discount"),
397
+ ChargeDetails(amount=101.83, currency="CAD", name="Base surcharge"),
398
+ ],
399
+ )
400
+ ],
401
+ [],
402
+ ]
403
+
404
+ SHIPMENT_PURCHASE_DATA = {"selected_rate_id": "rat_f5c1317021cb4b3c8a5d3b7369ed99e4"}
405
+
406
+ SELECTED_RATE = {
407
+ "id": ANY,
408
+ "object_type": "rate",
409
+ "carrier_id": "canadapost",
410
+ "carrier_name": "canadapost",
411
+ "currency": "CAD",
412
+ "estimated_delivery": None,
413
+ "extra_charges": [
414
+ {"amount": 2.7, "currency": "CAD", "name": "Fuel surcharge"},
415
+ {"amount": -11.74, "currency": "CAD", "name": "SMB Savings"},
416
+ ],
417
+ "service": "canadapost_priority",
418
+ "total_charge": 106.71,
419
+ "transit_days": 2,
420
+ "meta": {
421
+ "ext": "canadapost",
422
+ "carrier": "canadapost",
423
+ "carrier_connection_id": ANY,
424
+ "rate_provider": "canadapost",
425
+ "service_name": "CANADAPOST PRIORITY",
426
+ },
427
+ "test_mode": True,
428
+ }
429
+
430
+ CREATED_SHIPMENT_RESPONSE = (
431
+ ShipmentDetails(
432
+ carrier_id="canadapost",
433
+ carrier_name="canadapost",
434
+ tracking_number="123456789012",
435
+ shipment_identifier="123456789012",
436
+ docs=dict(label="==apodifjoefr"),
437
+ ),
438
+ [],
439
+ )
440
+
441
+ RETURNED_CANCEL_VALUE = (
442
+ ConfirmationDetails(
443
+ carrier_name="canadapost",
444
+ carrier_id="canadapost",
445
+ success=True,
446
+ operation="Cancel Shipment",
447
+ ),
448
+ [],
449
+ )
450
+
451
+ PURCHASED_SHIPMENT = {
452
+ "id": ANY,
453
+ "object_type": "shipment",
454
+ "tracking_url": "/v1/trackers/canadapost/123456789012",
455
+ "shipper": {
456
+ "id": ANY,
457
+ "postal_code": "E1C4Z8",
458
+ "city": "Moncton",
459
+ "federal_tax_id": None,
460
+ "state_tax_id": None,
461
+ "person_name": "John Poop",
462
+ "company_name": "A corp.",
463
+ "country_code": "CA",
464
+ "email": None,
465
+ "phone_number": "514 000 0000",
466
+ "state_code": "NB",
467
+ "street_number": None,
468
+ "residential": False,
469
+ "address_line1": "125 Church St",
470
+ "address_line2": None,
471
+ "validate_location": False,
472
+ "object_type": "address",
473
+ "validation": None,
474
+ },
475
+ "recipient": {
476
+ "id": ANY,
477
+ "postal_code": "V6M2V9",
478
+ "city": "Vancouver",
479
+ "federal_tax_id": None,
480
+ "state_tax_id": None,
481
+ "person_name": "Jane Doe",
482
+ "company_name": "B corp.",
483
+ "country_code": "CA",
484
+ "email": None,
485
+ "phone_number": "514 000 9999",
486
+ "state_code": "BC",
487
+ "street_number": None,
488
+ "residential": False,
489
+ "address_line1": "5840 Oak St",
490
+ "address_line2": None,
491
+ "validate_location": False,
492
+ "object_type": "address",
493
+ "validation": None,
494
+ },
495
+ "parcels": [
496
+ {
497
+ "id": ANY,
498
+ "weight": 1.0,
499
+ "width": None,
500
+ "height": None,
501
+ "length": None,
502
+ "packaging_type": None,
503
+ "package_preset": "canadapost_corrugated_small_box",
504
+ "description": None,
505
+ "content": None,
506
+ "is_document": False,
507
+ "weight_unit": "KG",
508
+ "dimension_unit": None,
509
+ "items": [],
510
+ "freight_class": None,
511
+ "reference_number": ANY,
512
+ "object_type": "parcel",
513
+ "options": {},
514
+ }
515
+ ],
516
+ "services": [],
517
+ "options": {"shipping_date": ANY, "shipment_date": ANY},
518
+ "payment": {"paid_by": "sender", "currency": "CAD", "account_number": None},
519
+ "return_address": None,
520
+ "billing_address": None,
521
+ "customs": None,
522
+ "rates": [
523
+ {
524
+ "id": ANY,
525
+ "object_type": "rate",
526
+ "carrier_name": "canadapost",
527
+ "carrier_id": "canadapost",
528
+ "currency": "CAD",
529
+ "estimated_delivery": ANY,
530
+ "service": "canadapost_priority",
531
+ "total_charge": 106.71,
532
+ "transit_days": 2,
533
+ "extra_charges": [
534
+ {"name": "Base charge", "amount": 101.83, "currency": "CAD"},
535
+ {"name": "Fuel surcharge", "amount": 2.7, "currency": "CAD"},
536
+ {"name": "SMB Savings", "amount": -11.74, "currency": "CAD"},
537
+ {"name": "Discount", "amount": -9.04, "currency": "CAD"},
538
+ {"name": "Duties and taxes", "amount": 13.92, "currency": "CAD"},
539
+ ],
540
+ "meta": {
541
+ "service_name": "CANADAPOST PRIORITY",
542
+ "rate_provider": "canadapost",
543
+ "carrier_connection_id": ANY,
544
+ },
545
+ "test_mode": True,
546
+ }
547
+ ],
548
+ "reference": None,
549
+ "label_type": "PDF",
550
+ "carrier_ids": [],
551
+ "tracker_id": ANY,
552
+ "created_at": ANY,
553
+ "metadata": {},
554
+ "messages": [],
555
+ "status": "purchased",
556
+ "carrier_name": "canadapost",
557
+ "carrier_id": "canadapost",
558
+ "tracking_number": "123456789012",
559
+ "shipment_identifier": "123456789012",
560
+ "selected_rate": {
561
+ "id": ANY,
562
+ "object_type": "rate",
563
+ "carrier_name": "canadapost",
564
+ "carrier_id": "canadapost",
565
+ "currency": "CAD",
566
+ "estimated_delivery": ANY,
567
+ "service": "canadapost_priority",
568
+ "total_charge": 106.71,
569
+ "transit_days": 2,
570
+ "extra_charges": [
571
+ {"name": "Base charge", "amount": 101.83, "currency": "CAD"},
572
+ {"name": "Fuel surcharge", "amount": 2.7, "currency": "CAD"},
573
+ {"name": "SMB Savings", "amount": -11.74, "currency": "CAD"},
574
+ {"name": "Discount", "amount": -9.04, "currency": "CAD"},
575
+ {"name": "Duties and taxes", "amount": 13.92, "currency": "CAD"},
576
+ ],
577
+ "meta": {
578
+ "ext": "canadapost",
579
+ "carrier": "canadapost",
580
+ "service_name": "CANADAPOST PRIORITY",
581
+ "rate_provider": "canadapost",
582
+ "carrier_connection_id": ANY,
583
+ },
584
+ "test_mode": True,
585
+ },
586
+ "meta": {
587
+ "ext": "canadapost",
588
+ "carrier": "canadapost",
589
+ "rate_provider": "canadapost",
590
+ "service_name": "CANADAPOST PRIORITY",
591
+ },
592
+ "service": "canadapost_priority",
593
+ "selected_rate_id": ANY,
594
+ "test_mode": True,
595
+ "label_url": ANY,
596
+ "invoice_url": None,
597
+ }
598
+
599
+ CANCEL_RESPONSE = {
600
+ "id": ANY,
601
+ "object_type": "shipment",
602
+ "tracking_url": None,
603
+ "shipper": {
604
+ "id": ANY,
605
+ "postal_code": "E1C4Z8",
606
+ "city": "Moncton",
607
+ "federal_tax_id": None,
608
+ "state_tax_id": None,
609
+ "person_name": "John Poop",
610
+ "company_name": "A corp.",
611
+ "country_code": "CA",
612
+ "email": None,
613
+ "phone_number": "514 000 0000",
614
+ "state_code": "NB",
615
+ "street_number": None,
616
+ "residential": False,
617
+ "address_line1": "125 Church St",
618
+ "address_line2": None,
619
+ "validate_location": False,
620
+ "object_type": "address",
621
+ "validation": None,
622
+ },
623
+ "recipient": {
624
+ "id": ANY,
625
+ "postal_code": "V6M2V9",
626
+ "city": "Vancouver",
627
+ "federal_tax_id": None,
628
+ "state_tax_id": None,
629
+ "person_name": "Jane Doe",
630
+ "company_name": "B corp.",
631
+ "country_code": "CA",
632
+ "email": None,
633
+ "phone_number": "514 000 9999",
634
+ "state_code": "BC",
635
+ "street_number": None,
636
+ "residential": False,
637
+ "address_line1": "5840 Oak St",
638
+ "address_line2": None,
639
+ "validate_location": False,
640
+ "object_type": "address",
641
+ "validation": None,
642
+ },
643
+ "parcels": [
644
+ {
645
+ "id": ANY,
646
+ "weight": 1.0,
647
+ "width": None,
648
+ "height": None,
649
+ "length": None,
650
+ "packaging_type": None,
651
+ "package_preset": "canadapost_corrugated_small_box",
652
+ "description": None,
653
+ "content": None,
654
+ "is_document": False,
655
+ "weight_unit": "KG",
656
+ "dimension_unit": None,
657
+ "items": [],
658
+ "freight_class": None,
659
+ "reference_number": "0000000002",
660
+ "object_type": "parcel",
661
+ "options": {},
662
+ }
663
+ ],
664
+ "services": [],
665
+ "options": {},
666
+ "payment": {"paid_by": "sender", "currency": "CAD", "account_number": None},
667
+ "return_address": None,
668
+ "billing_address": None,
669
+ "customs": None,
670
+ "rates": [
671
+ {
672
+ "id": ANY,
673
+ "object_type": "rate",
674
+ "carrier_name": "canadapost",
675
+ "carrier_id": "canadapost",
676
+ "currency": "CAD",
677
+ "estimated_delivery": ANY,
678
+ "service": "canadapost_priority",
679
+ "total_charge": 106.71,
680
+ "transit_days": 2,
681
+ "extra_charges": [
682
+ {"name": "Base charge", "amount": 101.83, "currency": "CAD"},
683
+ {"name": "Fuel surcharge", "amount": 2.7, "currency": "CAD"},
684
+ {"name": "SMB Savings", "amount": -11.74, "currency": "CAD"},
685
+ {"name": "Discount", "amount": -9.04, "currency": "CAD"},
686
+ {"name": "Duties and taxes", "amount": 13.92, "currency": "CAD"},
687
+ ],
688
+ "meta": {
689
+ "carrier_connection_id": ANY,
690
+ "rate_provider": "canadapost",
691
+ "service_name": "CANADAPOST PRIORITY",
692
+ },
693
+ "test_mode": True,
694
+ }
695
+ ],
696
+ "reference": None,
697
+ "label_type": None,
698
+ "carrier_ids": [],
699
+ "tracker_id": None,
700
+ "created_at": ANY,
701
+ "metadata": {},
702
+ "messages": [],
703
+ "status": "cancelled",
704
+ "carrier_name": None,
705
+ "carrier_id": None,
706
+ "tracking_number": None,
707
+ "shipment_identifier": None,
708
+ "selected_rate": None,
709
+ "meta": {},
710
+ "service": None,
711
+ "selected_rate_id": None,
712
+ "test_mode": True,
713
+ "label_url": None,
714
+ "invoice_url": None,
715
+ }
716
+
717
+ CANCEL_PURCHASED_RESPONSE = {
718
+ "id": ANY,
719
+ "object_type": "shipment",
720
+ "tracking_url": None,
721
+ "shipper": {
722
+ "id": ANY,
723
+ "postal_code": "E1C4Z8",
724
+ "city": "Moncton",
725
+ "federal_tax_id": None,
726
+ "state_tax_id": None,
727
+ "person_name": "John Poop",
728
+ "company_name": "A corp.",
729
+ "country_code": "CA",
730
+ "email": None,
731
+ "phone_number": "514 000 0000",
732
+ "state_code": "NB",
733
+ "street_number": None,
734
+ "residential": False,
735
+ "address_line1": "125 Church St",
736
+ "address_line2": None,
737
+ "validate_location": False,
738
+ "object_type": "address",
739
+ "validation": None,
740
+ },
741
+ "recipient": {
742
+ "id": ANY,
743
+ "postal_code": "V6M2V9",
744
+ "city": "Vancouver",
745
+ "federal_tax_id": None,
746
+ "state_tax_id": None,
747
+ "person_name": "Jane Doe",
748
+ "company_name": "B corp.",
749
+ "country_code": "CA",
750
+ "email": None,
751
+ "phone_number": "514 000 9999",
752
+ "state_code": "BC",
753
+ "street_number": None,
754
+ "residential": False,
755
+ "address_line1": "5840 Oak St",
756
+ "address_line2": None,
757
+ "validate_location": False,
758
+ "object_type": "address",
759
+ "validation": None,
760
+ },
761
+ "parcels": [
762
+ {
763
+ "id": ANY,
764
+ "weight": 1.0,
765
+ "width": None,
766
+ "height": None,
767
+ "length": None,
768
+ "packaging_type": None,
769
+ "package_preset": "canadapost_corrugated_small_box",
770
+ "description": None,
771
+ "content": None,
772
+ "is_document": False,
773
+ "weight_unit": "KG",
774
+ "dimension_unit": None,
775
+ "items": [],
776
+ "freight_class": None,
777
+ "reference_number": "0000000002",
778
+ "object_type": "parcel",
779
+ "options": {},
780
+ }
781
+ ],
782
+ "services": [],
783
+ "options": {},
784
+ "payment": {"paid_by": "sender", "currency": "CAD", "account_number": None},
785
+ "return_address": None,
786
+ "billing_address": None,
787
+ "customs": None,
788
+ "rates": [
789
+ {
790
+ "id": ANY,
791
+ "object_type": "rate",
792
+ "carrier_name": "canadapost",
793
+ "carrier_id": "canadapost",
794
+ "currency": "CAD",
795
+ "estimated_delivery": ANY,
796
+ "service": "canadapost_priority",
797
+ "total_charge": 106.71,
798
+ "transit_days": 2,
799
+ "extra_charges": [
800
+ {"name": "Base charge", "amount": 101.83, "currency": "CAD"},
801
+ {"name": "Fuel surcharge", "amount": 2.7, "currency": "CAD"},
802
+ {"name": "SMB Savings", "amount": -11.74, "currency": "CAD"},
803
+ {"name": "Discount", "amount": -9.04, "currency": "CAD"},
804
+ {"name": "Duties and taxes", "amount": 13.92, "currency": "CAD"},
805
+ ],
806
+ "meta": {
807
+ "carrier_connection_id": ANY,
808
+ "rate_provider": "canadapost",
809
+ "service_name": "CANADAPOST PRIORITY",
810
+ },
811
+ "test_mode": True,
812
+ }
813
+ ],
814
+ "reference": None,
815
+ "label_type": None,
816
+ "carrier_ids": [],
817
+ "tracker_id": None,
818
+ "created_at": ANY,
819
+ "metadata": {},
820
+ "messages": [],
821
+ "status": "cancelled",
822
+ "carrier_name": "canadapost",
823
+ "carrier_id": "canadapost",
824
+ "tracking_number": None,
825
+ "shipment_identifier": "123456789012",
826
+ "selected_rate": None,
827
+ "meta": {},
828
+ "service": None,
829
+ "selected_rate_id": None,
830
+ "test_mode": True,
831
+ "label_url": None,
832
+ "invoice_url": None,
833
+ }