@@ -32,10 +32,9 @@ class StoredOrder:
|
||||
payload: dict[str, Any] = field(default_factory=_default_payload)
|
||||
payment_status: str | None = None
|
||||
tbank_payment_id: int | None = None
|
||||
cdek_order_uuid: str | None = None
|
||||
cse_order_number: str | None = None
|
||||
cdek_waybill_uuid: str | None = None
|
||||
cdek_waybill_url: str | None = None
|
||||
provider_order_id: str | None = None
|
||||
provider_waybill_id: str | None = None
|
||||
provider_waybill_url: str | None = None
|
||||
payment_email_sent_at: object | None = None
|
||||
|
||||
|
||||
@@ -72,10 +71,10 @@ class StubOrderRepository:
|
||||
self,
|
||||
*,
|
||||
orders: list[StoredOrder] | None = None,
|
||||
mark_cdek_errors: list[Exception | None] | None = None,
|
||||
mark_provider_errors: list[Exception | None] | None = None,
|
||||
) -> None:
|
||||
self._orders = {order.order_uuid: order for order in orders or []}
|
||||
self._mark_cdek_errors = mark_cdek_errors or []
|
||||
self._mark_provider_errors = mark_provider_errors or []
|
||||
self.session_value = object()
|
||||
self.calls: list[tuple[str, tuple[object, ...]]] = []
|
||||
|
||||
@@ -113,24 +112,24 @@ class StubOrderRepository:
|
||||
order.tbank_payment_id = payment_id
|
||||
return order
|
||||
|
||||
async def mark_cdek_order_registered(
|
||||
async def mark_provider_order_registered(
|
||||
self,
|
||||
session: object,
|
||||
order_uuid: str,
|
||||
cdek_order_uuid: str,
|
||||
provider_order_id: str,
|
||||
) -> StoredOrder | None:
|
||||
self.calls.append(
|
||||
("mark_cdek_order_registered", (session, order_uuid, cdek_order_uuid))
|
||||
("mark_provider_order_registered", (session, order_uuid, provider_order_id))
|
||||
)
|
||||
if self._mark_cdek_errors:
|
||||
error = self._mark_cdek_errors.pop(0)
|
||||
if self._mark_provider_errors:
|
||||
error = self._mark_provider_errors.pop(0)
|
||||
if error is not None:
|
||||
raise error
|
||||
|
||||
order = self._orders.get(order_uuid)
|
||||
if order is None:
|
||||
return None
|
||||
order.cdek_order_uuid = cdek_order_uuid
|
||||
order.provider_order_id = provider_order_id
|
||||
return order
|
||||
|
||||
async def record_payment_email_sent(
|
||||
@@ -230,15 +229,15 @@ def test_confirmed_notification_registers_cdek_order_and_saves_uuid() -> None:
|
||||
assert payment_adapter.notifications == [notification]
|
||||
assert order.payment_status == "CONFIRMED"
|
||||
assert order.tbank_payment_id == 8347568144
|
||||
assert order.cdek_order_uuid == "cdek-order-uuid-1"
|
||||
assert order.cdek_waybill_uuid is None
|
||||
assert order.cdek_waybill_url is None
|
||||
assert order.provider_order_id == "cdek-order-uuid-1"
|
||||
assert order.provider_waybill_id is None
|
||||
assert order.provider_waybill_url is None
|
||||
assert len(cdek_adapter.calls) == 1
|
||||
assert cdek_adapter.calls[0][1] == "order-uuid-1"
|
||||
|
||||
|
||||
def test_duplicate_confirmed_notification_does_not_call_cdek() -> None:
|
||||
order = StoredOrder(cdek_order_uuid="existing-cdek-order-uuid")
|
||||
order = StoredOrder(provider_order_id="existing-cdek-order-uuid")
|
||||
cdek_adapter = StubCDEKOrderAdapter()
|
||||
service = AggregatorService(
|
||||
providers=[],
|
||||
@@ -253,7 +252,7 @@ def test_duplicate_confirmed_notification_does_not_call_cdek() -> None:
|
||||
|
||||
assert result == "OK"
|
||||
assert cdek_adapter.calls == []
|
||||
assert order.cdek_order_uuid == "existing-cdek-order-uuid"
|
||||
assert order.provider_order_id == "existing-cdek-order-uuid"
|
||||
|
||||
|
||||
def test_non_confirmed_notification_acknowledges_without_cdek() -> None:
|
||||
@@ -330,7 +329,7 @@ def test_repeated_confirmed_after_cdek_uuid_save_failure_uses_same_external_id()
|
||||
order = StoredOrder()
|
||||
order_repository = StubOrderRepository(
|
||||
orders=[order],
|
||||
mark_cdek_errors=[RuntimeError("db down"), None],
|
||||
mark_provider_errors=[RuntimeError("db down"), None],
|
||||
)
|
||||
cdek_adapter = StubCDEKOrderAdapter(
|
||||
responses=[
|
||||
@@ -357,12 +356,12 @@ def test_repeated_confirmed_after_cdek_uuid_save_failure_uses_same_external_id()
|
||||
with pytest.raises(TBankPaymentNotificationProcessingError):
|
||||
asyncio.run(service.handle_tbank_payment_notification(notification))
|
||||
|
||||
assert order.cdek_order_uuid is None
|
||||
assert order.provider_order_id is None
|
||||
|
||||
result = asyncio.run(service.handle_tbank_payment_notification(notification))
|
||||
|
||||
assert result == "OK"
|
||||
assert order.cdek_order_uuid == "same-cdek-order-uuid"
|
||||
assert order.provider_order_id == "same-cdek-order-uuid"
|
||||
assert [order_uuid for _, order_uuid in cdek_adapter.calls] == [
|
||||
"order-uuid-1",
|
||||
"order-uuid-1",
|
||||
@@ -417,7 +416,7 @@ def test_duplicate_notification_does_not_resend_payment_email() -> None:
|
||||
from datetime import datetime, timezone
|
||||
|
||||
order = StoredOrder(
|
||||
cdek_order_uuid="existing-cdek-order-uuid",
|
||||
provider_order_id="existing-cdek-order-uuid",
|
||||
payment_email_sent_at=datetime(2026, 1, 1, tzinfo=timezone.utc),
|
||||
)
|
||||
email_sender = StubEmailSender()
|
||||
@@ -454,4 +453,4 @@ def test_email_failure_does_not_break_notification_handling() -> None:
|
||||
|
||||
assert result == "OK"
|
||||
assert len(email_sender.calls) == 1
|
||||
assert order.cdek_order_uuid == "cdek-order-uuid-1"
|
||||
assert order.provider_order_id == "cdek-order-uuid-1"
|
||||
|
||||
Reference in New Issue
Block a user