--- type: test-report work_item_id: ET-007 title: "Test Report: Спутниковая карта (Схема / Спутник)" version: 2 status: PASS created_at: 2026-05-31 updated_at: 2026-05-31 changelog: - "v2 (2026-05-31): повторный прогон полного регресса по запросу stage=testing — pytest 76/76, node --test 33/33, smoke deployed artifacts PASS, health 200. Вердикт без изменений." authors: - "agent:tester" branch: feature/ET-007-et-005 head_commit: 6acc57d verdict: PASS — ready-to-deploy --- # Test Report — ET-007: Спутниковая карта (Схема / Спутник) ## Сводка | Категория | Результат | |------------------------------|------------------------| | Health check test-стенда | PASS (HTTP 200) | | Smoke deployed artifacts | PASS | | Unit tests (pytest, статика) | 76 passed | | Unit tests (node --test, JS) | 33/33 passed | | E2E (Playwright) | SKIP — раннер не установлен (см. §5) | | UI / Visual | SKIP — раннер не установлен (см. §5) | **Вердикт:** PASS — продвигать в `ready-to-deploy`. Все автоматизируемые в текущем окружении тесты прошли. Браузерные кейсы (E-01..E-10, TC-UI-01..14) не запускались из-за отсутствия Playwright-инфраструктуры в репозитории и UI-раннера на хосте — это известный гэп, отмеченный в `12-review.md` и ADR-0001 (ET-002), не связанный с ET-007. Покрытие AC на этом этапе обеспечивается комбо статических Python-тестов + поведенческих JS-unit + ручной приёмки на test-стенде после деплоя. --- ## 1. Окружение - **Test-стенд:** https://openclaw.mva154.duckdns.org/enduro/ - **Branch под тестом:** `feature/ET-007-et-005` @ `6acc57d` - **HEAD commit:** `reviewer(ET): auto-commit from reviewer run_id=32` - **Python:** 3.12.13, pytest 8.3.3 - **Node:** node --test (built-in test runner) ### 1.1 Health check ``` $ curl -s https://openclaw.mva154.duckdns.org/enduro/api/health HTTP 200 {"status":"ok","db_path":"/app/data/centralfederal.sqlite","db_exists":true} ``` **Результат:** PASS. --- ## 2. Unit / Static tests (pytest) ``` $ python -m pytest tests/ -v --ignore=tests/unit/test_health.py ======================== 76 passed, 1 warning in 0.92s ========================= ``` ### 2.1 Прямо относящиеся к ET-007 (28 тестов) `tests/unit/test_base_layer.py` — все PASS: | Тест | Результат | |----------------------------------------------------------------------------|-----------| | test_base_toggle_present_in_html | PASS | | test_base_toggle_default_active_schematic | PASS | | test_base_toggle_reuses_seg_control_component | PASS | | test_base_toggle_placed_at_top_of_terrain_popup | PASS | | test_base_toggle_styles_defined | PASS | | test_app_js_base_layer_functions_defined | PASS | | test_app_js_has_et007_block_markers | PASS | | test_app_js_uses_localstorage_key | PASS | | test_app_js_uses_esri_world_imagery | PASS | | test_app_js_satellite_source_and_layer_ids | PASS | | test_app_js_lazy_source_creation | PASS | | test_rebuild_overlays_calls_restore_base_layer_first | PASS | | test_restore_base_layer_state_wired_into_init | PASS | | test_app_js_uses_setpaint_for_poi_halo | PASS | | test_app_js_uses_visibility_for_trails_halo | PASS | | test_style_contains_halo_layers[style.json] | PASS | | test_style_contains_halo_layers[style-dark.json] | PASS | | test_halo_layers_hidden_by_default[style.json] | PASS | | test_halo_layers_hidden_by_default[style-dark.json] | PASS | | test_halo_layers_below_real_trails[style.json] | PASS | | test_halo_layers_below_real_trails[style-dark.json] | PASS | | test_js_unit_tests_pass | PASS | ### 2.2 Регресс по соседним фичам | Suite | Cases | Результат | |--------------------------------------|-------|-----------| | `test_routing_barriers.py` (ET barriers) | 7 | PASS | | `test_gpx_upload.py` (ET-006) | 19 | PASS | | `test_poi_toggle.py` (ET-002) | 10 | PASS | | `test_unit_toggle.py` (ET-005) | 17 | PASS | Регресс по соседним фичам не сломан. ### 2.3 Известная инфра-проблема ``` ERROR collecting tests/unit/test_health.py ModuleNotFoundError: No module named 'shapely' ``` `shapely` отсутствует в test-окружении агента (но есть в Docker-образе runtime, что подтверждается health 200 OK). К ET-007 не относится, зафиксировано в `12-review.md`. --- ## 3. JS unit tests (`node --test`) ``` $ node --test tests/unit/base_layer.test.js # tests 33 # pass 33 # fail 0 # duration_ms 96.997357 ``` Покрытие из 04-test-plan.yaml: | Test plan ID | Где покрыто | Результат | |--------------|------------------------------------------------------------------------|-----------| | U-01 | `applyBaseLayer("schematic") при пустом localStorage` | PASS | | U-02 | Чтение `localStorage='satellite'` | PASS | | U-03 | `onBaseLayerToggle('satellite')` пишет в localStorage | PASS | | U-04 | Невалидное stored — fallback на `schematic` | PASS | | U-05 | Toggle на уже активный режим — no-op | PASS | | U-10, U-11 | `syncBaseLayerUI(...)` | PASS | | I-01 | `map.getSource('satellite-raster')` после первого toggle | PASS | | I-02 | `map.getLayer('satellite-base')` | PASS | | I-03 | `osm-base.visibility === 'none'` после satellite | PASS | | I-04 | satellite→schematic — `visibility` swap | PASS | | I-05 | Z-order: satellite ниже terrain/trails | PASS | | I-06 | Position карты сохраняется | PASS (мок-карта; реальная — manual smoke) | | I-07 | Атрибуция Esri в source | PASS | P1-2 (POI text-color), P1-4 (background обе темы), P1-5 (basemap-state), P1-6 (halo синхронизация) — все 4 P1 из review v1 закрыты JS-тестами. --- ## 4. Smoke test-стенда (deployed assets) Проверка, что артефакты ET-007 реально задеплоены на https://openclaw.mva154.duckdns.org/enduro/ : | Артефакт | Проверка | Результат | |---------------------|-----------------------------------------------------------|-----------| | `index.html` | `terrain-base-row`, `#base-btn-schematic`, `#base-btn-satellite`, `onclick="onBaseLayerToggle(...)"` присутствуют (строки 45–51) | PASS | | `app.js` | 16 вхождений ET-007 идентификаторов: `applyBaseLayer`, `onBaseLayerToggle`, `restoreBaseLayerState`, `syncBaseLayerUI`, `satellite-raster`, `satellite-base`, `arcgisonline` | PASS | | `app.css` | `.terrain-base-row`, `.base-seg`, `body.satellite-active #btn-basemap` (строки 870–895) | PASS | | `style.json` | 2 halo-слоя `*-halo-satellite` | PASS | | `style-dark.json` | 2 halo-слоя `*-halo-satellite` | PASS | Все статические артефакты доставлены на test-стенд корректно. --- ## 5. Visual / UI тесты (SKIP) Из `04b-ui-test-cases.md` определено 14 визуальных кейсов (TC-UI-01..14, включая 2 mobile-кейса). Из `04-test-plan.yaml` определено 8 E2E-кейсов (E-01..E-07, E-10). **Не выполнены:** в окружении агента отсутствует UI-раннер (`/home/slin/tools/ui-test/run_tests.js` — `ls: cannot access … No such file or directory`, повторно проверено на этой итерации); Playwright не установлен ни в репозитории, ни на хосте; `package.json` в репозитории отсутствует. Таблица TC → результат (все SKIP по одной причине — отсутствие раннера): | TC | Описание | Результат | |---------|-----------------------------------------------------------------|-----------| | TC-UI-01 | Переключатель «Подложка» виден в попапе | SKIP (no runner) | | TC-UI-02 | Активация «Спутник» меняет подложку | SKIP (no runner) | | TC-UI-03 | Атрибуция Esri видна | SKIP (no runner) | | TC-UI-04 | Возврат на «Схема» | SKIP (no runner) | | TC-UI-05 | Грунтовки и тропы видны на спутнике | SKIP (no runner) | | TC-UI-06 | POI и подписи на спутнике читаемы | SKIP (no runner) | | TC-UI-07 | Спутник переживает смену темы | SKIP (no runner) | | TC-UI-08 | Hillshade поверх спутника | SKIP (no runner) | | TC-UI-09 | Маршрут OSRM на спутнике | SKIP (no runner) | | TC-UI-10 | Переключатель на мобильном (mobile viewport) | SKIP (no runner) | | TC-UI-11 | Активация «Спутник» на мобильном (mobile viewport) | SKIP (no runner) | | TC-UI-12 | Persistence: спутник после перезагрузки | SKIP (no runner) | | TC-UI-13 | GPX-панель + Спутник | SKIP (no runner) | | TC-UI-14 | Совместимость с переключателем единиц | SKIP (no runner) | **Это известный гэп инфраструктуры**, зафиксированный в: - `12-review.md` v2 — финальный пункт «Что делать дальше» п.4; - ADR-0001 ET-002 — Playwright-инфраструктура out of scope текущих фаз; - `07-infra-requirements.md` ET-007 — без новых требований к E2E инфраструктуре. Покрытие AC из `03-acceptance-criteria.md` обеспечено косвенно: | AC group | Гарантия | |-------------------------|-----------------------------------------------------------------------| | AC-01 (UI переключателя) | static HTML-тесты + smoke deployed HTML | | AC-02 (→Спутник) | JS-unit `applyBaseLayer('satellite')`, halo, POI paint, basemap-hide | | AC-03 (→Схема) | JS-unit `applyBaseLayer('schematic')`, `_savedBasemapState` restore | | AC-04 (совместимость) | JS-unit halo синхронизация + style.json layer-order | | AC-05 (persistence) | JS-unit U-02, U-03 | | AC-06 (смена темы) | static `rebuildMapOverlays`-test + JS-unit `restoreBaseLayerState` | | AC-07 (тулбар-режимы) | регрессионные suites ET-002/ET-005/ET-006 PASS | | AC-08 (производительность)| вне автоматизации — оценивается на ручной приёмке | | AC-09 (mobile UI) | вне автоматизации — оценивается на ручной приёмке | | AC-10 (регресс) | 76 pytest PASS — соседние фичи не сломаны | **Рекомендация:** перед `prod` deploy выполнить ручную приёмку на test-стенде по чек-листу TC-UI-01..14 (особенно TC-UI-07 «смена темы» и TC-UI-12 «persistence после reload» — наиболее чувствительные к рефакторингу). --- ## 6. Дефекты **P0/P1:** нет. **P2:** нет (P2-1..P2-4 из `12-review.md` — документационные/тестовые, не блокируют поставку, отмечены reviewer'ом как «APPROVED with comments»). **P3:** нет новых; P3-1..P3-4 из ревью остаются как nice-to-have. --- ## 7. Вердикт **PASS — stage:ready-to-deploy.** Обоснование: 1. Все 76 pytest и 33 JS-теста PASS, в т.ч. 28 целевых тестов ET-007. 2. Все 6 P1-блокеров review v1 закрыты в коде и тестами. 3. Test-стенд отдаёт корректные артефакты (HTML/JS/CSS/style.json). 4. Регресс по соседним фичам (ET-002 POI, ET-005 единицы, ET-006 GPX, barriers) не обнаружен. 5. Health endpoint test-стенда 200 OK. Перед prod-деплоем — рекомендуется ручной прогон TC-UI-01..14 на test-стенде (≤30 минут). Critical-path кейсы для ручной приёмки: TC-UI-02 (активация спутника), TC-UI-07 (смена темы), TC-UI-12 (persistence), TC-UI-10/11 (mobile).