14 KiB
type, work_item_id, version, status, tester, date, commit_tested, verdict
| type | work_item_id | version | status | tester | date | commit_tested | verdict |
|---|---|---|---|---|---|---|---|
| test-report | ET-002 | 1 | pass | agent:tester | 2026-05-21 | 8c17a4f |
PASS |
Test Report — ET-002
Verdict: PASS → stage:ready-to-deploy
Полный регресс зелёный: 14 passed, 4 skipped, 0 failed, lint чистый, JS-юнит-тесты POI 7/7 pass, тест-окружение отвечает 200. Блокирующих багов (P0/P1) не найдено.
Тест-кейсы TP-01..TP-04 и TP-08 из 04-test-plan.yaml исполнены и
прошли. e2e-кейсы TP-05..TP-07, TP-09 не исполнялись — в репозитории
нет Playwright-инфраструктуры, а 07-infra-requirements.md §6 запрещает
новые npm-пакеты (конфликт двух approved-артефактов, зафиксирован
reviewer'ом как R-01/P2). Поведенческая суть этих сценариев покрыта
unit- и статическими тестами. На merge/деплой ET-002 не влияет.
Окружение
- Дата прогона: 2026-05-21
- Ветка:
feature/ET-002-poi-toggle - Коммит:
8c17a4f(feat(web): add POI visibility checkbox to terrain popup; взят из12-review.md—gitв окружении тестера недоступен) - Python: 3.12.13
- pytest: 8.3.3 (plugins: asyncio-1.3.0, anyio-4.13.0)
- Node: v22.22.2 (
node --test) - ruff: 0.15.14
- test-env: https://openclaw.mva154.duckdns.org/enduro/ → HTTP 200
Healthcheck
| Среда | URL | Код |
|---|---|---|
| local dev | http://localhost:5556/health | connection refused (dev не поднят — ОК, прогон оффлайн) |
| test | https://openclaw.mva154.duckdns.org/enduro/ | 200 |
| test API | https://openclaw.mva154.duckdns.org/enduro/api/health | 200 {"status":"ok","db_exists":true} |
ET-002 — фронтенд-изменение; в test задеплоен main, поэтому healthcheck
подтверждает только живость окружения, а не наличие фичи (фича попадёт
в test штатной перевыкладкой после merge).
Команды запуска
# Unit + integration (эквивалент make test)
python -m pytest tests/ -v
# JS behavioral unit-тесты POI (TP-01..TP-04)
node --test tests/unit/poi_toggle.test.js
# Lint
ruff check src/
ruff check tests/
Результаты pytest
python -m pytest tests/ -v → 14 passed, 4 skipped, 1 warning in 0.51s
| # | Тест | Тип | Результат |
|---|---|---|---|
| 1 | test_routing_barriers.py::test_lua_syntax |
unit (структура lua) | PASS |
| 2 | test_routing_barriers.py::test_blocked_barriers_match_trz |
static AC | PASS |
| 3 | test_routing_barriers.py::test_excluded_highways_match_trz |
static AC | PASS |
| 4 | test_routing_barriers.py::test_route_avoids_barrier |
integration | SKIP (OSRM недоступен) |
| 5 | test_routing_barriers.py::test_route_no_footway |
integration | SKIP (OSRM недоступен) |
| 6 | test_routing_barriers.py::test_route_allows_cattle_grid |
integration | SKIP (OSRM недоступен) |
| 7 | test_routing_barriers.py::test_existing_route_works |
regression | SKIP (OSRM недоступен) |
| 8 | test_health.py::test_health_endpoint |
unit (async) | PASS |
| 9 | test_poi_toggle.py::test_poi_checkbox_present_in_html |
static (REQ-F-01) | PASS |
| 10 | test_poi_toggle.py::test_poi_checkbox_checked_by_default |
static (REQ-F-02) | PASS |
| 11 | test_poi_toggle.py::test_poi_checkbox_placed_after_trails_separated_by_hr |
static (REQ-F-01) | PASS |
| 12 | test_poi_toggle.py::test_poi_checkbox_uses_shared_style_class |
static (UI-спец) | PASS |
| 13 | test_poi_toggle.py::test_poi_functions_defined |
static (ADR-0001) | PASS |
| 14 | test_poi_toggle.py::test_poi_logic_uses_localstorage_key |
static (REQ-F-05) | PASS |
| 15 | test_poi_toggle.py::test_poi_logic_reuses_layer_state_and_groups |
static (ADR п.3-4) | PASS |
| 16 | test_poi_toggle.py::test_restore_poi_state_wired_into_init |
static (REQ-F-06) | PASS |
| 17 | test_poi_toggle.py::test_poi_visibility_toggled_via_set_layout_property |
static (ADR п.1) | PASS |
| 18 | test_poi_toggle.py::test_js_unit_tests_pass |
behavioral (Node-раннер) | PASS |
4 SKIP — интеграционные тесты роутинга ET-001; требуют поднятого OSRM
(OSRM_URL, по умолчанию http://172.22.0.1:5559), который в окружении
тестера недоступен. Это штатное поведение (test_routing_barriers.py
помечает их skip, чтобы CI без инфраструктуры не падал). ET-002 —
фронтенд-изменение, на роутинг влиять не может; к регрессу не относится.
Предупреждение PendingDeprecationWarning из starlette/formparsers.py —
внешняя зависимость, к ET-002 отношения не имеет, не блокирует.
Результаты JS unit-тестов (TP-01..TP-04)
node --test tests/unit/poi_toggle.test.js → # pass 7, # fail 0
Тесты исполняют реальный код POI-блока из src/web/app.js (блок
извлекается по маркерам ET-002 POI visibility block и оборачивается
через new Function с инъекцией моков).
| Тест | TC | Результат |
|---|---|---|
снятый чекбокс скрывает слои POI и сохраняет 0 |
TP-01 | PASS |
установленный чекбокс показывает слои POI и сохраняет 1 |
TP-02 | PASS |
restorePoiState() при poi-visible=0 скрывает POI |
TP-03 | PASS |
restorePoiState() без ключа включает POI по умолчанию |
TP-04 | PASS |
restorePoiState() при poi-visible=1 показывает POI |
доп. | PASS |
onPoiCheckbox() меняет только poi-circles/poi-labels |
доп. (дух TP-08) | PASS |
applyPoiVisibility() синхронизирует layerState без слоёв |
доп. | PASS |
Результаты lint
| Команда | Результат |
|---|---|
ruff check src/ |
All checks passed! |
ruff check tests/ |
All checks passed! |
Покрытие тест-плана (04-test-plan.yaml)
| TC | Тип | Исполнение | Статус |
|---|---|---|---|
| TP-01 | unit | JS-тест «TP-01» (через test_js_unit_tests_pass) |
PASS |
| TP-02 | unit | JS-тест «TP-02» | PASS |
| TP-03 | unit | JS-тест «TP-03» | PASS |
| TP-04 | unit | JS-тест «TP-04» | PASS |
| TP-05 | e2e | BLOCKED (нет Playwright). Покрыто статически: test_poi_checkbox_present_in_html, test_poi_checkbox_placed_after_trails_separated_by_hr |
COVERED (alt) |
| TP-06 | e2e | BLOCKED (нет Playwright). Покрыто поведенчески: JS «TP-01»/«TP-02», «меняет только poi-circles/poi-labels» | COVERED (alt) |
| TP-07 | e2e | BLOCKED (нет Playwright). Покрыто поведенчески: JS «TP-03» (restorePoiState при poi-visible=0) |
COVERED (alt) |
| TP-08 | integration | JS «onPoiCheckbox() меняет только слои poi-circles и poi-labels» — изоляция чужих слоёв подтверждена | PASS (alt) |
| TP-09 | e2e | BLOCKED (нет Playwright). Класс terrain-checkbox подтверждён статически; по touch-target см. P3-2 |
PARTIAL |
Исполнено и пройдено: TP-01..TP-04, TP-08 (5/9). e2e TP-05..TP-07, TP-09 (4/9) — заблокированы инфраструктурой, их поведение покрыто unit/статикой. Прямой инструментальной проверки в реальном браузере не было.
Соответствие Acceptance Criteria
| AC | Описание | Источник проверки | Статус |
|---|---|---|---|
| AC-01 | Чекбокс в попапе после «Тропы», отделён <hr> |
test_poi_checkbox_placed_after_trails_separated_by_hr |
PASS |
| AC-02 | POI включены по умолчанию | test_poi_checkbox_checked_by_default + JS «TP-04» |
PASS |
| AC-03 | Скрытие POI → visibility: none |
JS «TP-01» | PASS |
| AC-04 | Показ POI → visibility: visible |
JS «TP-02» | PASS |
| AC-05 | Состояние сохраняется после перезагрузки | JS «TP-03» (restorePoiState при poi-visible=0) |
PASS |
| AC-06 | Восстановление включённого состояния | JS «restorePoiState при poi-visible=1» | PASS |
| AC-07 | Не ломает существующие чекбоксы | JS «меняет только poi-circles/poi-labels»; HTML-изменения аддитивны | PASS |
| AC-08 | Синхронизация с layerState.poi |
JS «TP-01»/«TP-02» + «applyPoiVisibility без слоёв» | PASS |
Все 8 критериев имеют поведенческое покрытие; ни один не нарушен. Браузерная (e2e) проверка AC-01/03/04/05 ограничена отсутствием Playwright — поведение подтверждено на уровне реального кода POI-блока.
Найденные баги
P0 (блокирующие)
Нет.
P1 (критические)
Нет.
P2 (важные)
T-01 (= R-01 из 12-review.md) — e2e TP-05..TP-09 не исполнимы.
04-test-plan.yaml определяет TP-05..TP-09 как type: e2e, но
07-infra-requirements.md §6 запрещает новые npm-пакеты, а
Playwright-инфраструктуры в репозитории нет (проверено: нет
package.json, node_modules, бинаря playwright, npx). Это конфликт
двух approved-артефактов, а не дефект разработки. Поведение покрыто
unit/статикой.
Действие: Analyst — согласовать 04-test-plan.yaml с
07-infra-requirements.md (пометить TP-05..09 как покрытые альтернативно
либо завести инфра-задачу на Playwright). Merge/деплой ET-002 не
блокирует.
P3 (косметика / наблюдения)
- (= R-02 из
12-review.md)app.js:2849—const poiOn = stored === null || stored === '1';: нештатное значение ключаpoi-visibleтрактуется как «скрыть». Надёжнееstored !== '0'(деградация к дефолту «показать», REQ-F-02). Крайний кейс — ключ пишет только это приложение. Не блокирует. - REQ-NF-03 (touch target ≥ 44px) —
.terrain-checkbox(app.css:806) приpadding:8pxиfont-size:15pxдаёт высоту строки ≈ 35px, что ниже ориентира 44px. Однако чекбокс POI использует тот же класс, что и все соседние чекбоксы попапа (Тени/Перепады/Грунтовки/Тропы) — регрессии нет, кликабельна вся строка-<label>. Точная проверка на реальном устройстве (TP-09) невозможна без e2e. Если 44px критичны — это пред-существующий UX-вопрос ко всему попапу, отдельной задачей. Не блокирует ET-002. - Окружение тестера. Пакеты
shapely,mapbox-vector-tile,httpx(requirements.txt) иpytest-asyncio,ruff(pyproject.toml [dev]) не были предустановлены в песочнице — безshapelyпадал сборtest_health.py(импортsrc.api.main). Тестер доустановил их по манифестам проекта, после чего регресс прошёл полностью. Это дефект провижининга окружения, не дефект ET-002. CI обязан выполнятьpip install -r requirements.txtи.[dev]передmake test.
Замечания тестера
- Прогон выполнен против локального репозитория без поднятого dev-сервера
(
make testоффлайн). Backend не затронут (ET-002 — толькоsrc/web/). - Ручная сверка реализации:
index.html:56-60—<hr>+ чекбоксpoi-visible-cb(checked, классterrain-checkbox) сразу послеtrails-path-cb;app.js:2800-2854— POI-блок сapplyPoiVisibility,onPoiCheckbox,restorePoiState;restorePoiState()подключён в 3 точках восстановления (app.js:131, 2950, 2963). Соответствует ТЗ, ADR-0001 и выводам12-review.md. - Тесты не подгонялись под код; на prom ничего не запускалось.
Итог
Verdict: PASS → stage:ready-to-deploy.
Все исполнимые тест-кейсы (TP-01..04, TP-08), все 8 acceptance-критериев
и lint — зелёные; блокирующих (P0/P1) багов нет. Незакрытые e2e-кейсы
(TP-05..07, TP-09) заблокированы инфраструктурным конфликтом
approved-артефактов (T-01/P2) — действие на стороне Analyst, на ET-002
не влияет. Готово к штатной перевыкладке фронтенда в test/prom согласно
07-infra-requirements.md.