@@ -214,16 +214,15 @@ class CSEClient:
|
|||||||
operation: str,
|
operation: str,
|
||||||
request_error_message: str,
|
request_error_message: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
for prop in root.properties:
|
error_codes = _response_error_codes(root)
|
||||||
if prop.key == "Error":
|
if error_codes:
|
||||||
codes = [item.value for item in prop.items if item.value]
|
|
||||||
log.warning(
|
log.warning(
|
||||||
"cse_response_error",
|
"cse_response_error",
|
||||||
operation=operation,
|
operation=operation,
|
||||||
error_codes=codes,
|
error_codes=error_codes,
|
||||||
)
|
)
|
||||||
raise CSERequestError(
|
raise CSERequestError(
|
||||||
f"{request_error_message} application error {codes}."
|
f"{request_error_message} application error {error_codes}."
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -238,6 +237,20 @@ def _response_excerpt(text: str, *, limit: int = 1000) -> str:
|
|||||||
return " ".join(text.split())[:limit]
|
return " ".join(text.split())[:limit]
|
||||||
|
|
||||||
|
|
||||||
|
def _response_error_codes(root: Element) -> list[str]:
|
||||||
|
codes: list[str] = []
|
||||||
|
_collect_response_error_codes(root, codes)
|
||||||
|
return codes
|
||||||
|
|
||||||
|
|
||||||
|
def _collect_response_error_codes(element: Element, codes: list[str]) -> None:
|
||||||
|
for prop in element.properties:
|
||||||
|
if prop.key == "Error":
|
||||||
|
codes.extend(item.value for item in prop.items if item.value)
|
||||||
|
for child in (*element.items, *element.tables):
|
||||||
|
_collect_response_error_codes(child, codes)
|
||||||
|
|
||||||
|
|
||||||
class CSEProvider(DeliveryProvider):
|
class CSEProvider(DeliveryProvider):
|
||||||
name = CSE_PROVIDER_NAME
|
name = CSE_PROVIDER_NAME
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,29 @@ _SAVE_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
|
|||||||
</soap:Body>
|
</soap:Body>
|
||||||
</soap:Envelope>"""
|
</soap:Envelope>"""
|
||||||
|
|
||||||
|
_SAVE_RESPONSE_DOCUMENT_ERROR = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
|
||||||
|
<soap:Body>
|
||||||
|
<m:SaveDocumentsResponse xmlns:m="http://www.cargo3.ru">
|
||||||
|
<m:return>
|
||||||
|
<m:Key>SaveDocuments</m:Key>
|
||||||
|
<m:List>
|
||||||
|
<m:Key>Order</m:Key>
|
||||||
|
<m:Properties>
|
||||||
|
<m:Key>Error</m:Key>
|
||||||
|
<m:Value>true</m:Value>
|
||||||
|
<m:ValueType>boolean</m:ValueType>
|
||||||
|
<m:List>
|
||||||
|
<m:Key>Description</m:Key>
|
||||||
|
<m:Value>SenderAddress is invalid</m:Value>
|
||||||
|
</m:List>
|
||||||
|
</m:Properties>
|
||||||
|
</m:List>
|
||||||
|
</m:return>
|
||||||
|
</m:SaveDocumentsResponse>
|
||||||
|
</soap:Body>
|
||||||
|
</soap:Envelope>"""
|
||||||
|
|
||||||
_TRACKING_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
|
_TRACKING_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
|
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
|
||||||
<soap:Body>
|
<soap:Body>
|
||||||
@@ -541,6 +564,38 @@ def test_provider_register_order_returns_document_number() -> None:
|
|||||||
assert http_client.calls[0]["url"] == "http://lk-test.cse.ru/1c/ws/web1c.1cws"
|
assert http_client.calls[0]["url"] == "http://lk-test.cse.ru/1c/ws/web1c.1cws"
|
||||||
|
|
||||||
|
|
||||||
|
def test_provider_register_order_raises_document_level_error() -> None:
|
||||||
|
response = httpx.Response(200, text=_SAVE_RESPONSE_DOCUMENT_ERROR)
|
||||||
|
client, _ = _build_client([response])
|
||||||
|
provider = CSEProvider(client)
|
||||||
|
|
||||||
|
with pytest.raises(CSERequestError, match="SenderAddress is invalid"):
|
||||||
|
asyncio.run(
|
||||||
|
provider.register_order(
|
||||||
|
make_init_payment_request(
|
||||||
|
systemData={
|
||||||
|
"tariff": {
|
||||||
|
"provider": "cse",
|
||||||
|
"serviceName": "Экспресс",
|
||||||
|
"price": 200000,
|
||||||
|
"deliveryDaysMin": 1,
|
||||||
|
"deliveryDaysMax": 2,
|
||||||
|
"tariffCode": "ДоставкаДоДверей|tariff-guid-2|urg-exp",
|
||||||
|
},
|
||||||
|
"parcelType": "parcel",
|
||||||
|
"weight": "1.0",
|
||||||
|
"dimensions": {
|
||||||
|
"length": "10",
|
||||||
|
"width": "10",
|
||||||
|
"height": "10",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
),
|
||||||
|
"order-uuid-1",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_provider_get_order_extracts_waybill_number_from_tracking() -> None:
|
def test_provider_get_order_extracts_waybill_number_from_tracking() -> None:
|
||||||
response = httpx.Response(200, text=_TRACKING_RESPONSE)
|
response = httpx.Response(200, text=_TRACKING_RESPONSE)
|
||||||
client, http_client = _build_client([response])
|
client, http_client = _build_client([response])
|
||||||
|
|||||||
Reference in New Issue
Block a user