Добавлена валидация цены

This commit is contained in:
Раис Юсупалиев
2026-05-13 16:35:22 +03:00
parent 6b66af5eb3
commit 39cd5ddc7a
24 changed files with 1021 additions and 56 deletions
@@ -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)
+35
View File
@@ -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="Документ"),