From 85fc18dcb3dad519d734c233599d6aa8e0f04071 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Mon, 24 Aug 2026 00:46:02 +0300 Subject: [PATCH] =?UTF-8?q?fix(tests):=20phones=20=D0=B2=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D1=83=D1=80=D0=B5=20=E2=80=94=20list[dict],?= =?UTF-8?q?=20=D0=B0=20=D0=BD=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../backend/tests/test_3063_seller_fields_not_eroded.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tradein-mvp/backend/tests/test_3063_seller_fields_not_eroded.py b/tradein-mvp/backend/tests/test_3063_seller_fields_not_eroded.py index f94938d1..6a2b4353 100644 --- a/tradein-mvp/backend/tests/test_3063_seller_fields_not_eroded.py +++ b/tradein-mvp/backend/tests/test_3063_seller_fields_not_eroded.py @@ -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(