Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Failing after 21s
CI Trade-In / browser-tests (pull_request) Successful in 51s
CI Trade-In / frontend-checks (pull_request) Successful in 1m31s
CI / frontend-tests (pull_request) Successful in 1m20s
CI / openapi-codegen-check (pull_request) Successful in 2m3s
CI / backend-tests (pull_request) Successful in 15m46s
Общее у #2722, #2729 и #2740 — не три разных бага, а один: пропуск, которого не видно. Под `pytest -q` пропуск рисуется точкой `s`, неотличимой от прогона, и проверка годами «зелёная», ничего не проверяя. Три меры, от дешёвой к жёсткой. 1. `-rs` во всех pytest-шагах (ci.yml, ci-tradein.yml backend+browser). Каждый пропуск печатает причину в лог job'а. Одна опция — и молчаливых пропусков больше нет ни одного. 2. Postgres-сервисы вместо заглушечных DSN. ci-tradein: DATABASE_URL вёл на заведомо мёртвый localhost:5432/test, и девять тестов с `_live_session()` self-skip'ались — в CI не бежали НИ РАЗУ. Именно так #2740 разъехался со схемой (houses.url стал NOT NULL), а test_gar_flats_loader падал до первого утверждения (#2744). Теперь postgis-сервис + сборка схемы из backend/data/sql/ тем же строгим циклом, что в deploy-tradein.yml (ON_ERROR_STOP, падение миграции → job RED). Единственное исключение названо вслух в коде: 077 — backfill через postgres_fdw к БД другого стека, которой в CI нет. ci.yml: plain postgres:16 (без PostGIS — tests/sql/ строят себе временные таблицы) поднимает 10 тестов SQL-логики (#17, #99, #295), не бежавших с момента написания. TEST_DATABASE_URL намеренно НЕ задан: на нём висит phantom-column gate, которому нужна копия ПРОДОВОЙ схемы, и пустой контейнер дал бы там красноту на пустом месте. Замер до включения: tradein 122с/3858 passed/10 skipped на моке против 106с/3867 passed/1 skipped на живой БД; backend 783с/4594/48 против 723с/4604/38. Живая БД не медленнее — поэтому не второй job, а починка существующего. Накладные: подъём сервиса + bootstrap схемы (219 файлов, ~20с в tradein; в backend схема не нужна вовсе). 3. skip_allowlist.txt + хук в conftest обоих сьютов. Пропущено может быть только то, что объявлено с причиной. Любой новый пропуск — дописал кто-то skipif «пока починю», отвалилась зависимость, исчезла БД — роняет прогон. Список это ещё и инвентарь: против каждой записи сказано, почему проверку нельзя выполнить здесь и где она выполняется вместо этого. Сюда же попадает xfail (pytest рапортует его как skipped), так что xfail без strict=True тоже придётся объявить. Список — надмножество сред: в CI часть записей не срабатывает, на ноутбуке без Postgres и native-libs — срабатывает; лишняя запись безвредна, пропуск без записи — нет. Проверено локально в конфигурации, которую задаёт этот PR: backend 4604 passed / 38 skipped / exit 0, tradein 3858 passed / 10 skipped / exit 0; при удалённом allowlist тот же прогон даёт exit 1 и печатает неучтённые.
89 lines
8.3 KiB
Text
89 lines
8.3 KiB
Text
# Объявленные пропуски сьюта backend/.
|
||
#
|
||
# Пропуск, которого здесь нет, роняет прогон (хук в tests/conftest.py). Смысл: не
|
||
# запретить пропуски, а запретить НЕЗАМЕТНЫЕ. Проверка, которая тихо перестала
|
||
# исполняться, со временем расходится с кодом, и узнают об этом ровно тогда,
|
||
# когда на неё понадобилось опереться (#2722, #2729, #2740).
|
||
#
|
||
# Формат: один nodeid в строке, без «[параметров]»; `#` — комментарий.
|
||
# Прежде чем добавить строку, ответь: почему эту проверку нельзя выполнить ЗДЕСЬ
|
||
# и где она выполняется вместо этого. Нет ответа — это не пропуск, а дыра.
|
||
#
|
||
# Список — НАДмножество сред: на CI (ubuntu + libpango + postgres-сервис) часть
|
||
# записей не срабатывает, на ноутбуке без них — срабатывает. Запись, чей пропуск
|
||
# не случился, безвредна; пропуск без записи — нет.
|
||
|
||
# ── WeasyPrint: нужны native-либы (Pango/cairo/GObject) ───────────────────────
|
||
# В CI ЭТИ ТЕСТЫ ИДУТ: ci.yml ставит libcairo2/libpango-1.0-0/libpangoft2-1.0-0.
|
||
# Записи нужны только для macOS-dev, где libgobject-2.0-0 нет.
|
||
tests/api/v1/test_parcels_forecast.py::test_export_forecast_pdf_returns_pdf
|
||
tests/services/exporters/test_report_pdf.py::TestConfidenceSectionParity::test_dict_shaped_factor_produces_valid_pdf
|
||
tests/services/exporters/test_report_pdf.py::TestFullReportExport::test_accepts_as_dict_input
|
||
tests/services/exporters/test_report_pdf.py::TestFullReportExport::test_returns_non_trivial_length
|
||
tests/services/exporters/test_report_pdf.py::TestFullReportExport::test_returns_pdf_magic_bytes
|
||
tests/services/exporters/test_report_pdf.py::TestGracefulPartialReport::test_empty_report_still_valid_pdf
|
||
tests/services/exporters/test_report_pdf.py::TestGracefulPartialReport::test_garbage_input_does_not_crash
|
||
tests/services/exporters/test_report_pdf.py::TestGracefulPartialReport::test_partial_report_some_sections
|
||
tests/services/generative/test_exporters.py::test_pdf_export_produces_pdf_bytes
|
||
tests/test_layout_tz_pdf.py
|
||
|
||
# ── phantom-column gate: нужна КОПИЯ ПРОДОВОЙ схемы ───────────────────────────
|
||
# Смысл этих тестов — поймать колонку, которой нет в реальной БД, поэтому пустой
|
||
# сервис-контейнер их не заменяет: против пустой схемы они дали бы красноту, не
|
||
# относящуюся к делу. Условие: TEST_DATABASE_URL на SSH-туннель к проду
|
||
# (`ssh -N gendesign` → localhost:15432), см. tests/integration/conftest.py.
|
||
# ЗАПУСКАТЬ ВРУЧНУЮ после правок SQL-запросов в app/services/**.
|
||
tests/integration/test_analyze_parcels_sql.py::TestIrdOverlapSql::test_explain_ird_overlap
|
||
tests/integration/test_analyze_parcels_sql.py::TestNeighborsSummarySql::test_explain_neighbors_summary
|
||
tests/integration/test_phantom_columns.py::TestCadGeoTables::test_parcel_centroid_query
|
||
tests/integration/test_phantom_columns.py::TestDomrfKnFlats::test_avg_price_query
|
||
tests/integration/test_phantom_columns.py::TestDomrfKnFlats::test_supply_batch_query
|
||
tests/integration/test_phantom_columns.py::TestDomrfKnObjects::test_competitors_full_cte_query
|
||
tests/integration/test_phantom_columns.py::TestDomrfKnObjects::test_competitors_radius_query
|
||
tests/integration/test_phantom_columns.py::TestDomrfKnObjects::test_velocity_competitor_query_columns
|
||
tests/integration/test_phantom_columns.py::TestEkburgConstructionPermits::test_permits_rns_columns
|
||
tests/integration/test_phantom_columns.py::TestEkburgConstructionPermits::test_permits_rve_columns
|
||
tests/integration/test_phantom_columns.py::TestEkburgConstructionPermits::test_recent_permits_query
|
||
tests/integration/test_phantom_columns.py::TestMvLayoutVelocity::test_velocity_by_room_bucket
|
||
tests/integration/test_phantom_columns.py::TestObjectiveTables::test_objective_corpus_room_month_columns
|
||
tests/integration/test_phantom_columns.py::TestObjectiveTables::test_objective_mapping_columns
|
||
tests/integration/test_phantom_columns.py::TestObjectiveTables::test_sold_count_query
|
||
|
||
# ── SQL-логика на живой Postgres ──────────────────────────────────────────────
|
||
# В CI ЭТИ ТЕСТЫ ИДУТ с #2745 (postgres-сервис в ci.yml); до него не бежали ни
|
||
# разу с момента написания. Схема не нужна — строят себе временные таблицы.
|
||
# Локально: docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=... postgres:16
|
||
tests/sql/test_ddu_price_indicator.py::test_basis_and_previous_index
|
||
tests/sql/test_ddu_price_indicator.py::test_packaged_deal_bucketed_by_per_unit_area
|
||
tests/sql/test_ddu_price_indicator.py::test_prev_period_value_skips_filtered_quarter
|
||
tests/sql/test_mv_layout_velocity_weighted_avg.py::TestWeightedAvgFormula::test_hand_computed_weighted_average
|
||
tests/sql/test_mv_layout_velocity_weighted_avg.py::TestWeightedAvgFormula::test_no_zero_months_weighted_equals_naive
|
||
tests/sql/test_mv_layout_velocity_weighted_avg.py::TestWeightedAvgFormula::test_nullif_prevents_division_by_zero
|
||
tests/sql/test_mv_layout_velocity_weighted_avg.py::TestWeightedAvgFormula::test_weighted_differs_from_naive_sparse_project
|
||
tests/sql/test_mv_layout_velocity_weighted_avg.py::TestWeightedAvgFormula::test_zero_deal_months_skew_naive_avg
|
||
tests/sql/test_velocity_alerts.py::test_lookback_anchors_to_latest_data_month
|
||
tests/sql/test_velocity_alerts.py::test_sharp_drop_is_flagged
|
||
|
||
# ── Живая сеть NSPD (nspd.gov.ru) ─────────────────────────────────────────────
|
||
# Ходят в внешний сервис: в гейте это флейк и зависимость от чужого аптайма.
|
||
# Запуск вручную: uv run pytest tests/scrapers/ -m slow / -m integration -s
|
||
tests/scrapers/test_nspd_bulk_client.py::test_list_objects_in_building_real
|
||
tests/scrapers/test_nspd_bulk_client.py::test_search_by_quarter_empty
|
||
tests/scrapers/test_nspd_bulk_client.py::test_search_by_quarter_real_ekb
|
||
tests/scrapers/test_nspd_bulk_client.py::test_wms_feature_info_real
|
||
tests/scrapers/test_nspd_grid_walk.py::test_live_nspd_grid_walk_skipped
|
||
|
||
# ── Образцы, которых нет в git ────────────────────────────────────────────────
|
||
# ДОЛГ, а не норма: парсеры проверяются на реальных дампах, которые лежат только
|
||
# в untracked `.playwright-mcp/`. Пока файлы не в репозитории, эти 8 проверок не
|
||
# исполняются нигде. Правильная починка — закоммитить образцы в tests/fixtures/
|
||
# (как сделано в tradein-mvp/backend/tests/fixtures/*.html), после чего строки
|
||
# отсюда убрать.
|
||
tests/services/scrapers/test_ekb_krt_registry.py::TestMultiSiteCountFromDump::test_no_duplicate_site_names
|
||
tests/services/scrapers/test_ekb_krt_registry.py::TestMultiSiteCountFromDump::test_site_count_from_dump
|
||
tests/services/scrapers/test_ekb_ppt_tep_parser.py::TestParsePptTepRealPdf::test_phasing_has_area
|
||
tests/services/scrapers/test_ekb_ppt_tep_parser.py::TestParsePptTepRealPdf::test_phasing_has_rows
|
||
tests/services/scrapers/test_ekb_ppt_tep_parser.py::TestParsePptTepRealPdf::test_raw_tables_not_empty
|
||
tests/services/scrapers/test_ekb_ppt_tep_parser.py::TestParsePptTepRealPdf::test_tep_has_rows
|
||
tests/services/scrapers/test_ekb_ppt_tep_parser.py::TestParsePptTepRealPdf::test_zone_balance_has_itogo
|
||
tests/services/scrapers/test_ekb_ppt_tep_parser.py::TestParsePptTepRealPdf::test_zone_balance_has_rows
|