fix cdek client
This commit is contained in:
@@ -8,6 +8,7 @@ from app.adapters.delivery_providers.cdek.client import (
|
||||
CDEKClient,
|
||||
CDEKClientError,
|
||||
CDEKProvider,
|
||||
CDEKRequestError,
|
||||
)
|
||||
from app.config import AdapterConfig, Settings
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest
|
||||
@@ -254,7 +255,7 @@ def test_cdek_client_raises_when_city_code_not_found() -> None:
|
||||
retry_attempts=0,
|
||||
)
|
||||
|
||||
with pytest.raises(CDEKClientError, match="no matches"):
|
||||
with pytest.raises(CDEKRequestError, match="no matches"):
|
||||
asyncio.run(client.get_raw_price(request))
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,10 @@ from app.controllers.v1.delivery import get_aggregator_service
|
||||
from app.main import create_app
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest
|
||||
from app.schemas.response import DeliveryPrice
|
||||
from app.services.aggregator import AggregatorServiceError
|
||||
from app.services.aggregator import (
|
||||
AggregatorServiceError,
|
||||
InvalidDeliveryRequestError,
|
||||
)
|
||||
|
||||
|
||||
class StubAggregatorService:
|
||||
@@ -229,6 +232,33 @@ def test_post_delivery_price_maps_service_exception_to_503() -> None:
|
||||
}
|
||||
|
||||
|
||||
def test_post_delivery_price_maps_invalid_request_to_400() -> None:
|
||||
service = StubAggregatorService(
|
||||
response=[],
|
||||
error=InvalidDeliveryRequestError("city not found"),
|
||||
)
|
||||
app = create_app()
|
||||
_install_service_override(app, service)
|
||||
|
||||
async def run_request() -> httpx.Response:
|
||||
transport = httpx.ASGITransport(app=app, raise_app_exceptions=False)
|
||||
async with httpx.AsyncClient(
|
||||
transport=transport,
|
||||
base_url="http://testserver",
|
||||
) as client:
|
||||
return await client.post("/api/v1/delivery/price", json=_valid_payload())
|
||||
|
||||
response = asyncio.run(run_request())
|
||||
|
||||
assert response.status_code == 400
|
||||
assert response.json() == {
|
||||
"detail": {
|
||||
"code": "invalid_delivery_request",
|
||||
"message": "Delivery request contains unknown or unsupported location.",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def test_delivery_price_endpoint_accepts_only_post_method() -> None:
|
||||
service = StubAggregatorService(response=[])
|
||||
app = create_app()
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
import asyncio
|
||||
from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
|
||||
from app.adapters.delivery_providers.base import ProviderRequestError
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest
|
||||
from app.schemas.response import DeliveryPrice
|
||||
from app.services.aggregator import AggregatorService
|
||||
from app.services.aggregator import AggregatorService, InvalidDeliveryRequestError
|
||||
|
||||
|
||||
_MISSING = object()
|
||||
@@ -117,6 +120,19 @@ def test_get_all_prices_all_failures_returns_empty_list() -> None:
|
||||
assert len(provider_b.calls) == 1
|
||||
|
||||
|
||||
def test_get_all_prices_raises_invalid_request_for_provider_request_errors() -> None:
|
||||
provider = StubProvider(
|
||||
name="cdek",
|
||||
error=ProviderRequestError("city not found"),
|
||||
)
|
||||
service = AggregatorService([provider], cache=StubCache())
|
||||
|
||||
with pytest.raises(InvalidDeliveryRequestError):
|
||||
asyncio.run(service.get_all_prices(_make_request()))
|
||||
|
||||
assert len(provider.calls) == 1
|
||||
|
||||
|
||||
def test_get_all_prices_cache_hit_skips_provider_call() -> None:
|
||||
cached_payload = _make_price("cdek", "99.00").model_dump(mode="json")
|
||||
cache = StubCache(forced_get_value=cached_payload)
|
||||
@@ -152,4 +168,3 @@ def test_get_all_prices_delegates_filtering_and_sorting_to_domain_logic() -> Non
|
||||
|
||||
assert [price.provider for price in delegated_inputs[0]] == ["a", "b"]
|
||||
assert [price.provider for price in result] == ["a"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user