gendesign/backend/tests/sql
bot-backend e6e5bd962c
Some checks failed
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m55s
CI / backend-tests (pull_request) Failing after 17m20s
fix(data): партиции rosreestr_deals на Q2–Q4 2026 + загрузчик доходит до файла (#2998)
Задача формулировала «импорт каждый день рапортует done с total_seen=0».
Проверка на проде показала другое: импорт исправен — ежедневно вычитывает
все 96 974 строки FDW-источника и честно их пропускает (rows_fetched =
rows_skipped = 96974), а `total_seen` — поле админ-витрины, не счётчик
импорта. Источник gendesign.rosreestr_deals стоял на Q1 2026 (загружен
30.04), хотя Q2 2026 опубликован Росреестром 10.07 и poll заметил его
14.08 (available=1). Оба сторожа — poll и deals_freshness_monitor —
сработали и семь событий ушли в GlitchTip, где 0 правил / 0 адресатов /
0 отправок.

Корень, которого в задаче не было: rosreestr_deals партиционирована по
period_start_date, партиции созданы списком в 01_schema «2024 Q3 — 2026
Q1», и ничто новые не создаёт. Загрузка Q2 21.08 упала:

  ERROR: no partition of relation "rosreestr_deals" found for row
  DETAIL: (period_start_date) = (2026-04-01)

То есть даже оператор, запустив загрузчик по подсказке poll, получил бы
отказ. Это и объясняет, почему poll сделан «только сообщить».

Что сделано:
• миграция 193 — партиции Q2, Q3, Q4 2026 с запасом, идемпотентно, с
  lock_timeout; индексы наследуются от родителя (проверено: 4 на 2026q2);
• JOBS загрузчика — 2026Q2–Q4 (квартал без CSV честно SKIP);
• ловушка set -e в загрузчике: resolve_csv сигналит «файла нет» кодом 1,
  и первый же квартал без CSV молча ронял ВЕСЬ прогон до строки SKIP — на
  проде с одним Q2-файлом скрипт завершался rc=0, не напечатав ни строки.
  `|| true` на вызове; после правки боевой прогон на VPS: 12 кварталов,
  2026Q2 «уже загружен (741874 строк)», остальные SKIP, rc=0;
• тест-сторож горизонта: партиция обязана существовать на последний
  публикуемый квартал (+20 дней лага после конца квартала; Q2 2026 вышел
  10.07) и на следующий — чтобы предупреждение приходило за квартал до
  отказа, а не в день публикации. Читает pg_inherits живого Postgres.
  Красная сторона воспроизводима на проде, где миграция уже применена:
  DETACH партиции в откатываемой транзакции → головная краснеет по
  значению («нет партиции на квартал 2026-04-01»), откат возвращает
  партицию (проверено: 12 партиций после теста). Без БД — skip с
  причиной, в allowlist; календарный тест идёт везде.

Сам Q2 загружен на прод по штатному пути: 741 874 строки в
rosreestr_deals (ЕКБ-фильтр 13 654), import-rosreestr.sh → tradein.deals
+11 649 сделок, max(deal_date) 2026-01-01 → 2026-04-01.
deals_freshness_monitor на следующем тике: alert 0, latest_quarter 2.

pytest backend/tests/sql — 55 passed (через туннель к проду).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 12:48:28 +05:00
..
__init__.py chore(mv): regression test + sql rule for weighted AVG (#295) (#626) 2026-05-28 13:49:54 +00:00
test_2464_act_date_backfill.py fix(ptica): backfill act_date у 11 строк, куда уехала дата Генплана-2004 (#2464) 2026-08-20 22:11:35 +05:00
test_2464_area_bin_unknown.py fix(ptica): лоты без площади — своя корзина, а не «<25 м²» (#2464) 2026-08-20 21:41:47 +05:00
test_2464_default_profile_unique.py fix(ptica): у пользователя не может быть двух дефолтных профилей весов (#2464) 2026-08-20 16:58:48 +05:00
test_2464_land_reservation_dedup.py fix(ptica): land_reservation перестаёт копить дубли — 91% таблицы были копиями (#2464) (#2966) 2026-08-20 10:16:34 +00:00
test_2464_leads_stats_suffix_contract.py fix(ptica): выручка и сделки в KPI лидов названы по своему охвату (#2464) (#2963) 2026-08-20 09:44:14 +00:00
test_2956_freshness_ignores_failed_dumps.py fix(ptica): свежесть data-table источника считается по успешным строкам (#2956) (#2957) 2026-08-20 08:36:05 +00:00
test_2986_permits_source_key.py chore(ptica): перенумеровать миграцию 191 → 192 (#2986) 2026-08-20 22:41:27 +05:00
test_2998_rosreestr_partition_horizon.py fix(data): партиции rosreestr_deals на Q2–Q4 2026 + загрузчик доходит до файла (#2998) 2026-08-21 12:48:28 +05:00
test_auth_sql_migrations.py fix(tradein): гейт номеров миграций берёт эталон из git, ручной манифест удалён 2026-08-07 14:35:28 +05:00
test_ddu_price_indicator.py feat(analytics): velocity-anomaly alerts (#17) + ARN ДДУ price indicator (#99) 2026-06-13 22:04:49 +05:00
test_mv_layout_velocity_weighted_avg.py test(suite): re-align drifted tests with current code (CI-rehab 2/3) 2026-06-03 19:05:43 +05:00
test_velocity_alerts.py feat(analytics): velocity-anomaly alerts (#17) + ARN ДДУ price indicator (#99) 2026-06-13 22:04:49 +05:00