Добавлена валидация цены
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from app.domain.price import (
|
||||
calculate_expected_payment_amount_kopecks,
|
||||
is_init_payment_price_valid,
|
||||
)
|
||||
from app.schemas.response import DeliveryPrice
|
||||
|
||||
|
||||
def _make_price(**overrides: object) -> DeliveryPrice:
|
||||
payload = {
|
||||
"provider": "cdek",
|
||||
"service_name": "CDEK tariff",
|
||||
"price": Decimal("1250.00"),
|
||||
"currency": "RUB",
|
||||
"delivery_days_min": 1,
|
||||
"delivery_days_max": 2,
|
||||
}
|
||||
payload.update(overrides)
|
||||
return DeliveryPrice.model_construct(**payload)
|
||||
|
||||
|
||||
def test_init_payment_price_validation_accepts_exact_match() -> None:
|
||||
provider_price = _make_price(price=Decimal("1250.00"))
|
||||
|
||||
assert is_init_payment_price_valid(125000, provider_price)
|
||||
assert calculate_expected_payment_amount_kopecks(provider_price) == 125000
|
||||
|
||||
|
||||
def test_init_payment_price_validation_rejects_mismatch() -> None:
|
||||
provider_price = _make_price(price=Decimal("1250.00"))
|
||||
|
||||
assert not is_init_payment_price_valid(124999, provider_price)
|
||||
|
||||
|
||||
def test_init_payment_price_validation_applies_multiplier_and_rounds_half_up() -> None:
|
||||
provider_price = _make_price(price=Decimal("100.50"))
|
||||
|
||||
expected_amount = calculate_expected_payment_amount_kopecks(
|
||||
provider_price,
|
||||
price_multiplier=Decimal("1.1"),
|
||||
)
|
||||
|
||||
assert expected_amount == 11100
|
||||
assert is_init_payment_price_valid(
|
||||
11100,
|
||||
provider_price,
|
||||
price_multiplier=Decimal("1.1"),
|
||||
)
|
||||
|
||||
|
||||
def test_init_payment_price_validation_converts_rub_to_kopecks() -> None:
|
||||
provider_price = _make_price(price=Decimal("899.00"))
|
||||
|
||||
assert calculate_expected_payment_amount_kopecks(provider_price) == 89900
|
||||
|
||||
|
||||
def test_init_payment_price_validation_rejects_non_rub_currency() -> None:
|
||||
provider_price = _make_price(price=Decimal("899.00"), currency="USD")
|
||||
|
||||
assert calculate_expected_payment_amount_kopecks(provider_price) is None
|
||||
assert not is_init_payment_price_valid(89900, provider_price)
|
||||
@@ -106,6 +106,41 @@ def test_filter_prices_by_parcel_type_returns_non_document_tariffs_for_parcel()
|
||||
assert [price.service_name for price in result] == ["Economy parcel", "Express"]
|
||||
|
||||
|
||||
def test_filter_prices_by_parcel_type_keeps_prices_with_bypass_flag_regardless_of_type() -> None:
|
||||
bypass_document = _make_price(
|
||||
provider="cdek",
|
||||
service_name="Документ курьером",
|
||||
bypass_parcel_type_filter=True,
|
||||
)
|
||||
bypass_parcel = _make_price(
|
||||
provider="cdek",
|
||||
service_name="Посылка склад-склад",
|
||||
bypass_parcel_type_filter=True,
|
||||
)
|
||||
other_document = _make_price(provider="other", service_name="Document")
|
||||
other_parcel = _make_price(provider="other", service_name="Parcel")
|
||||
|
||||
doc_result = filter_prices_by_parcel_type(
|
||||
[bypass_document, bypass_parcel, other_document, other_parcel],
|
||||
parcel_type=ParcelType.DOC,
|
||||
)
|
||||
parcel_result = filter_prices_by_parcel_type(
|
||||
[bypass_document, bypass_parcel, other_document, other_parcel],
|
||||
parcel_type=ParcelType.PARCEL,
|
||||
)
|
||||
|
||||
assert [price.service_name for price in doc_result] == [
|
||||
"Документ курьером",
|
||||
"Посылка склад-склад",
|
||||
"Document",
|
||||
]
|
||||
assert [price.service_name for price in parcel_result] == [
|
||||
"Документ курьером",
|
||||
"Посылка склад-склад",
|
||||
"Parcel",
|
||||
]
|
||||
|
||||
|
||||
def test_filter_prices_by_parcel_type_returns_all_prices_when_type_is_missing() -> None:
|
||||
prices = [
|
||||
_make_price(service_name="Документ"),
|
||||
|
||||
Reference in New Issue
Block a user