@@ -7,6 +7,7 @@ import pytest
|
||||
|
||||
from app.adapters.delivery_providers.cse import (
|
||||
CSEClient,
|
||||
CSEClientError,
|
||||
CSEProvider,
|
||||
CSERequestError,
|
||||
)
|
||||
@@ -314,6 +315,37 @@ def test_build_envelope_contains_credentials_and_payload() -> None:
|
||||
assert "geo-2" in text
|
||||
|
||||
|
||||
def test_save_order_envelope_serializes_properties_before_fields() -> None:
|
||||
body = order_mapper.map_cse_save_order_request(
|
||||
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",
|
||||
_params(),
|
||||
)
|
||||
|
||||
text = build_envelope(
|
||||
"SaveDocuments", login="test", password="2016", body=body
|
||||
).decode("utf-8")
|
||||
|
||||
order_start = text.index("<m:Key>Order</m:Key>")
|
||||
properties_index = text.index("<m:Properties>", order_start)
|
||||
fields_index = text.index("<m:Fields>", order_start)
|
||||
assert properties_index < fields_index
|
||||
|
||||
|
||||
def test_parse_calc_response_round_trip() -> None:
|
||||
root = parse_response(_CALC_RESPONSE, "Calc")
|
||||
assert root.key == "Calc"
|
||||
@@ -580,3 +612,59 @@ def test_application_error_in_response_raises_request_error() -> None:
|
||||
|
||||
with pytest.raises(CSERequestError):
|
||||
asyncio.run(provider.get_prices(_calc_request()))
|
||||
|
||||
|
||||
def test_server_error_logs_response_excerpt(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
warning_calls: list[dict[str, Any]] = []
|
||||
|
||||
def capture_warning(event: str, **kwargs: Any) -> None:
|
||||
warning_calls.append({"event": event, **kwargs})
|
||||
|
||||
monkeypatch.setattr(
|
||||
"app.adapters.delivery_providers.cse.client.log.warning",
|
||||
capture_warning,
|
||||
)
|
||||
response = httpx.Response(
|
||||
500,
|
||||
text="<fault>\n CSE rejected SaveDocuments because field X is invalid \n</fault>",
|
||||
)
|
||||
client, _ = _build_client([response])
|
||||
provider = CSEProvider(client)
|
||||
|
||||
with pytest.raises(CSEClientError):
|
||||
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",
|
||||
)
|
||||
)
|
||||
|
||||
assert warning_calls == [
|
||||
{
|
||||
"event": "cse_request_server_error",
|
||||
"operation": "SaveDocuments",
|
||||
"status_code": 500,
|
||||
"response_excerpt": (
|
||||
"<fault> CSE rejected SaveDocuments because field X is invalid "
|
||||
"</fault>"
|
||||
),
|
||||
}
|
||||
]
|
||||
|
||||
@@ -5,14 +5,14 @@ from app.domain.payment_notifications import (
|
||||
)
|
||||
|
||||
|
||||
def test_confirmed_success_zero_error_code_registers_cdek_order() -> None:
|
||||
def test_confirmed_success_zero_error_code_registers_provider_order() -> None:
|
||||
result = resolve_tbank_payment_notification_action(
|
||||
status="CONFIRMED",
|
||||
success=True,
|
||||
error_code="0",
|
||||
)
|
||||
|
||||
assert result is TBankPaymentNotificationAction.REGISTER_CDEK_ORDER
|
||||
assert result is TBankPaymentNotificationAction.REGISTER_PROVIDER_ORDER
|
||||
|
||||
|
||||
def test_confirmed_without_success_acknowledges_only() -> None:
|
||||
|
||||
Reference in New Issue
Block a user