This commit is contained in:
@@ -126,7 +126,9 @@ def map_cdek_order_info_response(payload: dict[str, Any]) -> CDEKOrderInfo:
|
|||||||
"CDEK order info response must include entity.uuid."
|
"CDEK order info response must include entity.uuid."
|
||||||
)
|
)
|
||||||
|
|
||||||
status_code = _latest_status_code(entity.get("statuses"))
|
status_code = _invalid_create_request_status(
|
||||||
|
payload.get("requests")
|
||||||
|
) or _latest_status_code(entity.get("statuses"))
|
||||||
waybill_uuid, _ = _extract_waybill(payload)
|
waybill_uuid, _ = _extract_waybill(payload)
|
||||||
return CDEKOrderInfo(
|
return CDEKOrderInfo(
|
||||||
order_uuid=order_uuid,
|
order_uuid=order_uuid,
|
||||||
@@ -172,6 +174,20 @@ def _latest_status_code(statuses: object) -> str | None:
|
|||||||
return dated[-1][1]
|
return dated[-1][1]
|
||||||
|
|
||||||
|
|
||||||
|
def _invalid_create_request_status(requests: object) -> str | None:
|
||||||
|
if not isinstance(requests, list):
|
||||||
|
return None
|
||||||
|
for entry in requests:
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
continue
|
||||||
|
if entry.get("type") != "CREATE" or entry.get("state") != "INVALID":
|
||||||
|
continue
|
||||||
|
errors = entry.get("errors")
|
||||||
|
if isinstance(errors, list) and errors:
|
||||||
|
return "INVALID"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _extract_waybill(payload: dict[str, Any]) -> tuple[str | None, str | None]:
|
def _extract_waybill(payload: dict[str, Any]) -> tuple[str | None, str | None]:
|
||||||
entity = payload.get("entity")
|
entity = payload.get("entity")
|
||||||
related_entities = (
|
related_entities = (
|
||||||
@@ -306,16 +322,6 @@ def _map_package(request: InitPaymentRequest, order_uuid: str) -> dict[str, Any]
|
|||||||
"number": order_uuid,
|
"number": order_uuid,
|
||||||
"weight": weight_grams,
|
"weight": weight_grams,
|
||||||
"comment": description,
|
"comment": description,
|
||||||
"items": [
|
|
||||||
{
|
|
||||||
"name": description,
|
|
||||||
"ware_key": order_uuid,
|
|
||||||
"payment": {"value": 0},
|
|
||||||
"cost": request.content.declared_value,
|
|
||||||
"amount": 1,
|
|
||||||
"weight": weight_grams,
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
if system_data.parcel_type == "parcel" and system_data.dimensions is not None:
|
if system_data.parcel_type == "parcel" and system_data.dimensions is not None:
|
||||||
package.update(_map_dimensions(system_data.dimensions))
|
package.update(_map_dimensions(system_data.dimensions))
|
||||||
|
|||||||
@@ -198,21 +198,12 @@ def test_order_payload_includes_company_requisites_for_legal_entity() -> None:
|
|||||||
assert sender["kpp"] == "770701001"
|
assert sender["kpp"] == "770701001"
|
||||||
|
|
||||||
|
|
||||||
def test_order_payload_maps_content_to_comments_and_declared_value_item() -> None:
|
def test_order_payload_maps_content_to_comments_without_items() -> None:
|
||||||
payload = map_cdek_order_request(make_init_payment_request(), "order-uuid-1")
|
payload = map_cdek_order_request(make_init_payment_request(), "order-uuid-1")
|
||||||
|
|
||||||
assert payload["comment"] == "Headphones"
|
assert payload["comment"] == "Headphones"
|
||||||
assert payload["packages"][0]["comment"] == "Headphones"
|
assert payload["packages"][0]["comment"] == "Headphones"
|
||||||
assert payload["packages"][0]["items"] == [
|
assert "items" not in payload["packages"][0]
|
||||||
{
|
|
||||||
"name": "Headphones",
|
|
||||||
"ware_key": "order-uuid-1",
|
|
||||||
"payment": {"value": 0},
|
|
||||||
"cost": 50000,
|
|
||||||
"amount": 1,
|
|
||||||
"weight": 1000,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def test_order_payload_falls_back_package_comment_to_order_uuid() -> None:
|
def test_order_payload_falls_back_package_comment_to_order_uuid() -> None:
|
||||||
@@ -224,7 +215,7 @@ def test_order_payload_falls_back_package_comment_to_order_uuid() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
assert payload["packages"][0]["comment"] == "order-uuid-1"
|
assert payload["packages"][0]["comment"] == "order-uuid-1"
|
||||||
assert payload["packages"][0]["items"][0]["name"] == "order-uuid-1"
|
assert "items" not in payload["packages"][0]
|
||||||
|
|
||||||
|
|
||||||
def test_order_payload_includes_company_for_individual_sender_as_full_name() -> None:
|
def test_order_payload_includes_company_for_individual_sender_as_full_name() -> None:
|
||||||
@@ -285,6 +276,37 @@ def test_map_cdek_order_info_response_returns_none_status_when_statuses_empty()
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_map_cdek_order_info_response_maps_invalid_create_request_to_invalid_status() -> None:
|
||||||
|
result = map_cdek_order_info_response(
|
||||||
|
{
|
||||||
|
"entity": {
|
||||||
|
"uuid": "cdek-order-uuid",
|
||||||
|
"statuses": [
|
||||||
|
{"code": "ACCEPTED", "date_time": "2026-05-24T10:00:00+0000"}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"requests": [
|
||||||
|
{
|
||||||
|
"type": "CREATE",
|
||||||
|
"state": "INVALID",
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "ve_delivery_can_not_has_goods",
|
||||||
|
"message": "Заказ типа доставка не может содержать товары",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result == CDEKOrderInfo(
|
||||||
|
order_uuid="cdek-order-uuid",
|
||||||
|
status_code="INVALID",
|
||||||
|
waybill_uuid=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_map_cdek_order_info_response_raises_for_missing_entity() -> None:
|
def test_map_cdek_order_info_response_raises_for_missing_entity() -> None:
|
||||||
with pytest.raises(CDEKOrderMappingError):
|
with pytest.raises(CDEKOrderMappingError):
|
||||||
map_cdek_order_info_response({"requests": []})
|
map_cdek_order_info_response({"requests": []})
|
||||||
|
|||||||
Reference in New Issue
Block a user