From 1c5778aeeb470c616c9bafbbe2760a7c40e9ab49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D0=B8=D1=81=20=D0=AE=D1=81=D1=83=D0=BF=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B5=D0=B2?= Date: Sat, 27 Jun 2026 17:56:03 +0300 Subject: [PATCH] add cse logs --- app/adapters/delivery_providers/cse/client.py | 5 ++ app/domain/payment_notifications.py | 4 +- .../cse/test_cse_adapter.py | 57 +++++++++++++++++++ tests/domain/test_payment_notifications.py | 4 +- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/app/adapters/delivery_providers/cse/client.py b/app/adapters/delivery_providers/cse/client.py index c28fa19..51a3f15 100644 --- a/app/adapters/delivery_providers/cse/client.py +++ b/app/adapters/delivery_providers/cse/client.py @@ -179,6 +179,7 @@ class CSEClient: "cse_request_server_error", operation=operation, status_code=response.status_code, + response_excerpt=_response_excerpt(response.text), ) raise CSEClientError( f"CSE {operation} request failed with status " @@ -233,6 +234,10 @@ class CSEClient: return self._retry_backoff_seconds * (2**attempt) +def _response_excerpt(text: str, *, limit: int = 1000) -> str: + return " ".join(text.split())[:limit] + + class CSEProvider(DeliveryProvider): name = CSE_PROVIDER_NAME diff --git a/app/domain/payment_notifications.py b/app/domain/payment_notifications.py index c78b9bd..da2a68d 100644 --- a/app/domain/payment_notifications.py +++ b/app/domain/payment_notifications.py @@ -5,7 +5,7 @@ from enum import Enum class TBankPaymentNotificationAction(str, Enum): ACKNOWLEDGE_ONLY = "acknowledge_only" - REGISTER_CDEK_ORDER = "register_cdek_order" + REGISTER_PROVIDER_ORDER = "register_provider_order" def resolve_tbank_payment_notification_action( @@ -15,7 +15,7 @@ def resolve_tbank_payment_notification_action( error_code: str, ) -> TBankPaymentNotificationAction: if status == "CONFIRMED" and success is True and error_code == "0": - return TBankPaymentNotificationAction.REGISTER_CDEK_ORDER + return TBankPaymentNotificationAction.REGISTER_PROVIDER_ORDER return TBankPaymentNotificationAction.ACKNOWLEDGE_ONLY diff --git a/tests/adapters/delivery_providers/cse/test_cse_adapter.py b/tests/adapters/delivery_providers/cse/test_cse_adapter.py index 642fc23..e5d5d86 100644 --- a/tests/adapters/delivery_providers/cse/test_cse_adapter.py +++ b/tests/adapters/delivery_providers/cse/test_cse_adapter.py @@ -7,6 +7,7 @@ import pytest from app.adapters.delivery_providers.cse import ( CSEClient, + CSEClientError, CSEProvider, CSERequestError, ) @@ -580,3 +581,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="\n CSE rejected SaveDocuments because field X is invalid \n", + ) + 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": ( + " CSE rejected SaveDocuments because field X is invalid " + "" + ), + } + ] diff --git a/tests/domain/test_payment_notifications.py b/tests/domain/test_payment_notifications.py index c55e0b4..8fc4efd 100644 --- a/tests/domain/test_payment_notifications.py +++ b/tests/domain/test_payment_notifications.py @@ -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: