diff --git a/app/schemas/order.py b/app/schemas/order.py index b8f629b..d373e75 100644 --- a/app/schemas/order.py +++ b/app/schemas/order.py @@ -2,7 +2,7 @@ from typing import Literal -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, model_validator class OrderPhone(BaseModel): @@ -10,11 +10,17 @@ class OrderPhone(BaseModel): class OrderParty(BaseModel): - company: str | None = None name: str = Field(min_length=1) email: str = Field(min_length=1) phones: list[OrderPhone] = Field(min_length=1) + @model_validator(mode="before") + @classmethod + def reject_company_field(cls, value: object) -> object: + if isinstance(value, dict) and "company" in value: + raise ValueError("company is not allowed") + return value + class OrderLocation(BaseModel): address: str = Field(min_length=1) diff --git a/http-client.http b/http-client.http index d362a0a..b23c884 100644 --- a/http-client.http +++ b/http-client.http @@ -22,7 +22,6 @@ Content-Type: application/json "tariff_code": 535, "comment": "Тестовый заказ", "sender": { - "company": "ООО Ромашка", "name": "Петр Петров", "email": "sender@example.com", "phones": [ diff --git a/spec/index.md b/spec/index.md index 6b6a426..81523f9 100644 --- a/spec/index.md +++ b/spec/index.md @@ -31,10 +31,10 @@ | 022 | DONE | 2026-03-25 | Add address suggestion endpoint | `spec/tasks/022_add_address_suggestion_endpoint.md` | | 023 | DONE | 2026-03-29 | Add Yandex Geosuggest address suggestion adapter and CIS routing | `spec/tasks/023_add_yandex_geosuggest_address_suggestion_adapter.md` | | 024 | DONE | 2026-03-29 | Add TomTom address suggestion adapter and Europe routing | `spec/tasks/024_add_tomtom_address_suggestion_adapter.md` | -| 025 | TODO | 2026-04-03 | Remove company from Create Delivery Order parties | `spec/tasks/025_remove_company_from_create_delivery_order.md` | +| 025 | DONE | 2026-04-03 | Remove company from Create Delivery Order parties | `spec/tasks/025_remove_company_from_create_delivery_order.md` | ## Summary - Total: **26** -- TODO: **1** -- DONE: **25** +- TODO: **0** +- DONE: **26** diff --git a/spec/tasks/025_remove_company_from_create_delivery_order.md b/spec/tasks/025_remove_company_from_create_delivery_order.md index acbaa06..05879b5 100644 --- a/spec/tasks/025_remove_company_from_create_delivery_order.md +++ b/spec/tasks/025_remove_company_from_create_delivery_order.md @@ -1,7 +1,7 @@ --- id: 025 title: Remove company from Create Delivery Order parties -status: TODO +status: DONE created: 2026-04-03 --- diff --git a/tests/adapters/delivery_providers/cdek/test_order_client.py b/tests/adapters/delivery_providers/cdek/test_order_client.py index ee22cf0..a73c474 100644 --- a/tests/adapters/delivery_providers/cdek/test_order_client.py +++ b/tests/adapters/delivery_providers/cdek/test_order_client.py @@ -57,7 +57,6 @@ def _make_order_request(**overrides: object) -> OrderCreateRequest: "tariff_code": 535, "comment": "Test order", "sender": { - "company": "Romashka LLC", "name": "Petr Petrov", "email": "sender@example.com", "phones": [{"number": "+79009876543"}], @@ -123,7 +122,6 @@ def test_provider_register_order_posts_cdek_contract_payload_and_maps_response() "tariff_code": 535, "comment": "Test order", "sender": { - "company": "Romashka LLC", "name": "Petr Petrov", "email": "sender@example.com", "phones": [{"number": "+79009876543"}], diff --git a/tests/controllers/v1/test_order.py b/tests/controllers/v1/test_order.py index 2e267c9..8ef7a9f 100644 --- a/tests/controllers/v1/test_order.py +++ b/tests/controllers/v1/test_order.py @@ -37,7 +37,6 @@ def _valid_payload() -> dict[str, object]: "tariff_code": 535, "comment": "Test order", "sender": { - "company": "Romashka LLC", "name": "Petr Petrov", "email": "sender@example.com", "phones": [{"number": "+79009876543"}], @@ -113,6 +112,54 @@ def test_post_delivery_order_rejects_invalid_payload() -> None: assert service.calls == [] +def test_post_delivery_order_rejects_sender_company_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] + "company": "Romashka LLC", + } + + 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() + _install_service_override(app, service) + invalid_payload = _valid_payload() + invalid_payload["recipient"] = { + **invalid_payload["recipient"], # type: ignore[arg-type] + "company": "Romashka LLC", + } + + 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_maps_invalid_request_to_400() -> None: service = StubAggregatorService( response=None, diff --git a/tests/services/test_order.py b/tests/services/test_order.py index ec8d1ce..73d570d 100644 --- a/tests/services/test_order.py +++ b/tests/services/test_order.py @@ -37,7 +37,6 @@ def _make_order_request(**overrides: object) -> OrderCreateRequest: "tariff_code": 535, "comment": "Test order", "sender": { - "company": "Romashka LLC", "name": "Petr Petrov", "email": "sender@example.com", "phones": [{"number": "+79009876543"}],