From be70cacf188533c9cd3107d6f0f53f62e2260e07 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Tue, 16 Jun 2026 08:35:14 +0300 Subject: [PATCH] =?UTF-8?q?test:=20=D0=B2=D1=8B=D1=80=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D1=8F=D1=82=D1=8C=20weather=5Fcache/nspd=5Fgeo=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=BF=D0=BE=D0=B4=20#1377/#1336=20(CI=20r?= =?UTF-8?q?ed=E2=86=92green)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit backend-tests CI упал на 4 стейл-тестах — код автофиксов обновили, тесты нет: - test_weather_cache: фикстура _make_air_response отдавала hourly-форму, а код (#1377) теперь читает current-bucket → current.time пуст → None. Фикстура → current. - test_nspd_geo: 2 теста стерегли ошибочный ST_Transform(3857→4326), который #1336 убрал (геометрия уже WGS84, иначе Null Island). Ассерты через _strip_sql_comments (как сиблинг parcel-тест) → ST_SetSRID(...,4326) без ST_Transform. Переименованы. Локально: 38 passed (оба файла). --- backend/tests/services/test_weather_cache.py | 12 ++++---- backend/tests/workers/test_nspd_geo.py | 29 ++++++++++++-------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/backend/tests/services/test_weather_cache.py b/backend/tests/services/test_weather_cache.py index 6bb6e0bc..241e7719 100644 --- a/backend/tests/services/test_weather_cache.py +++ b/backend/tests/services/test_weather_cache.py @@ -99,13 +99,13 @@ def _make_httpx_response(payload: dict[str, Any]) -> MagicMock: def _make_air_response() -> dict[str, Any]: - """Минимальный валидный JSON от Open-Meteo Air Quality API (24 часа forecast).""" + """Минимальный валидный JSON от Open-Meteo Air Quality API (current bucket, #1377).""" return { - "hourly": { - "time": ["2026-06-12T00:00", "2026-06-12T01:00"], - "pm2_5": [12.5, 13.0], - "pm10": [25.0, 26.0], - "nitrogen_dioxide": [15.0, 16.0], + "current": { + "time": "2026-06-12T14:00", + "pm2_5": 12.5, + "pm10": 25.0, + "nitrogen_dioxide": 15.0, } } diff --git a/backend/tests/workers/test_nspd_geo.py b/backend/tests/workers/test_nspd_geo.py index 2cbf6802..8ee58bfb 100644 --- a/backend/tests/workers/test_nspd_geo.py +++ b/backend/tests/workers/test_nspd_geo.py @@ -187,13 +187,17 @@ def test_save_quarter_sql_wraps_geom_in_st_multi() -> None: assert "ST_Multi(" in sql, "SQL _save_quarter должен содержать ST_Multi для MultiPolygon schema" -def test_save_quarter_sql_keeps_3857_to_4326_transform() -> None: - """quarter GeoJSON в Mercator (3857) → ST_Transform к 4326 сохраняется (mirror bulk path).""" +def test_save_quarter_sql_no_transform_wgs84() -> None: + """quarter GeoJSON уже в WGS84 (rosreestr2coord) → ST_SetSRID(...,4326) БЕЗ ST_Transform + (#1336: ST_Transform из 3857 трактовал градусы как метры → коллапс к Null Island). + ST_Multi сохраняется — колонка cad_quarters_geom.geom = MultiPolygon.""" db, captured = _capturing_db() _save_quarter(db, _quarter_payload(), "66:41:0610029") sql, _params = captured[0] - assert "ST_Transform(ST_SetSRID(ST_GeomFromGeoJSON(:g), 3857), 4326)" in sql + executable = _strip_sql_comments(sql) + assert "ST_Multi(ST_SetSRID(ST_GeomFromGeoJSON(:g), 4326))" in executable + assert "ST_Transform" not in executable def test_save_parcel_empty_features_returns_zero() -> None: @@ -261,15 +265,18 @@ def test_save_building_derives_quarter_when_missing() -> None: assert params["qcad"] == "66:41:0610029" -def test_save_building_geom_transform_no_st_multi() -> None: - """cad_buildings.geom = GEOMETRY(Geometry, 4326) полиморфный → ST_Multi НЕ нужен, - transform 3857→4326 сохраняется (mirror upsert_building).""" +def test_save_building_geom_no_transform_no_st_multi() -> None: + """cad_buildings.geom = GEOMETRY(Geometry, 4326) полиморфный → ST_Multi НЕ нужен; + геометрия уже WGS84 (rosreestr2coord) → ST_SetSRID(...,4326) БЕЗ ST_Transform + (#1336: ST_Transform из 3857 → Null Island).""" db, captured = _capturing_db() _save_building(db, _building_payload(), "66:41:0610029:83") sql, _params = captured[0] - assert "ST_Transform(ST_SetSRID(ST_GeomFromGeoJSON(:g), 3857), 4326)" in sql - assert "ST_Multi(" not in sql # полиморфная колонка — coerce не нужен + executable = _strip_sql_comments(sql) + assert "ST_SetSRID(ST_GeomFromGeoJSON(:g), 4326)" in executable + assert "ST_Transform" not in executable + assert "ST_Multi(" not in executable # полиморфная колонка — coerce не нужен def test_save_building_skips_feature_with_other_cad_num() -> None: @@ -562,9 +569,9 @@ def test_soft_time_limit_exceeded_flushes_heartbeat(monkeypatch: Any) -> None: for sql, params in captured if "heartbeat_at = NOW()" in sql and "targets_done" in sql ] - assert heartbeat_updates, ( - "SoftTimeLimitExceeded handler должен flush'нуть heartbeat с counters перед raise" - ) + assert ( + heartbeat_updates + ), "SoftTimeLimitExceeded handler должен flush'нуть heartbeat с counters перед raise" def test_soft_time_limit_exceeded_does_not_overwrite_paused_with_failed(