# Test Plan — ET-001: Чекбокс показа/скрытия POI в кнопке рельефа
# ВНИМАНИЕ: функциональность уже поставлена в ET-002. Этот план —
# верификация/регрессия существующей реализации + проверка одной новой
# дельты (подпись «Показывать POI», REQ-F-01). UI-кейсы — в 04b-ui-test-cases.md.
# Среда e2e/ui: https://openclaw.mva154.duckdns.org/enduro/

work_item: ET-001
version: 3
relates_to: ET-002
related_acs: [AC-01, AC-02, AC-03, AC-04, AC-05, AC-06, AC-07, AC-08, AC-09, AC-10]

tests:

  # ─── Unit (frontend, JS) ────────────────────────────────────────────
  - id: TC-U-01
    type: unit
    layer: frontend
    title: applyPoiVisibility(false) скрывает слои POI и синхронизирует layerState
    target: src/web/app.js :: applyPoiVisibility
    given: |
      JSDOM/мок map с методами getLayer (true для poi-circles, poi-labels)
      и setLayoutProperty (spy). layerState.poi = true.
    when: |
      Вызвать applyPoiVisibility(false).
    then: |
      - setLayoutProperty вызван для 'poi-circles' и 'poi-labels' со
        значением 'none'.
      - layerState.poi === false.
    covers: [REQ-F-04, REQ-NF-03, AC-03, AC-08]

  - id: TC-U-02
    type: unit
    layer: frontend
    title: onPoiCheckbox пишет localStorage и применяет видимость
    target: src/web/app.js :: onPoiCheckbox
    given: |
      JSDOM с #poi-visible-cb; spy на localStorage.setItem и
      applyPoiVisibility.
    when: |
      Снять чекбокс (checked=false) и вызвать onPoiCheckbox();
      затем отметить (checked=true) и вызвать снова.
    then: |
      - localStorage['poi-visible'] === '0', applyPoiVisibility(false).
      - localStorage['poi-visible'] === '1', applyPoiVisibility(true).
    covers: [REQ-F-04, REQ-F-05, REQ-F-06, AC-03, AC-04, AC-05]

  - id: TC-U-03
    type: unit
    layer: frontend
    title: restorePoiState — дефолт «видимы» при отсутствии ключа
    target: src/web/app.js :: restorePoiState
    given: |
      localStorage без ключа 'poi-visible'; #poi-visible-cb в DOM.
    when: |
      Вызвать restorePoiState().
    then: |
      - #poi-visible-cb.checked === true.
      - applyPoiVisibility(true) (слои POI видимы).
    covers: [REQ-F-03, AC-02]

  - id: TC-U-04
    type: unit
    layer: frontend
    title: restorePoiState — восстановление «скрыто» из localStorage
    target: src/web/app.js :: restorePoiState
    given: |
      localStorage['poi-visible'] === '0'; #poi-visible-cb в DOM.
    when: |
      Вызвать restorePoiState() (имитация загрузки/смены темы).
    then: |
      - #poi-visible-cb.checked === false.
      - слои POI скрыты (visibility 'none').
    covers: [REQ-F-06, REQ-F-07, AC-05, AC-07]

  - id: TC-U-05
    type: unit
    layer: frontend
    title: Подпись чекбокса равна «Показывать POI» (новая дельта)
    target: tests/unit/test_poi_toggle.py:54 :: подпись #poi-visible-cb
    given: |
      Существующий регресс-тест ET-002 test_poi_toggle.py строкой 54
      проверяет `assert "<span>POI</span>" in html`. Это и есть тест,
      который фиксирует текст подписи (НЕ JS-тест poi_toggle.test.js —
      тот проверяет только поведенческий блок).
    when: |
      Применена правка index.html:88 (<span>Показывать POI</span>) и
      ожидание теста обновлено на `<span>Показывать POI</span>`.
    then: |
      Ассерт строки 54 проходит на новой подписи.
    note: |
      ДО правки кейс обязан падать (сейчас в HTML «<span>POI</span>»).
      Обновлять index.html:88 и test_poi_toggle.py:54 СТРОГО в одном
      коммите, иначе make test красный.
    covers: [REQ-F-01, AC-01, AC-09]

  # ─── Unit (python, регресс серверного контракта) ────────────────────
  - id: TC-U-06
    type: unit
    layer: backend
    title: Серверная отдача слоя POI в MVT не изменилась
    target: tests/unit/test_poi_toggle.py (регресс ET-002)
    given: |
      Существующий python-тест, фиксирующий, что видимость POI —
      клиентская и /api/tiles по-прежнему включает слой 'poi'.
    when: |
      make test.
    then: |
      Тест зелёный; контракт MVT (layer 'poi') не тронут.
    covers: [REQ-NF-02, AC-10]

  # ─── Integration (DOM) ──────────────────────────────────────────────
  - id: TC-I-01
    type: integration
    layer: frontend
    title: Чекбокс POI присутствует в #terrain-popup и связан с обработчиком
    given: |
      Полный DOM из src/web/index.html.
    when: |
      Найти #poi-visible-cb внутри #terrain-popup.
    then: |
      - Элемент существует, имеет атрибут onchange="onPoiCheckbox()".
      - По умолчанию checked.
    covers: [REQ-F-02, REQ-F-03, AC-02]

  - id: TC-I-02
    type: integration
    layer: frontend
    title: Цикл скрыть→показать переключает visibility слоёв POI
    given: |
      Полный DOM + мок map (getLayer/setLayoutProperty).
    when: |
      Снять #poi-visible-cb → onPoiCheckbox(); затем отметить → onPoiCheckbox().
    then: |
      visibility 'poi-circles'/'poi-labels': none → visible.
    covers: [REQ-F-04, REQ-F-05, AC-03, AC-04]

  # ─── E2E / UI (Playwright-сценарии; детали — 04b-ui-test-cases.md) ──
  - id: TC-E-01
    type: e2e
    layer: ui
    title: Подпись «Показывать POI» и чекбокс включён по умолчанию
    env: test
    viewport: { width: 1440, height: 900 }
    expected: |
      #terrain-popup открыт; #poi-visible-cb checked; подпись
      «Показывать POI» в одну строку.
    covers: [AC-01, AC-02]
    reference: 04b-ui-test-cases.md :: TC-UI-01

  - id: TC-E-02
    type: e2e
    layer: ui
    title: Снятие чекбокса скрывает POI, установка возвращает
    env: test
    viewport: { width: 1440, height: 900 }
    expected: |
      После снятия маркеры POI исчезают; после повторной установки — видны.
    covers: [AC-03, AC-04]
    reference: 04b-ui-test-cases.md :: TC-UI-02, TC-UI-03

  - id: TC-E-03
    type: e2e
    layer: ui
    title: Состояние «скрыто» сохраняется после перезагрузки
    env: test
    viewport: { width: 1440, height: 900 }
    expected: |
      После reload POI скрыты, чекбокс снят.
    covers: [AC-05]
    reference: 04b-ui-test-cases.md :: TC-UI-04

  - id: TC-E-04
    type: e2e
    layer: ui
    title: Видимость POI устойчива к смене темы
    env: test
    viewport: { width: 1440, height: 900 }
    expected: |
      После #btn-theme POI остаются скрытыми, чекбокс снят.
    covers: [AC-07]
    reference: 04b-ui-test-cases.md :: TC-UI-05

  - id: TC-E-05
    type: e2e
    layer: ui
    title: Mobile — чекбокс «Показывать POI» виден целиком, работает
    env: test
    viewport: { width: 390, height: 844 }
    expected: |
      Попап помещается; подпись не обрезана; снятие скрывает POI.
    covers: [AC-01, AC-03]
    reference: 04b-ui-test-cases.md :: TC-UI-06

# ─── Вне scope ──────────────────────────────────────────────────────────
out_of_scope:
  - Разбивка POI по типам, отдельная кнопка POI, иконка-индикатор.
  - Изменение серверной агрегации POI (/api/recon, /api/scenic).
  - Производительность тайлов/роутинга.

# ─── Примечание ─────────────────────────────────────────────────────────
notes: |
  Поведенческая суть (TC-U-01..04, TC-I-*) уже покрыта unit-тестами
  ET-002 (tests/unit/poi_toggle.test.js, tests/unit/test_poi_toggle.py).
  Реальная новая проверка ET-001 — TC-U-05 / TC-E-01 (подпись).
  Playwright-инфраструктуры в репозитории нет (ET-002
  07-infra-requirements.md запрещает новые npm-пакеты) — e2e-кейсы
  исполняются вручную/визуально либо в существующем CI-раннере, если он
  появится.
