# 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 относительно кнопки «Рельеф». - Производительность тайлов / роутинга.