Рефактор
Deploy / deploy (push) Failing after 59s

This commit is contained in:
Раис Юсупалиев
2026-06-26 19:29:11 +03:00
parent c6c37640fd
commit 5e750ca71c
37 changed files with 803 additions and 462 deletions
+11 -8
View File
@@ -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"
+85 -79
View File
@@ -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))