fix order form
This commit is contained in:
@@ -59,12 +59,12 @@ def _make_order_request(**overrides: object) -> OrderCreateRequest:
|
||||
"sender": {
|
||||
"name": "Petr Petrov",
|
||||
"email": "sender@example.com",
|
||||
"phones": [{"number": "+79009876543"}],
|
||||
"phone": {"number": "+79009876543"},
|
||||
},
|
||||
"recipient": {
|
||||
"name": "Ivan Ivanov",
|
||||
"email": "ivan@example.com",
|
||||
"phones": [{"number": "+79001234567"}],
|
||||
"phone": {"number": "+79001234567"},
|
||||
},
|
||||
"from_location": {
|
||||
"address": "Lenina 1",
|
||||
@@ -80,7 +80,7 @@ def _make_order_request(**overrides: object) -> OrderCreateRequest:
|
||||
"packages": [
|
||||
{
|
||||
"number": "1",
|
||||
"weight": 1000,
|
||||
"weight": 1,
|
||||
"length": 20,
|
||||
"width": 15,
|
||||
"height": 10,
|
||||
@@ -160,6 +160,70 @@ def test_provider_register_order_posts_cdek_contract_payload_and_maps_response()
|
||||
]
|
||||
|
||||
|
||||
def test_provider_register_order_omits_services_when_none_and_converts_package_weights() -> None:
|
||||
response = httpx.Response(
|
||||
200,
|
||||
json={"entity": {"uuid": "cdek-order-uuid"}},
|
||||
request=httpx.Request("POST", "https://api.cdek.test/v2/orders"),
|
||||
)
|
||||
http_client = SequenceHTTPClient([response])
|
||||
provider = CDEKProvider(
|
||||
CDEKClient(
|
||||
http_client=http_client, # type: ignore[arg-type]
|
||||
auth_client=StubAuthClient(), # type: ignore[arg-type]
|
||||
base_url="https://api.cdek.test/v2",
|
||||
timeout_seconds=7.5,
|
||||
retry_attempts=0,
|
||||
)
|
||||
)
|
||||
request = _make_order_request(
|
||||
services=None,
|
||||
packages=[
|
||||
{
|
||||
"number": "1",
|
||||
"weight": 1,
|
||||
"length": 20,
|
||||
"width": 15,
|
||||
"height": 10,
|
||||
"comment": "Package 1",
|
||||
},
|
||||
{
|
||||
"number": "2",
|
||||
"weight": 2,
|
||||
"length": 25,
|
||||
"width": 18,
|
||||
"height": 12,
|
||||
"comment": "Package 2",
|
||||
},
|
||||
],
|
||||
)
|
||||
|
||||
asyncio.run(provider.register_order(request))
|
||||
|
||||
payload = http_client.calls[0]["json"]
|
||||
assert "services" not in payload
|
||||
assert payload["sender"]["phones"] == [{"number": "+79009876543"}]
|
||||
assert payload["recipient"]["phones"] == [{"number": "+79001234567"}]
|
||||
assert payload["packages"] == [
|
||||
{
|
||||
"number": "1",
|
||||
"weight": 1000,
|
||||
"length": 20,
|
||||
"width": 15,
|
||||
"height": 10,
|
||||
"comment": "Package 1",
|
||||
},
|
||||
{
|
||||
"number": "2",
|
||||
"weight": 2000,
|
||||
"length": 25,
|
||||
"width": 18,
|
||||
"height": 12,
|
||||
"comment": "Package 2",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def test_cdek_client_register_order_maps_4xx_to_request_error() -> None:
|
||||
rejected_response = httpx.Response(
|
||||
422,
|
||||
|
||||
@@ -39,12 +39,12 @@ def _valid_payload() -> dict[str, object]:
|
||||
"sender": {
|
||||
"name": "Petr Petrov",
|
||||
"email": "sender@example.com",
|
||||
"phones": [{"number": "+79009876543"}],
|
||||
"phone": {"number": "+79009876543"},
|
||||
},
|
||||
"recipient": {
|
||||
"name": "Ivan Ivanov",
|
||||
"email": "ivan@example.com",
|
||||
"phones": [{"number": "+79001234567"}],
|
||||
"phone": {"number": "+79001234567"},
|
||||
},
|
||||
"from_location": {
|
||||
"address": "Lenina 1",
|
||||
@@ -60,7 +60,7 @@ def _valid_payload() -> dict[str, object]:
|
||||
"packages": [
|
||||
{
|
||||
"number": "1",
|
||||
"weight": 1000,
|
||||
"weight": 1,
|
||||
"length": 20,
|
||||
"width": 15,
|
||||
"height": 10,
|
||||
@@ -136,6 +136,30 @@ def test_post_delivery_order_rejects_sender_company_field() -> None:
|
||||
assert service.calls == []
|
||||
|
||||
|
||||
def test_post_delivery_order_rejects_sender_phones_field() -> None:
|
||||
service = StubAggregatorService(response=None)
|
||||
app = create_app()
|
||||
_install_service_override(app, service)
|
||||
invalid_payload = _valid_payload()
|
||||
invalid_payload["sender"] = {
|
||||
**invalid_payload["sender"], # type: ignore[arg-type]
|
||||
"phones": [{"number": "+79009876543"}],
|
||||
}
|
||||
|
||||
async def run_request() -> httpx.Response:
|
||||
transport = httpx.ASGITransport(app=app)
|
||||
async with httpx.AsyncClient(
|
||||
transport=transport,
|
||||
base_url="http://testserver",
|
||||
) as client:
|
||||
return await client.post("/api/v1/delivery/order", json=invalid_payload)
|
||||
|
||||
response = asyncio.run(run_request())
|
||||
|
||||
assert response.status_code == 422
|
||||
assert service.calls == []
|
||||
|
||||
|
||||
def test_post_delivery_order_rejects_recipient_company_field() -> None:
|
||||
service = StubAggregatorService(response=None)
|
||||
app = create_app()
|
||||
@@ -160,6 +184,53 @@ def test_post_delivery_order_rejects_recipient_company_field() -> None:
|
||||
assert service.calls == []
|
||||
|
||||
|
||||
def test_post_delivery_order_rejects_recipient_phones_field() -> None:
|
||||
service = StubAggregatorService(response=None)
|
||||
app = create_app()
|
||||
_install_service_override(app, service)
|
||||
invalid_payload = _valid_payload()
|
||||
invalid_payload["recipient"] = {
|
||||
**invalid_payload["recipient"], # type: ignore[arg-type]
|
||||
"phones": [{"number": "+79001234567"}],
|
||||
}
|
||||
|
||||
async def run_request() -> httpx.Response:
|
||||
transport = httpx.ASGITransport(app=app)
|
||||
async with httpx.AsyncClient(
|
||||
transport=transport,
|
||||
base_url="http://testserver",
|
||||
) as client:
|
||||
return await client.post("/api/v1/delivery/order", json=invalid_payload)
|
||||
|
||||
response = asyncio.run(run_request())
|
||||
|
||||
assert response.status_code == 422
|
||||
assert service.calls == []
|
||||
|
||||
|
||||
def test_post_delivery_order_accepts_request_without_services() -> None:
|
||||
expected_response = OrderCreateResponse(provider="cdek", order_uuid="order-uuid-1")
|
||||
service = StubAggregatorService(response=expected_response)
|
||||
app = create_app()
|
||||
_install_service_override(app, service)
|
||||
payload = _valid_payload()
|
||||
del payload["services"]
|
||||
|
||||
async def run_request() -> httpx.Response:
|
||||
transport = httpx.ASGITransport(app=app)
|
||||
async with httpx.AsyncClient(
|
||||
transport=transport,
|
||||
base_url="http://testserver",
|
||||
) as client:
|
||||
return await client.post("/api/v1/delivery/order", json=payload)
|
||||
|
||||
response = asyncio.run(run_request())
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json() == expected_response.model_dump(mode="json")
|
||||
assert service.calls == [OrderCreateRequest(**payload)]
|
||||
|
||||
|
||||
def test_post_delivery_order_maps_invalid_request_to_400() -> None:
|
||||
service = StubAggregatorService(
|
||||
response=None,
|
||||
|
||||
@@ -39,12 +39,12 @@ def _make_order_request(**overrides: object) -> OrderCreateRequest:
|
||||
"sender": {
|
||||
"name": "Petr Petrov",
|
||||
"email": "sender@example.com",
|
||||
"phones": [{"number": "+79009876543"}],
|
||||
"phone": {"number": "+79009876543"},
|
||||
},
|
||||
"recipient": {
|
||||
"name": "Ivan Ivanov",
|
||||
"email": "ivan@example.com",
|
||||
"phones": [{"number": "+79001234567"}],
|
||||
"phone": {"number": "+79001234567"},
|
||||
},
|
||||
"from_location": {
|
||||
"address": "Lenina 1",
|
||||
@@ -60,7 +60,7 @@ def _make_order_request(**overrides: object) -> OrderCreateRequest:
|
||||
"packages": [
|
||||
{
|
||||
"number": "1",
|
||||
"weight": 1000,
|
||||
"weight": 1,
|
||||
"length": 20,
|
||||
"width": 15,
|
||||
"height": 10,
|
||||
@@ -96,6 +96,20 @@ def test_create_order_maps_provider_request_errors_to_invalid_order_error() -> N
|
||||
assert adapter.calls == [request]
|
||||
|
||||
|
||||
def test_create_order_delegates_request_with_services_none_without_new_logic() -> None:
|
||||
request = _make_order_request(services=None)
|
||||
adapter = StubOrderAdapter(
|
||||
response=OrderCreateResponse(provider="cdek", order_uuid="order-uuid-2")
|
||||
)
|
||||
service = AggregatorService(providers=[], order_adapter=adapter)
|
||||
|
||||
result = asyncio.run(service.create_order(request))
|
||||
|
||||
assert result == OrderCreateResponse(provider="cdek", order_uuid="order-uuid-2")
|
||||
assert adapter.calls == [request]
|
||||
assert adapter.calls[0].services is None
|
||||
|
||||
|
||||
def test_create_order_maps_transport_failures_to_unavailable_error() -> None:
|
||||
request = _make_order_request()
|
||||
adapter = StubOrderAdapter(error=RuntimeError("transport down"))
|
||||
|
||||
Reference in New Issue
Block a user