--- id: 003 title: Add CDEK provider adapter status: DONE created: 2026-03-07 --- ## Context Phase 1 в `spec/overview.md` требует поддержку provider CDEK с OAuth2 authentication и маппингом расчёта тарифа. ## Goal Реализовать adapter interfaces и модули CDEK adapter: provider contract, OAuth2 token handling, HTTP client behavior, преобразование ответа в `DeliveryPrice` и чтение параметров CDEK из секции `adapter` YAML-конфига. ## Constraints - Только Adapter layer; без business decisions и sorting logic. - Внешний IO должен оставаться внутри adapter modules. - Timeout для CDEK должен быть 10 секунд согласно specification. - Параметры CDEK (`base_url`, OAuth2 credentials, retry policy, timeout, cache TTL) должны приходить из секции `adapter` в `.yaml` конфиге. - Запрещён хардкод credentials и runtime-параметров адаптера. - Не изменять файлы в `spec/`. ## Acceptance criteria - Существует интерфейс `DeliveryProvider` со стабильным контрактом `get_price()`. - Модуль CDEK auth получает OAuth2 token через client credentials и переиспользует валидный token до истечения. - CDEK client выполняет tariff request с timeout и retry behavior. - CDEK mapper преобразует provider response в унифицированную schema `DeliveryPrice`. - Adapter наружу предоставляет только provider-facing API, необходимый Service. - Адаптер использует значения из секции `adapter` YAML-конфига, включая `timeout_seconds=10` и `cache_ttl_seconds=900` по умолчанию. ## Definition of Done - [ ] Реализован base provider interface. - [ ] Реализованы модули CDEK auth/client/mapper. - [ ] CDEK adapter возвращает унифицированную price model при успешном ответе. - [ ] Adapter tests покрывают auth refresh, timeout/retry и mapping cases. ## Tests - Добавить adapter unit tests для token lifecycle behavior. - Добавить adapter tests для response mapping и HTTP error handling. - Добавить tests, проверяющие применение параметров CDEK из секции `adapter` YAML-конфига. - Для внешних HTTP взаимодействий использовать stubs/mocks. ## Commands - `poetry run pytest tests/adapters/delivery_providers/cdek -q`