Закрывает findings из docs/work-items/ET-011/12-review.md (REQUEST_CHANGES,
попытка 3/3):
P1-01 — добавлены поведенческие JS unit-тесты UI download-flow
- tests/web/track_download.test.js — 28 кейсов (node --test):
• _parseFilenameFromCD — RFC 5987 приоритет, plain fallback,
битый percent-encoding, null/empty (REQ-F-05.2, AC-2 UI)
• _handleDownloadError — 400/403/404/413/5xx тосты, defensive
при отсутствии showToast, поддержка flat (ADR-015 §G) и legacy
wrapped 403-форм (REQ-F-05.4, AC-7 UI)
• _renderTrackPopupHtml — наличие кнопки, aria-label «Скачать GPX»,
data-track-id, отсутствие при невалидном id, регрессия прочих
полей (REQ-F-01, AC-1)
- tests/web/test_track_download.py — pytest-обёртка (статические
проверки + запуск Node-раннера), исполняется в обычном pytest tests/
- 04b-ui-test-cases.md: AC-13 (mobile-bbox) явно маркирован как
MANUAL release-smoke (Playwright-раннер в проекте не настроен;
альтернатива согласована reviewer'ом в P1-01).
P2-01 — устранено расхождение «doc vs runtime» по контракту 403
- endpoint.py: HTTPException(detail={...}) → JSONResponse(content={...}),
чтобы FastAPI не оборачивал dict во второй слой «detail». Контракт
теперь совпадает с ADR-015 §G и ADR-014 §6:
{"detail":"source_forbidden","external_urls":[...]}
- test_gps_tracks_download.py IT-05: упрощено — body уже плоский,
без двухуровневого `body.get("detail", body)` workaround.
- gps_tracks.js::_handleDownloadError: flat-форма стала приоритетной,
wrapped-форма оставлена как defensive fallback (с комментарием).
Регрессия: 89/89 API-тестов + 24/24 предыдущих JS-тестов + 28 новых
JS-тестов download-flow проходят. ruff check — clean.
Refs: ET-011
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.9 KiB
UI Test Cases — ET-011: Скачивание трека из popup
Playwright-сценарии для визуальной проверки. Все запускаются на
https://openclaw.mva154.duckdns.org/enduro/.
Селекторы базируются на текущем DOM
src/web/index.htmlи popup'е, создаваемом вsrc/web/gps_tracks.js(_renderTrackPopupHtml). Когда architect/builder уточнит CSS-классы новой кнопки — обновить селекторы в этом файле.
Статус автоматизации (ET-011, после review 12-review.md / P1-01): Playwright-спека
tests/web/test_track_download.spec.tsиз test-plan §E2E-01..E2E-04 не реализована — в проекте нет настроенного Playwright-раннера. UI-сторона AC-1 / AC-2 / AC-7 закрыта поведенческими JS unit-тестамиtests/web/track_download.test.js(28 кейсов,node --test, обёрнуто pytest'ом). AC-13 (mobile bbox / тапабельность кнопки ≥ 32×32 CSS px на 375×667) — ручной smoke перед каждым релизом; сценарий — TC-UI-02 ниже (+ TC-UI-05 для проверки реального download).
TC-UI-01 — Кнопка «Скачать» в popup трека (desktop)
Тип: ui Viewport: desktop (1280×800)
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 5000
- click: #terrain-toggle
- wait: 500
- click: #public-tracks-cb
- wait: 4000
- screenshot: 01-public-tracks-enabled
- check-visual: слой публичных треков отрисован (видны цветные линии на карте)
- click: #map (в точке, где есть трек — координаты подобрать вручную/программно)
- wait: 1500
- screenshot: 02-track-popup-opened
- check-visual: появилось всплывающее окно
.maplibregl-popupс классом.track-popupвнутри, видны название, активность, длина - check-visual: внутри popup присутствует кнопка/иконка «Скачать» с aria-label="Скачать GPX"
- screenshot: 03-popup-with-download-button
TC-UI-02 — Popup и кнопка на мобильном (AC-13, MANUAL release-smoke)
Тип: ui (manual smoke — единственное покрытие AC-13) Viewport: mobile (375×667) Когда: перед каждым деплоем в test/prod, оператором — DevTools или устройство с тем же viewport.
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 5000
- click: #terrain-toggle
- wait: 500
- click: #public-tracks-cb
- wait: 4000
- click: #map (тап в координате трека)
- wait: 1500
- screenshot: mobile-popup
- check-visual: popup помещается в ширину viewport (≤ 375px), не обрезан
- check-visual: кнопка «Скачать» видна без скролла внутри popup
- check-visual: bounding box кнопки «Скачать» ≥ 32×32 CSS px
TC-UI-03 — Тёмная тема: контраст кнопки
Тип: ui Viewport: desktop
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 5000
- check-visual: body имеет класс
theme-dark - click: #terrain-toggle
- click: #public-tracks-cb
- wait: 4000
- click: #map (тап в координате трека)
- wait: 1500
- screenshot: dark-popup-with-download
- check-visual: иконка «Скачать» имеет читаемый контраст на тёмном фоне popup (текст / стрелка видна, не сливается с фоном)
TC-UI-04 — Светлая тема: контраст кнопки
Тип: ui Viewport: desktop
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 5000
- click: #btn-theme
- wait: 500
- check-visual: body НЕ имеет класса
theme-dark(или имеетtheme-light) - click: #terrain-toggle
- click: #public-tracks-cb
- wait: 4000
- click: #map (тап в координате трека)
- wait: 1500
- screenshot: light-popup-with-download
- check-visual: иконка «Скачать» читаема в светлой теме
TC-UI-05 — Скачивание срабатывает (e2e download event)
Тип: ui Viewport: desktop
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 5000
- click: #terrain-toggle
- click: #public-tracks-cb
- wait: 4000
- click: #map (тап в координате трека)
- wait: 1500
- Подготовить page.waitForEvent('download') ДО клика на кнопку
- click: кнопка «Скачать» внутри
.maplibregl-popup .track-popup(точный селектор — после Architecture, например.track-popup-download-btnилиbutton[aria-label="Скачать GPX"]) - screenshot: download-triggered
- check-visual: download event получен,
download.suggestedFilename()заканчивается на.gpx - check-visual: файл сохранён, размер > 100 байт, начинается с
<?xml
TC-UI-06 — Popup не «прыгает» из-за кнопки
Тип: ui Viewport: desktop
Шаги:
- Открыть popup трека (как в TC-UI-01).
- wait: 500
- Снять bbox popup (getBoundingClientRect через JS).
- wait: 1500
- Снять bbox повторно.
- check-visual: размеры popup не меняются (нет «дёрганий» из-за поздно подгруженного контента кнопки).
TC-UI-07 — Регрессия: остальные элементы popup остались
Тип: ui Viewport: desktop
Шаги:
- Открыть popup трека.
- screenshot: regression-popup
- check-visual: видны все исторические поля
- название трека
- строка с иконкой активности и лейблом
- строка
📏 X.X км · N точек - дата (если есть)
- пользователь (если есть)
- блок «Источники: …» (если есть)
- check-visual: новая кнопка «Скачать» добавлена, но не вытеснила/не заместила другие поля
TC-UI-08 — Регрессия: панель sheet-gpx и downloadGPX маршрута
Тип: ui Viewport: desktop
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 5000
- click: #tb-gpx
- wait: 500
- screenshot: regression-sheet-gpx
- check-visual: панель
#sheet-gpxоткрывается как раньше, заголовок «GPX-треки», текст-подсказка о загрузке. - closeAllSheets via tap on backdrop
- click: #tb-route
- wait: 500
- screenshot: regression-sheet-route
- check-visual: панель
#sheet-routeоткрывается, кнопка-иконка «Скачать GPX» (для маршрута) присутствует и работает как прежде.
Примечания по селекторам
Конкретные классы / id новой кнопки внутри popup трека определит architect / builder. В качестве разумных рабочих имён предлагаются:
button.track-popup-download-btnили.track-popup .track-popup-actions button[aria-label="Скачать GPX"]
После Architecture стадии обновить селекторы в этом файле.