018 add parcel type
This commit is contained in:
@@ -4,7 +4,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
|
||||
from app.adapters.delivery_providers.base import ProviderRequestError
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest, ParcelType
|
||||
from app.schemas.response import DeliveryPrice
|
||||
from app.services.aggregator import AggregatorService, InvalidDeliveryRequestError
|
||||
|
||||
@@ -68,6 +68,7 @@ def _make_request(**overrides: object) -> DeliveryRequest:
|
||||
"length_cm": 30.0,
|
||||
"width_cm": 20.0,
|
||||
"height_cm": 10.0,
|
||||
"parcel_type": None,
|
||||
}
|
||||
payload.update(overrides)
|
||||
return DeliveryRequest(**payload)
|
||||
@@ -195,6 +196,55 @@ def test_get_all_prices_cache_hit_skips_provider_call() -> None:
|
||||
assert cache.set_calls == []
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("cache", "expected_provider_calls"),
|
||||
[
|
||||
(StubCache(), 1),
|
||||
(
|
||||
StubCache(
|
||||
forced_get_value=[
|
||||
_make_price(
|
||||
"cdek",
|
||||
"100.40",
|
||||
service_name="DOCUMENT EXPRESS",
|
||||
).model_dump(mode="json"),
|
||||
_make_price(
|
||||
"cdek",
|
||||
"200.40",
|
||||
service_name="Economy parcel",
|
||||
).model_dump(mode="json"),
|
||||
]
|
||||
),
|
||||
0,
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_get_all_prices_applies_same_parcel_type_filter_for_fresh_and_cached_results(
|
||||
cache: StubCache,
|
||||
expected_provider_calls: int,
|
||||
) -> None:
|
||||
provider = StubProvider(
|
||||
name="cdek",
|
||||
response=[
|
||||
_make_price("cdek", "100.40", service_name="DOCUMENT EXPRESS"),
|
||||
_make_price("cdek", "200.40", service_name="Economy parcel"),
|
||||
],
|
||||
)
|
||||
service = AggregatorService(
|
||||
[provider],
|
||||
cache=cache,
|
||||
provider_price_multiplier=Decimal("1.1"),
|
||||
)
|
||||
|
||||
result = asyncio.run(
|
||||
service.get_all_prices(_make_request(parcel_type=ParcelType.DOC))
|
||||
)
|
||||
|
||||
assert [price.service_name for price in result] == ["DOCUMENT EXPRESS"]
|
||||
assert [price.price for price in result] == [Decimal("110")]
|
||||
assert len(provider.calls) == expected_provider_calls
|
||||
|
||||
|
||||
def test_get_all_prices_delegates_filtering_and_sorting_to_domain_logic() -> None:
|
||||
provider_a = StubProvider(
|
||||
name="a",
|
||||
@@ -206,11 +256,13 @@ def test_get_all_prices_delegates_filtering_and_sorting_to_domain_logic() -> Non
|
||||
provider_b = StubProvider(name="b", response=[_make_price("b", "100.00")])
|
||||
delegated_inputs: list[list[DeliveryPrice]] = []
|
||||
delegated_multipliers: list[Decimal] = []
|
||||
delegated_parcel_types: list[object | None] = []
|
||||
|
||||
def fake_filter_and_sort(prices, *, price_multiplier):
|
||||
def fake_filter_and_sort(prices, *, price_multiplier, parcel_type):
|
||||
price_list = list(prices)
|
||||
delegated_inputs.append(price_list)
|
||||
delegated_multipliers.append(price_multiplier)
|
||||
delegated_parcel_types.append(parcel_type)
|
||||
return [price_list[0]]
|
||||
|
||||
service = AggregatorService(
|
||||
@@ -220,7 +272,7 @@ def test_get_all_prices_delegates_filtering_and_sorting_to_domain_logic() -> Non
|
||||
filter_and_sort_prices_fn=fake_filter_and_sort,
|
||||
)
|
||||
|
||||
result = asyncio.run(service.get_all_prices(_make_request()))
|
||||
result = asyncio.run(service.get_all_prices(_make_request(parcel_type=ParcelType.PARCEL)))
|
||||
|
||||
assert [price.provider for price in delegated_inputs[0]] == ["a", "a", "b"]
|
||||
assert [price.service_name for price in delegated_inputs[0]] == [
|
||||
@@ -229,4 +281,5 @@ def test_get_all_prices_delegates_filtering_and_sorting_to_domain_logic() -> Non
|
||||
"standard",
|
||||
]
|
||||
assert delegated_multipliers == [Decimal("1.23")]
|
||||
assert delegated_parcel_types == [ParcelType.PARCEL]
|
||||
assert [price.provider for price in result] == ["a"]
|
||||
|
||||
Reference in New Issue
Block a user