fix(ptica): дрейф формы ответа DaData не роняет весь гео-проход (#2464) #2942

Merged
bot-backend merged 1 commit from fix/2464-dadata-data-shape into main 2026-08-19 16:59:50 +00:00

1 commit

Author SHA1 Message Date
6c3743ade9 fix(ptica): дрейф формы ответа DaData не роняет весь гео-проход (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m9s
CI / backend-tests (pull_request) Successful in 17m22s
`_suggest_geocode` брал вложенный словарь как

    data = suggestions[0].get("data") or {}

`or {}` ловит только falsy. Истинное не-словарное значение (список, строка,
число — дрейф контракта) доходило до `.get` и поднимало AttributeError.

Летел он НАРУЖУ. В suggest попадают из clean_address по фолбэку 401/403
(«Feature CLEAN disabled» — реальный прод-инцидент 03.07, на него есть тест), и
этот вызов стоит УЖЕ ЗА пределами её try/except. У вызывающего гео-прохода
(objective_backfill._geocode, строка 864) обёртки нет вовсе. То есть один такой
ответ убил бы весь проход целиком, а не один адрес.

Непоследовательность видна в самом файле: `payload`, `suggestions[0]` и `item`
проверяются через isinstance, а `data` — нет. Защита пропала ровно на уровень
глубже.

Про масштаб честно: за 14 суток в логах бэкенда и воркера НЕТ ни одного
упоминания dadata_client — гео-проход ручной и не запускался. Но путь не
заблокирован ничем внешним, и я сам записал в #2929 критерий приёмки, который
требует этот проход запустить.

Тесты: три параметра (список / строка / число) красные на origin/main с
`AttributeError: 'list' object has no attribute 'get'`; контроль на правильную
форму зелёный с обеих сторон — иначе «починка» могла бы свестись к «всегда None».

pytest tests/services: 3078 passed, 14 skipped, rc=0
2026-08-19 21:39:44 +05:00