018 add parcel type

This commit is contained in:
Раис Юсупалиев
2026-03-16 01:14:46 +03:00
parent 54160a0e38
commit c4175121a0
10 changed files with 346 additions and 11 deletions
+59 -1
View File
@@ -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"]