fix ксе tariffs
Deploy / deploy (push) Successful in 57s

This commit is contained in:
Раис Юсупалиев
2026-06-27 17:34:06 +03:00
parent e4d9b581a6
commit 4262b8a200
8 changed files with 207 additions and 34 deletions
@@ -166,6 +166,43 @@ _CALC_RESPONSE_WITH_ADDITIONAL_SERVICE_FIRST = """<?xml version="1.0" encoding="
</soap:Body>
</soap:Envelope>"""
_CALC_RESPONSE_WITH_BUYOUT_SERVICE_FIRST = """<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<m:CalcResponse xmlns:m="http://www.cargo3.ru">
<m:return>
<m:Key>Calc</m:Key>
<m:List>
<m:Key>Destination</m:Key>
<m:List>
<m:Key>Tariff</m:Key>
<m:Value>buyout-service-guid</m:Value>
<m:Fields><m:Key>Total</m:Key><m:Value>100.00</m:Value></m:Fields>
<m:Fields><m:Key>CurrencyName</m:Key><m:Value>RUR</m:Value></m:Fields>
<m:Fields>
<m:Key>Service</m:Key><m:Value>Частичный выкуп</m:Value>
</m:Fields>
<m:Fields><m:Key>Urgency</m:Key><m:Value>urg-exp</m:Value></m:Fields>
</m:List>
<m:List>
<m:Key>Tariff</m:Key>
<m:Value>delivery-guid</m:Value>
<m:Fields><m:Key>Total</m:Key><m:Value>793.00</m:Value></m:Fields>
<m:Fields><m:Key>CurrencyName</m:Key><m:Value>RUR</m:Value></m:Fields>
<m:Fields><m:Key>Service</m:Key><m:Value>Экспресс</m:Value></m:Fields>
<m:Fields><m:Key>Urgency</m:Key><m:Value>urg-exp</m:Value></m:Fields>
<m:Fields>
<m:Key>AdditionalService</m:Key><m:Value>false</m:Value>
</m:Fields>
<m:Fields><m:Key>MinPeriod</m:Key><m:Value>1</m:Value></m:Fields>
<m:Fields><m:Key>MaxPeriod</m:Key><m:Value>2</m:Value></m:Fields>
</m:List>
</m:List>
</m:return>
</m:CalcResponse>
</soap:Body>
</soap:Envelope>"""
_ERROR_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
@@ -288,19 +325,23 @@ def test_provider_get_prices_maps_all_tariffs() -> None:
[
httpx.Response(200, text=_DELIVERY_TYPES_RESPONSE),
httpx.Response(200, text=_CALC_RESPONSE),
httpx.Response(200, text=_CALC_RESPONSE),
]
)
provider = CSEProvider(client)
provider = CSEProvider(
client,
delivery_service_guids=("tariff-guid-1", "tariff-guid-2"),
)
prices = asyncio.run(provider.get_prices(_calc_request()))
# PVZ-requiring scheme (Склад-Дверь) is excluded: only delivery types + one
# Calc (for door-to-door) are requested.
assert len(http_client.calls) == 2
# Calc per configured CSE delivery service are requested.
assert len(http_client.calls) == 3
assert [price.provider for price in prices] == ["cse", "cse"]
assert [price.tariff_code for price in prices] == [
"ДоставкаДоДверей|urg-std",
"ДоставкаДоДверей|urg-exp",
"ДоставкаДоДверей|tariff-guid-1|urg-std",
"ДоставкаДоДверей|tariff-guid-2|urg-exp",
]
assert prices[0].price == Decimal("1114.92")
assert prices[0].currency == "RUB"
@@ -311,7 +352,7 @@ def test_provider_get_prices_maps_all_tariffs() -> None:
def test_provider_get_payment_price_selects_matching_tariff() -> None:
response = httpx.Response(200, text=_CALC_RESPONSE)
client, _ = _build_client([response])
client, http_client = _build_client([response])
provider = CSEProvider(client)
request = make_init_payment_request(
systemData={
@@ -321,7 +362,7 @@ def test_provider_get_payment_price_selects_matching_tariff() -> None:
"price": 200000,
"deliveryDaysMin": 1,
"deliveryDaysMax": 2,
"tariffCode": "ДоставкаДоДверей|urg-exp",
"tariffCode": "ДоставкаДоДверей|tariff-guid-2|urg-exp",
},
"parcelType": "parcel",
"weight": "1.0",
@@ -332,8 +373,11 @@ def test_provider_get_payment_price_selects_matching_tariff() -> None:
price = asyncio.run(provider.get_payment_price(request))
assert price is not None
assert price.tariff_code == "ДоставкаДоДверей|urg-exp"
assert price.tariff_code == "ДоставкаДоДверей|tariff-guid-2|urg-exp"
assert price.price == Decimal("2000.00")
content = http_client.calls[0]["content"].decode("utf-8")
assert "Service" in content
assert "tariff-guid-2" in content
def test_provider_get_payment_price_ignores_matching_additional_service() -> None:
@@ -348,7 +392,7 @@ def test_provider_get_payment_price_ignores_matching_additional_service() -> Non
"price": 79300,
"deliveryDaysMin": 1,
"deliveryDaysMax": 2,
"tariffCode": "ДоставкаДоДверей|urg-exp",
"tariffCode": "ДоставкаДоДверей|delivery-guid|urg-exp",
},
"parcelType": "parcel",
"weight": "1.0",
@@ -359,7 +403,34 @@ def test_provider_get_payment_price_ignores_matching_additional_service() -> Non
price = asyncio.run(provider.get_payment_price(request))
assert price is not None
assert price.tariff_code == "ДоставкаДоДверей|urg-exp"
assert price.tariff_code == "ДоставкаДоДверей|delivery-guid|urg-exp"
assert price.price == Decimal("793.00")
def test_provider_get_payment_price_selects_matching_service_guid() -> None:
response = httpx.Response(200, text=_CALC_RESPONSE_WITH_BUYOUT_SERVICE_FIRST)
client, _ = _build_client([response])
provider = CSEProvider(client)
request = make_init_payment_request(
systemData={
"tariff": {
"provider": "cse",
"serviceName": "Экспресс",
"price": 79300,
"deliveryDaysMin": 1,
"deliveryDaysMax": 2,
"tariffCode": "ДоставкаДоДверей|delivery-guid|urg-exp",
},
"parcelType": "parcel",
"weight": "1.0",
"dimensions": {"length": "10", "width": "10", "height": "10"},
}
)
price = asyncio.run(provider.get_payment_price(request))
assert price is not None
assert price.tariff_code == "ДоставкаДоДверей|delivery-guid|urg-exp"
assert price.price == Decimal("793.00")
@@ -370,7 +441,7 @@ def test_provider_get_prices_excludes_additional_service_tariffs() -> None:
httpx.Response(200, text=_CALC_RESPONSE_WITH_ADDITIONAL_SERVICE_FIRST),
]
)
provider = CSEProvider(client)
provider = CSEProvider(client, delivery_service_guids=("delivery-guid",))
prices = asyncio.run(provider.get_prices(_calc_request()))
@@ -380,13 +451,58 @@ def test_provider_get_prices_excludes_additional_service_tariffs() -> None:
]
def test_provider_get_prices_uses_configured_service_guid_filter() -> None:
client, http_client = _build_client(
[
httpx.Response(200, text=_DELIVERY_TYPES_RESPONSE),
httpx.Response(200, text=_CALC_RESPONSE_WITH_BUYOUT_SERVICE_FIRST),
]
)
provider = CSEProvider(client, delivery_service_guids=("delivery-guid",))
prices = asyncio.run(provider.get_prices(_calc_request()))
assert [price.price for price in prices] == [Decimal("793.00")]
assert [price.service_name for price in prices] == [
"Экспресс — Дверь-Дверь"
]
content = http_client.calls[1]["content"].decode("utf-8")
assert "Service" in content
assert "delivery-guid" in content
def test_provider_get_prices_requires_delivery_service_guid_configuration() -> None:
client, _ = _build_client([httpx.Response(200, text=_DELIVERY_TYPES_RESPONSE)])
provider = CSEProvider(client)
with pytest.raises(CSERequestError):
asyncio.run(provider.get_prices(_calc_request()))
def test_provider_register_order_returns_document_number() -> None:
response = httpx.Response(200, text=_SAVE_RESPONSE)
client, http_client = _build_client([response])
provider = CSEProvider(client)
result = asyncio.run(
provider.register_order(make_init_payment_request(), "order-uuid-1")
provider.register_order(
make_init_payment_request(
systemData={
"tariff": {
"provider": "cse",
"serviceName": "Экспресс",
"price": 200000,
"deliveryDaysMin": 1,
"deliveryDaysMax": 2,
"tariffCode": "ДоставкаДоДверей|tariff-guid-2|urg-exp",
},
"parcelType": "parcel",
"weight": "1.0",
"dimensions": {"length": "10", "width": "10", "height": "10"},
}
),
"order-uuid-1",
)
)
assert result.order_number == "CSE-000123"
@@ -436,7 +552,7 @@ def test_save_order_request_uses_selected_tariff_urgency() -> None:
"price": 200000,
"deliveryDaysMin": 1,
"deliveryDaysMax": 2,
"tariffCode": "ДоставкаДоДверей|urg-exp",
"tariffCode": "ДоставкаДоДверей|tariff-guid-2|urg-exp",
},
"parcelType": "parcel",
"weight": "1.0",
@@ -460,7 +576,7 @@ def test_application_error_in_response_raises_request_error() -> None:
httpx.Response(200, text=_ERROR_RESPONSE),
]
)
provider = CSEProvider(client)
provider = CSEProvider(client, delivery_service_guids=("delivery-guid",))
with pytest.raises(CSERequestError):
asyncio.run(provider.get_prices(_calc_request()))
+1
View File
@@ -193,6 +193,7 @@ def test_configuration_sections_are_loaded_from_yaml_file(
assert settings.delivery_providers.cse.retry_backoff_seconds == 0.2
assert settings.delivery_providers.cse.timeout_seconds == 10.0
assert settings.delivery_providers.cse.cache_ttl_seconds == 900
assert settings.delivery_providers.cse.delivery_service_guids == ["tariff-guid-2"]
assert settings.delivery_providers.cse.payer == "0"
assert settings.delivery_providers.cse.payment_method == "1"
assert (