020 update city code resolving
This commit is contained in:
@@ -4,7 +4,12 @@ from decimal import Decimal
|
||||
import pytest
|
||||
|
||||
from app.adapters.delivery_providers.base import ProviderRequestError
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest, ParcelType
|
||||
from app.domain.price import normalize_delivery_request
|
||||
from app.schemas.request import (
|
||||
DeliveryCalculationRequest,
|
||||
DeliveryEntity,
|
||||
ParcelType,
|
||||
)
|
||||
from app.schemas.response import DeliveryPrice
|
||||
from app.services.aggregator import AggregatorService, InvalidDeliveryRequestError
|
||||
|
||||
@@ -25,9 +30,11 @@ class StubProvider:
|
||||
self._response = response
|
||||
self._error = error
|
||||
self.cache_ttl_seconds = cache_ttl_seconds
|
||||
self.calls: list[DeliveryRequest] = []
|
||||
self.calls: list[DeliveryCalculationRequest] = []
|
||||
|
||||
async def get_prices(self, request: DeliveryRequest) -> list[DeliveryPrice]:
|
||||
async def get_prices(
|
||||
self, request: DeliveryCalculationRequest
|
||||
) -> list[DeliveryPrice]:
|
||||
self.calls.append(request)
|
||||
if self._error is not None:
|
||||
raise self._error
|
||||
@@ -58,12 +65,11 @@ class StubCache:
|
||||
self._storage[key] = value
|
||||
|
||||
|
||||
def _make_request(**overrides: object) -> DeliveryRequest:
|
||||
def _make_request(**overrides: object) -> DeliveryCalculationRequest:
|
||||
payload: dict[str, object] = {
|
||||
"entity": DeliveryEntity.INDIVIDUAL,
|
||||
"from_city": "Moscow",
|
||||
"to_city": "Kazan",
|
||||
"country_code": None,
|
||||
"from_city": 1,
|
||||
"to_city": 2,
|
||||
"weight_kg": 1.234,
|
||||
"length_cm": 30.0,
|
||||
"width_cm": 20.0,
|
||||
@@ -71,7 +77,7 @@ def _make_request(**overrides: object) -> DeliveryRequest:
|
||||
"parcel_type": None,
|
||||
}
|
||||
payload.update(overrides)
|
||||
return DeliveryRequest(**payload)
|
||||
return DeliveryCalculationRequest(**payload)
|
||||
|
||||
|
||||
def _make_price(provider: str, price: str, *, service_name: str = "standard") -> DeliveryPrice:
|
||||
@@ -118,15 +124,23 @@ def test_get_all_prices_full_success_returns_sorted_and_updates_cache() -> None:
|
||||
assert [ttl for _, _, ttl in cache.set_calls] == [111, 222]
|
||||
|
||||
|
||||
def test_get_all_prices_normalizes_and_forwards_country_code_to_providers() -> None:
|
||||
def test_get_all_prices_forwards_city_identifiers_and_uses_updated_cache_key() -> None:
|
||||
provider = StubProvider(name="cdek", response=[_make_price("cdek", "150.00")])
|
||||
service = AggregatorService([provider], cache=StubCache())
|
||||
cache = StubCache()
|
||||
service = AggregatorService([provider], cache=cache)
|
||||
request = _make_request()
|
||||
|
||||
result = asyncio.run(service.get_all_prices(_make_request(country_code=" kz ")))
|
||||
result = asyncio.run(service.get_all_prices(request))
|
||||
|
||||
assert [price.provider for price in result] == ["cdek"]
|
||||
assert len(provider.calls) == 1
|
||||
assert provider.calls[0].country_code == "KZ"
|
||||
assert provider.calls[0].from_city == 1
|
||||
assert provider.calls[0].to_city == 2
|
||||
expected_key = AggregatorService._build_cache_key(
|
||||
provider_name=provider.name,
|
||||
request=normalize_delivery_request(request),
|
||||
)
|
||||
assert cache.get_calls == [expected_key]
|
||||
|
||||
|
||||
def test_get_all_prices_partial_failure_excludes_failed_provider() -> None:
|
||||
|
||||
Reference in New Issue
Block a user