018 add parcel type
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from app.domain.price import (
|
||||
filter_prices_by_parcel_type,
|
||||
filter_and_sort_prices,
|
||||
filter_valid_prices,
|
||||
normalize_delivery_request,
|
||||
sort_prices_by_price,
|
||||
)
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest
|
||||
from app.schemas.request import DeliveryEntity, DeliveryRequest, ParcelType
|
||||
from app.schemas.response import DeliveryPrice
|
||||
|
||||
|
||||
@@ -80,6 +81,46 @@ def test_filter_valid_prices_handles_empty_input() -> None:
|
||||
assert filter_and_sort_prices([]) == []
|
||||
|
||||
|
||||
def test_filter_prices_by_parcel_type_matches_document_markers_case_insensitively() -> None:
|
||||
document_ru = _make_price(service_name="Срочный Документ")
|
||||
document_en = _make_price(service_name="DOCUMENT EXPRESS")
|
||||
parcel = _make_price(service_name="Parcel locker")
|
||||
|
||||
result = filter_prices_by_parcel_type(
|
||||
[document_ru, parcel, document_en],
|
||||
parcel_type=ParcelType.DOC,
|
||||
)
|
||||
|
||||
assert [price.service_name for price in result] == [
|
||||
"Срочный Документ",
|
||||
"DOCUMENT EXPRESS",
|
||||
]
|
||||
|
||||
|
||||
def test_filter_prices_by_parcel_type_returns_non_document_tariffs_for_parcel() -> None:
|
||||
document = _make_price(service_name="document delivery")
|
||||
parcel = _make_price(service_name="Economy parcel")
|
||||
standard = _make_price(service_name="Express")
|
||||
|
||||
result = filter_prices_by_parcel_type(
|
||||
[document, parcel, standard],
|
||||
parcel_type=ParcelType.PARCEL,
|
||||
)
|
||||
|
||||
assert [price.service_name for price in result] == ["Economy parcel", "Express"]
|
||||
|
||||
|
||||
def test_filter_prices_by_parcel_type_returns_all_prices_when_type_is_missing() -> None:
|
||||
prices = [
|
||||
_make_price(service_name="Документ"),
|
||||
_make_price(service_name="Parcel"),
|
||||
]
|
||||
|
||||
result = filter_prices_by_parcel_type(prices, parcel_type=None)
|
||||
|
||||
assert result == prices
|
||||
|
||||
|
||||
def test_filter_valid_prices_applies_multiplier_and_rounds_half_up() -> None:
|
||||
low = _make_price(provider="cdek", price=Decimal("100.40"))
|
||||
high = _make_price(provider="boxberry", price=Decimal("100.50"))
|
||||
@@ -173,3 +214,20 @@ def test_filter_and_sort_prices_combines_domain_steps() -> None:
|
||||
|
||||
assert [price.provider for price in result] == ["b", "a"]
|
||||
assert [price.price for price in result] == [Decimal("130"), Decimal("286")]
|
||||
|
||||
|
||||
def test_filter_and_sort_prices_applies_parcel_type_filter_before_sorting() -> None:
|
||||
document = _make_price(provider="a", price=Decimal("220.00"), service_name="Document")
|
||||
parcel = _make_price(provider="b", price=Decimal("100.00"), service_name="Parcel")
|
||||
document_ru = _make_price(
|
||||
provider="c",
|
||||
price=Decimal("150.00"),
|
||||
service_name="Документ курьером",
|
||||
)
|
||||
|
||||
result = filter_and_sort_prices(
|
||||
[document, parcel, document_ru],
|
||||
parcel_type=ParcelType.DOC,
|
||||
)
|
||||
|
||||
assert [price.provider for price in result] == ["c", "a"]
|
||||
|
||||
Reference in New Issue
Block a user