"""ET-002 — тесты чекбокса показа/скрытия POI в попапе рельефа.
Изменение ET-002 — исключительно фронтендовое (`src/web/index.html`,
`src/web/app.js`). В CI исполняется только `pytest tests/`, поэтому файл
покрывает фичу двумя способами:
1. Статические проверки структуры `index.html` и `app.js` — выполняются
всегда, без внешних зависимостей.
2. Поведенческие JS unit-тесты (TP-01..TP-04 из `04-test-plan.yaml`) —
запускаются через встроенный тест-раннер Node (`node --test`). Если
`node` в системе отсутствует — эта часть помечается `skip` (по аналогии
с `tests/integration/test_routing_barriers.py::test_lua_syntax` и
`luac`).
Браузерные e2e-сценарии (TP-05..TP-09) требуют Playwright-инфраструктуры,
которой в репозитории нет; добавление новых npm-пакетов запрещено
`07-infra-requirements.md`. Их поведенческая суть покрыта JS unit-тестами
и статическими проверками ниже.
"""
from __future__ import annotations
import subprocess
from pathlib import Path
from shutil import which
import pytest
REPO_ROOT = Path(__file__).resolve().parents[2]
INDEX_HTML = REPO_ROOT / "src" / "web" / "index.html"
APP_JS = REPO_ROOT / "src" / "web" / "app.js"
JS_TEST = REPO_ROOT / "tests" / "unit" / "poi_toggle.test.js"
def _index_html() -> str:
assert INDEX_HTML.is_file(), f"не найден {INDEX_HTML}"
return INDEX_HTML.read_text(encoding="utf-8")
def _app_js() -> str:
assert APP_JS.is_file(), f"не найден {APP_JS}"
return APP_JS.read_text(encoding="utf-8")
# ──────────────────────────────────────────────────────────────────────────────
# Статические проверки index.html (REQ-F-01, UI-спецификация)
# ──────────────────────────────────────────────────────────────────────────────
def test_poi_checkbox_present_in_html():
"""REQ-F-01: чекбокс POI присутствует в попапе с корректными атрибутами."""
html = _index_html()
assert 'id="poi-visible-cb"' in html, "нет чекбокса poi-visible-cb"
assert 'onchange="onPoiCheckbox()"' in html, "чекбокс не привязан к onPoiCheckbox()"
assert "POI" in html, "нет подписи «POI»"
def test_poi_checkbox_checked_by_default():
"""REQ-F-02: чекбокс POI отрисован как checked (POI видны по умолчанию)."""
html = _index_html()
# Атрибут checked должен стоять именно на инпуте poi-visible-cb.
start = html.index('id="poi-visible-cb"')
tag_end = html.index(">", start)
assert "checked" in html[start:tag_end], "у чекбокса POI нет атрибута checked"
def test_poi_checkbox_placed_after_trails_separated_by_hr():
"""REQ-F-01: чекбокс POI стоит после «Тропы» и отделён
."""
html = _index_html()
trails_pos = html.index('id="trails-path-cb"')
poi_pos = html.index('id="poi-visible-cb"')
assert poi_pos > trails_pos, "POI должен идти после чекбокса «Тропы»"
between = html[trails_pos:poi_pos]
assert ""
def test_poi_checkbox_uses_shared_style_class():
"""UI-спецификация: чекбокс использует общий класс terrain-checkbox."""
html = _index_html()
start = html.index('id="poi-visible-cb"')
label_start = html.rfind("