+11
-8
@@ -186,14 +186,17 @@ repository:
|
||||
redis_dsn: "redis://redis.internal:6380/5"
|
||||
price_cache_ttl_seconds: 123
|
||||
|
||||
adapter:
|
||||
cdek_base_url: "https://api.cdek.ru/v2"
|
||||
cdek_client_id: "test-client-id"
|
||||
cdek_client_secret: "test-client-secret"
|
||||
cdek_retry_attempts: 2
|
||||
cdek_retry_backoff_seconds: 0.2
|
||||
cdek_timeout_seconds: 10.0
|
||||
cdek_cache_ttl_seconds: 900
|
||||
delivery_providers:
|
||||
cdek:
|
||||
base_url: "https://api.cdek.ru/v2"
|
||||
client_id: "test-client-id"
|
||||
client_secret: "test-client-secret"
|
||||
retry_attempts: 2
|
||||
retry_backoff_seconds: 0.2
|
||||
timeout_seconds: 10.0
|
||||
cache_ttl_seconds: 900
|
||||
cse:
|
||||
enabled: false
|
||||
|
||||
tbank_payment:
|
||||
init_url: "https://securepay.tinkoff.ru/v2/Init"
|
||||
|
||||
@@ -69,9 +69,9 @@ def test_create_order_persists_all_required_fields() -> None:
|
||||
assert persisted_order.payload == order_data.payload
|
||||
assert persisted_order.payment_status is None
|
||||
assert persisted_order.tbank_payment_id is None
|
||||
assert persisted_order.cdek_order_uuid is None
|
||||
assert persisted_order.cdek_waybill_uuid is None
|
||||
assert persisted_order.cdek_waybill_url is None
|
||||
assert persisted_order.provider_order_id is None
|
||||
assert persisted_order.provider_waybill_id is None
|
||||
assert persisted_order.provider_waybill_url is None
|
||||
assert persisted_order.created_at is not None
|
||||
assert persisted_order.updated_at is not None
|
||||
|
||||
@@ -175,7 +175,7 @@ def test_mark_payment_status_returns_none_for_missing_order() -> None:
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
|
||||
def test_mark_cdek_order_registered_persists_cdek_order_uuid_only() -> None:
|
||||
def test_mark_provider_order_registered_persists_provider_order_id_only() -> None:
|
||||
async def run(
|
||||
repository: OrderRepository,
|
||||
session_factory: async_sessionmaker[AsyncSession],
|
||||
@@ -184,7 +184,7 @@ def test_mark_cdek_order_registered_persists_cdek_order_uuid_only() -> None:
|
||||
await repository.create_order(session, _make_order_data())
|
||||
|
||||
async with repository.session() as session:
|
||||
order = await repository.mark_cdek_order_registered(
|
||||
order = await repository.mark_provider_order_registered(
|
||||
session,
|
||||
"order-uuid-1",
|
||||
"cdek-order-uuid-1",
|
||||
@@ -197,14 +197,14 @@ def test_mark_cdek_order_registered_persists_cdek_order_uuid_only() -> None:
|
||||
persisted_order = result.scalar_one()
|
||||
|
||||
assert order is not None
|
||||
assert persisted_order.cdek_order_uuid == "cdek-order-uuid-1"
|
||||
assert persisted_order.cdek_waybill_uuid is None
|
||||
assert persisted_order.cdek_waybill_url is None
|
||||
assert persisted_order.provider_order_id == "cdek-order-uuid-1"
|
||||
assert persisted_order.provider_waybill_id is None
|
||||
assert persisted_order.provider_waybill_url is None
|
||||
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
|
||||
def test_mark_cdek_order_registered_is_idempotent_for_same_uuid() -> None:
|
||||
def test_mark_provider_order_registered_is_idempotent_for_same_uuid() -> None:
|
||||
async def run(
|
||||
repository: OrderRepository,
|
||||
session_factory: async_sessionmaker[AsyncSession],
|
||||
@@ -213,14 +213,14 @@ def test_mark_cdek_order_registered_is_idempotent_for_same_uuid() -> None:
|
||||
await repository.create_order(session, _make_order_data())
|
||||
|
||||
async with repository.session() as session:
|
||||
await repository.mark_cdek_order_registered(
|
||||
await repository.mark_provider_order_registered(
|
||||
session,
|
||||
"order-uuid-1",
|
||||
"cdek-order-uuid-1",
|
||||
)
|
||||
|
||||
async with repository.session() as session:
|
||||
await repository.mark_cdek_order_registered(
|
||||
await repository.mark_provider_order_registered(
|
||||
session,
|
||||
"order-uuid-1",
|
||||
"cdek-order-uuid-1",
|
||||
@@ -231,18 +231,18 @@ def test_mark_cdek_order_registered_is_idempotent_for_same_uuid() -> None:
|
||||
orders = result.scalars().all()
|
||||
|
||||
assert len(orders) == 1
|
||||
assert orders[0].cdek_order_uuid == "cdek-order-uuid-1"
|
||||
assert orders[0].provider_order_id == "cdek-order-uuid-1"
|
||||
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
|
||||
def test_mark_cdek_order_registered_returns_none_for_missing_order() -> None:
|
||||
def test_mark_provider_order_registered_returns_none_for_missing_order() -> None:
|
||||
async def run(
|
||||
repository: OrderRepository,
|
||||
_session_factory: async_sessionmaker[AsyncSession],
|
||||
) -> None:
|
||||
async with repository.session() as session:
|
||||
order = await repository.mark_cdek_order_registered(
|
||||
order = await repository.mark_provider_order_registered(
|
||||
session,
|
||||
"missing-order",
|
||||
"cdek-order-uuid-1",
|
||||
@@ -257,37 +257,38 @@ async def _seed_order(
|
||||
repository: OrderRepository,
|
||||
*,
|
||||
order_uuid: str,
|
||||
cdek_order_uuid: str | None,
|
||||
cdek_order_status: str | None = None,
|
||||
cdek_waybill_uuid: str | None = None,
|
||||
cdek_waybill_url: str | None = None,
|
||||
cdek_polled_at: datetime | None = None,
|
||||
provider_order_id: str | None,
|
||||
provider: str = "cdek",
|
||||
provider_order_status: str | None = None,
|
||||
provider_waybill_id: str | None = None,
|
||||
provider_waybill_url: str | None = None,
|
||||
provider_polled_at: datetime | None = None,
|
||||
) -> None:
|
||||
async with repository.session() as session:
|
||||
await repository.create_order(
|
||||
session, _make_order_data(order_uuid=order_uuid)
|
||||
session, _make_order_data(order_uuid=order_uuid, provider=provider)
|
||||
)
|
||||
if cdek_order_uuid is not None:
|
||||
await repository.mark_cdek_order_registered(
|
||||
session, order_uuid, cdek_order_uuid
|
||||
if provider_order_id is not None:
|
||||
await repository.mark_provider_order_registered(
|
||||
session, order_uuid, provider_order_id
|
||||
)
|
||||
if (
|
||||
cdek_order_status is not None
|
||||
or cdek_waybill_uuid is not None
|
||||
or cdek_polled_at is not None
|
||||
provider_order_status is not None
|
||||
or provider_waybill_id is not None
|
||||
or provider_polled_at is not None
|
||||
):
|
||||
order = await repository.get_order_by_order_uuid(session, order_uuid)
|
||||
assert order is not None
|
||||
if cdek_order_status is not None:
|
||||
order.cdek_order_status = cdek_order_status
|
||||
if cdek_waybill_uuid is not None:
|
||||
order.cdek_waybill_uuid = cdek_waybill_uuid
|
||||
if cdek_polled_at is not None:
|
||||
order.cdek_polled_at = cdek_polled_at
|
||||
if cdek_waybill_url is not None:
|
||||
if provider_order_status is not None:
|
||||
order.provider_order_status = provider_order_status
|
||||
if provider_waybill_id is not None:
|
||||
order.provider_waybill_id = provider_waybill_id
|
||||
if provider_polled_at is not None:
|
||||
order.provider_polled_at = provider_polled_at
|
||||
if provider_waybill_url is not None:
|
||||
order = await repository.get_order_by_order_uuid(session, order_uuid)
|
||||
assert order is not None
|
||||
order.cdek_waybill_url = cdek_waybill_url
|
||||
order.provider_waybill_url = provider_waybill_url
|
||||
|
||||
|
||||
def test_list_orders_pending_waybill_returns_orders_without_url() -> None:
|
||||
@@ -295,21 +296,26 @@ def test_list_orders_pending_waybill_returns_orders_without_url() -> None:
|
||||
repository: OrderRepository,
|
||||
_session_factory: async_sessionmaker[AsyncSession],
|
||||
) -> None:
|
||||
await _seed_order(repository, order_uuid="pending", cdek_order_uuid="o1")
|
||||
await _seed_order(repository, order_uuid="pending", provider_order_id="o1")
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="done",
|
||||
cdek_order_uuid="o2",
|
||||
cdek_waybill_uuid="w2",
|
||||
cdek_waybill_url="https://cdek.test/2.pdf",
|
||||
provider_order_id="o2",
|
||||
provider_waybill_id="w2",
|
||||
provider_waybill_url="https://cdek.test/2.pdf",
|
||||
)
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="invalid",
|
||||
cdek_order_uuid="o3",
|
||||
cdek_order_status="INVALID",
|
||||
provider_order_id="o3",
|
||||
provider_order_status="INVALID",
|
||||
)
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="not-cdek",
|
||||
provider="cse",
|
||||
provider_order_id="cse-1",
|
||||
)
|
||||
await _seed_order(repository, order_uuid="no-cdek", cdek_order_uuid=None)
|
||||
|
||||
async with repository.session() as session:
|
||||
orders = await repository.list_orders_pending_waybill(session, limit=10)
|
||||
@@ -330,16 +336,16 @@ def test_list_orders_pending_waybill_orders_polled_at_nulls_first() -> None:
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="late",
|
||||
cdek_order_uuid="o-late",
|
||||
cdek_polled_at=later,
|
||||
provider_order_id="o-late",
|
||||
provider_polled_at=later,
|
||||
)
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="early",
|
||||
cdek_order_uuid="o-early",
|
||||
cdek_polled_at=earlier,
|
||||
provider_order_id="o-early",
|
||||
provider_polled_at=earlier,
|
||||
)
|
||||
await _seed_order(repository, order_uuid="never", cdek_order_uuid="o-never")
|
||||
await _seed_order(repository, order_uuid="never", provider_order_id="o-never")
|
||||
|
||||
async with repository.session() as session:
|
||||
orders = await repository.list_orders_pending_waybill(session, limit=10)
|
||||
@@ -356,7 +362,7 @@ def test_record_order_poll_sets_status_and_waybill_uuid() -> None:
|
||||
repository: OrderRepository,
|
||||
_session_factory: async_sessionmaker[AsyncSession],
|
||||
) -> None:
|
||||
await _seed_order(repository, order_uuid="o", cdek_order_uuid="cdek-o")
|
||||
await _seed_order(repository, order_uuid="o", provider_order_id="cdek-o")
|
||||
|
||||
async with repository.session() as session:
|
||||
order = await repository.record_order_poll(
|
||||
@@ -368,9 +374,9 @@ def test_record_order_poll_sets_status_and_waybill_uuid() -> None:
|
||||
)
|
||||
|
||||
assert order is not None
|
||||
assert order.cdek_order_status == "ACCEPTED"
|
||||
assert order.cdek_waybill_uuid == "waybill-1"
|
||||
assert order.cdek_polled_at == polled
|
||||
assert order.provider_order_status == "ACCEPTED"
|
||||
assert order.provider_waybill_id == "waybill-1"
|
||||
assert order.provider_polled_at == polled
|
||||
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
@@ -385,8 +391,8 @@ def test_record_order_poll_does_not_overwrite_existing_waybill_uuid() -> None:
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="o",
|
||||
cdek_order_uuid="cdek-o",
|
||||
cdek_waybill_uuid="existing-waybill",
|
||||
provider_order_id="cdek-o",
|
||||
provider_waybill_id="existing-waybill",
|
||||
)
|
||||
|
||||
async with repository.session() as session:
|
||||
@@ -399,7 +405,7 @@ def test_record_order_poll_does_not_overwrite_existing_waybill_uuid() -> None:
|
||||
)
|
||||
|
||||
assert order is not None
|
||||
assert order.cdek_waybill_uuid == "existing-waybill"
|
||||
assert order.provider_waybill_id == "existing-waybill"
|
||||
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
@@ -414,8 +420,8 @@ def test_record_waybill_poll_sets_url_only_when_previously_null() -> None:
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="o",
|
||||
cdek_order_uuid="cdek-o",
|
||||
cdek_waybill_uuid="waybill-1",
|
||||
provider_order_id="cdek-o",
|
||||
provider_waybill_id="waybill-1",
|
||||
)
|
||||
|
||||
async with repository.session() as session:
|
||||
@@ -427,8 +433,8 @@ def test_record_waybill_poll_sets_url_only_when_previously_null() -> None:
|
||||
)
|
||||
|
||||
assert order is not None
|
||||
assert order.cdek_waybill_url == "https://cdek.test/1.pdf"
|
||||
assert order.cdek_polled_at == polled
|
||||
assert order.provider_waybill_url == "https://cdek.test/1.pdf"
|
||||
assert order.provider_polled_at == polled
|
||||
|
||||
async with repository.session() as session:
|
||||
order = await repository.record_waybill_poll(
|
||||
@@ -438,7 +444,7 @@ def test_record_waybill_poll_sets_url_only_when_previously_null() -> None:
|
||||
polled_at=polled,
|
||||
)
|
||||
assert order is not None
|
||||
assert order.cdek_waybill_url == "https://cdek.test/1.pdf"
|
||||
assert order.provider_waybill_url == "https://cdek.test/1.pdf"
|
||||
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
@@ -451,22 +457,22 @@ def test_list_orders_pending_waybill_email_returns_orders_with_url_and_no_sent_a
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="ready",
|
||||
cdek_order_uuid="o1",
|
||||
cdek_waybill_uuid="w1",
|
||||
cdek_waybill_url="https://cdek.test/1.pdf",
|
||||
provider_order_id="o1",
|
||||
provider_waybill_id="w1",
|
||||
provider_waybill_url="https://cdek.test/1.pdf",
|
||||
)
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="no-url",
|
||||
cdek_order_uuid="o2",
|
||||
cdek_waybill_uuid="w2",
|
||||
provider_order_id="o2",
|
||||
provider_waybill_id="w2",
|
||||
)
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="already-sent",
|
||||
cdek_order_uuid="o3",
|
||||
cdek_waybill_uuid="w3",
|
||||
cdek_waybill_url="https://cdek.test/3.pdf",
|
||||
provider_order_id="o3",
|
||||
provider_waybill_id="w3",
|
||||
provider_waybill_url="https://cdek.test/3.pdf",
|
||||
)
|
||||
async with repository.session() as session:
|
||||
sent = await repository.get_order_by_order_uuid(session, "already-sent")
|
||||
@@ -493,16 +499,16 @@ def test_list_orders_pending_waybill_email_orders_by_created_at_asc() -> None:
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="first",
|
||||
cdek_order_uuid="o1",
|
||||
cdek_waybill_uuid="w1",
|
||||
cdek_waybill_url="https://cdek.test/1.pdf",
|
||||
provider_order_id="o1",
|
||||
provider_waybill_id="w1",
|
||||
provider_waybill_url="https://cdek.test/1.pdf",
|
||||
)
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="second",
|
||||
cdek_order_uuid="o2",
|
||||
cdek_waybill_uuid="w2",
|
||||
cdek_waybill_url="https://cdek.test/2.pdf",
|
||||
provider_order_id="o2",
|
||||
provider_waybill_id="w2",
|
||||
provider_waybill_url="https://cdek.test/2.pdf",
|
||||
)
|
||||
|
||||
async with repository.session() as session:
|
||||
@@ -526,9 +532,9 @@ def test_record_waybill_email_sent_sets_timestamp_once() -> None:
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="o",
|
||||
cdek_order_uuid="cdek-o",
|
||||
cdek_waybill_uuid="w",
|
||||
cdek_waybill_url="https://cdek.test/1.pdf",
|
||||
provider_order_id="cdek-o",
|
||||
provider_waybill_id="w",
|
||||
provider_waybill_url="https://cdek.test/1.pdf",
|
||||
)
|
||||
|
||||
async with repository.session() as session:
|
||||
@@ -580,8 +586,8 @@ def test_record_waybill_poll_updates_polled_at_when_url_is_none() -> None:
|
||||
await _seed_order(
|
||||
repository,
|
||||
order_uuid="o",
|
||||
cdek_order_uuid="cdek-o",
|
||||
cdek_waybill_uuid="waybill-1",
|
||||
provider_order_id="cdek-o",
|
||||
provider_waybill_id="waybill-1",
|
||||
)
|
||||
|
||||
async with repository.session() as session:
|
||||
@@ -593,7 +599,7 @@ def test_record_waybill_poll_updates_polled_at_when_url_is_none() -> None:
|
||||
)
|
||||
|
||||
assert order is not None
|
||||
assert order.cdek_waybill_url is None
|
||||
assert order.cdek_polled_at == polled
|
||||
assert order.provider_waybill_url is None
|
||||
assert order.provider_polled_at == polled
|
||||
|
||||
asyncio.run(_with_repository(run))
|
||||
|
||||
Reference in New Issue
Block a user