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."
|
||||
)
|
||||
|
||||
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)
|
||||
return CDEKOrderInfo(
|
||||
order_uuid=order_uuid,
|
||||
@@ -172,6 +174,20 @@ def _latest_status_code(statuses: object) -> str | None:
|
||||
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]:
|
||||
entity = payload.get("entity")
|
||||
related_entities = (
|
||||
@@ -306,16 +322,6 @@ def _map_package(request: InitPaymentRequest, order_uuid: str) -> dict[str, Any]
|
||||
"number": order_uuid,
|
||||
"weight": weight_grams,
|
||||
"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:
|
||||
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"
|
||||
|
||||
|
||||
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")
|
||||
|
||||
assert payload["comment"] == "Headphones"
|
||||
assert payload["packages"][0]["comment"] == "Headphones"
|
||||
assert payload["packages"][0]["items"] == [
|
||||
{
|
||||
"name": "Headphones",
|
||||
"ware_key": "order-uuid-1",
|
||||
"payment": {"value": 0},
|
||||
"cost": 50000,
|
||||
"amount": 1,
|
||||
"weight": 1000,
|
||||
}
|
||||
]
|
||||
assert "items" not in payload["packages"][0]
|
||||
|
||||
|
||||
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]["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:
|
||||
@@ -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:
|
||||
with pytest.raises(CDEKOrderMappingError):
|
||||
map_cdek_order_info_response({"requests": []})
|
||||
|
||||
Reference in New Issue
Block a user