# Test Plan — ET-014
# Z-index fix: панель «Фильтры» должна открываться поверх панели слоёв.
# Все тесты ориентированы на test-среду: https://openclaw.mva154.duckdns.org/enduro/

work_item: ET-014
related_acs: [AC-01, AC-02, AC-03, AC-04, AC-05, AC-06, AC-07, AC-08, AC-09, AC-10, AC-11, AC-12, AC-13, AC-14]

tests:

  # ─── Unit ──────────────────────────────────────────────────────────
  - id: TC-U-01
    type: unit
    layer: frontend
    title: togglePublicTracksFiltersSheet корректно открывает/закрывает sheet
    target: src/web/gps_tracks.js :: togglePublicTracksFiltersSheet
    given: |
      JSDOM с минимальным DOM: #sheet-gps-filters, #terrain-popup,
      #sheet-backdrop, мок openSheet/closeAllSheets.
    when: |
      Вызвать togglePublicTracksFiltersSheet() дважды подряд.
    then: |
      - Первый вызов: openSheet('sheet-gps-filters') вызван 1 раз;
        _buildGpsFiltersUI вызван.
      - Второй вызов: closeAllSheets() вызван 1 раз.
    covers: [REQ-F-04]

  - id: TC-U-02
    type: unit
    layer: frontend
    title: При открытии sheet-gps-filters состояние terrain-popup корректно
    target: src/web/gps_tracks.js или общий хук в src/web/app.js
    given: |
      JSDOM: #terrain-popup со style.display='block' и #terrain-toggle.classList
      содержит 'active'. #sheet-gps-filters существует.
    when: |
      Вызвать togglePublicTracksFiltersSheet() при открытом popup'е.
    then: |
      В зависимости от выбранного варианта решения:
        - Вариант A: popup.style.display === 'none', terrain-toggle без 'active'.
        - Вариант B/C: popup может оставаться открытым, но stacking-tests
          ниже (TC-I-01) обязаны быть зелёными.
    covers: [REQ-F-01, REQ-F-02]

  # ─── Integration / DOM ─────────────────────────────────────────────
  - id: TC-I-01
    type: integration
    layer: frontend
    title: Stacking — sheet-gps-filters визуально выше terrain-popup
    given: |
      Полный DOM из src/web/index.html, app.css загружен, jsdom + getComputedStyle
      или Playwright страница. terrain-popup открыт, sheet-gps-filters открыт.
    when: |
      Получить элемент в центре области #sheet-gps-filters через
      document.elementFromPoint(x, y).
    then: |
      Возвращённый элемент принадлежит #sheet-gps-filters (или его потомкам),
      НЕ принадлежит #terrain-popup.
    covers: [REQ-F-01, AC-01, AC-02]

  - id: TC-I-02
    type: integration
    layer: frontend
    title: Stacking — marker-dialog поверх всего сохраняется
    given: |
      Полный DOM. marker-dialog открыт (style.display: flex), параллельно
      моделируем «грязное» состояние (terrain-popup открыт).
    when: |
      document.elementFromPoint в координатах кнопки внутри marker-dialog.
    then: |
      Элемент принадлежит #marker-dialog.
    covers: [REQ-NF-03, AC-10]

  - id: TC-I-03
    type: integration
    layer: frontend
    title: Stacking — search-panel и ruler-info остаются на верху (z=600)
    given: |
      Полный DOM, search-panel.display=block или ruler-info видим.
    when: |
      elementFromPoint в центре панели.
    then: |
      Возвращённый элемент принадлежит соответствующей панели,
      НЕ перекрывается ни sheet'ом, ни terrain-popup.
    covers: [REQ-NF-03, AC-11, AC-12]

  - id: TC-I-04
    type: integration
    layer: frontend
    title: Закрытие sheet-gps-filters через closeAllSheets очищает состояние
    given: |
      sheet-gps-filters.open, sheet-backdrop.visible.
    when: |
      Вызвать closeAllSheets().
    then: |
      - sheet-gps-filters без класса 'open'.
      - sheet-backdrop без класса 'visible'.
      - Никаких inline стилей-«артефактов» (например, лишних z-index, opacity).
    covers: [REQ-F-03, AC-04]

  # ─── E2E (Playwright; см. также 04b-ui-test-cases.md) ──────────────
  - id: TC-E-01
    type: e2e
    layer: ui
    title: Mobile — открыть фильтры публичных треков из панели слоёв
    env: test
    viewport: { width: 390, height: 844 }
    steps_summary: |
      open / wait map / click #terrain-toggle / click #public-tracks-cb /
      click #public-tracks-filters-btn / assert sheet visible & on top
    expected: |
      sheet-gps-filters имеет class 'open'; visually центр sheet'а не
      перекрыт terrain-popup (elementFromPoint).
    covers: [AC-01, AC-03, AC-14]
    reference: 04b-ui-test-cases.md :: TC-UI-01

  - id: TC-E-02
    type: e2e
    layer: ui
    title: Desktop — фильтры открываются слева, terrain-popup не перекрывает
    env: test
    viewport: { width: 1440, height: 900 }
    expected: |
      sheet-gps-filters виден слева (≈380px), terrain-popup не перекрывает.
    covers: [AC-02]
    reference: 04b-ui-test-cases.md :: TC-UI-02

  - id: TC-E-03
    type: e2e
    layer: ui
    title: Закрытие фильтров кнопкой ✕ возвращает к карте
    env: test
    viewport: { width: 390, height: 844 }
    expected: |
      Нет видимых частей sheet'а или backdrop'а после клика по ✕.
    covers: [AC-04]
    reference: 04b-ui-test-cases.md :: TC-UI-03

  - id: TC-E-04
    type: e2e
    layer: ui
    title: Повторное открытие/закрытие фильтров стабильно
    env: test
    viewport: { width: 390, height: 844 }
    expected: |
      После 3 циклов open/close — DOM-классы консистентны, sheet
      продолжает открываться поверх terrain-popup.
    covers: [AC-06]
    reference: 04b-ui-test-cases.md :: TC-UI-04

  - id: TC-E-05
    type: e2e
    layer: ui
    title: Регрессия — открыть остальные bottom-sheets, проверить отображение
    env: test
    viewport: { width: 390, height: 844 }
    expected: |
      sheet-route, sheet-recon, sheet-scenic, sheet-link, sheet-gpx —
      каждый открывается, виден, закрывается.
    covers: [AC-09]
    reference: 04b-ui-test-cases.md :: TC-UI-05

  - id: TC-E-06
    type: e2e
    layer: ui
    title: Светлая тема — сценарий открытия фильтров
    env: test
    viewport: { width: 390, height: 844 }
    theme: light
    expected: |
      Sheet поверх terrain-popup, всё видно, контраст корректный.
    covers: [AC-13]
    reference: 04b-ui-test-cases.md :: TC-UI-06

# ─── Не входит ────────────────────────────────────────────────────────
out_of_scope:
  - Тесты бизнес-логики фильтров (это покрывается ET-008/ET-009).
  - Тесты позиционирования terrain-popup относительно кнопки «Рельеф».
  - Производительность тайлов / роутинга.
