fix(tests): phones в фикстуре — list[dict], а не список строк
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m36s

CI (там живой postgres, и эти два теста реально исполняются) поймал
ValidationError: ScrapedLot.phones — jsonb вида
[{countryCode, number, type}, ...] (019_listings_alter_cian.sql:41), а я
передавал ["+79000000000"].

Заодно проверено конструирование лота напрямую, без БД — это ловит любые
pydantic-ошибки, не дожидаясь прогона CI. Всплыла деталь, подтверждающая
разбор в самом фиксе: у бедного лота phones не None, а ПУСТОЙ СПИСОК.
Сборка параметров (`_to_json(lot.phones) if lot.phones else None`)
схлопывает его в None, то есть в SQL приходит NULL и COALESCE удерживает
прежнее значение. Если бы пустой список доезжал как '[]', фикс для phones
и metro_stations молча не работал бы.

Refs #3063
This commit is contained in:
bot-backend 2026-08-24 00:46:02 +03:00
parent 0cce97bd75
commit 85fc18dcb3

View file

@ -158,7 +158,9 @@ def _lot(src_id: str, *, rich: bool) -> ScrapedLot:
extra = {
"is_homeowner": True,
"is_pro_seller": False,
"phones": ["+79000000000"],
# phones — jsonb вида [{countryCode, number, type}, ...]
# (019_listings_alter_cian.sql:41), а не список строк.
"phones": [{"countryCode": "+7", "number": "9000000000", "type": "mobile"}],
"sale_type": "free",
}
return ScrapedLot(