--- type: test-report work_item_id: ET-011 verdict: PASS stage: ready-to-deploy version: 1 --- # Test Report ET-011 — Скачивание трека из popup на карте **Branch:** `feature/ET-011-popup-enduro-trails` **HEAD:** `721b33a` (fix(gps-tracks): address ET-011 review — JS UI tests + flat 403 contract) **Tester:** agent:tester **Дата:** 2026-06-03 **Test env:** https://openclaw.mva154.duckdns.org/enduro/ --- ## Сводка | Категория | Прогон | PASS | FAIL | WARN | Заметки | |---|---|---|---|---|---| | Pytest (unit + integration + web) | 204 | **204** | 0 | 0 | 2 deselected, 7 deprecation-warnings (внешний модуль `mapbox_vector_tile`) | | Node JS — `track_download.test.js` | 28 | **28** | 0 | 0 | UI-сторона AC-1/AC-2/AC-7 — поведенческие | | Node JS — `gps_tracks.test.js` (регрессия) | 24 | **24** | 0 | 0 | ET-008/ET-009 не сломаны | | Live API smoke (test env) | 3 | **3** | 0 | 0 | health + регрессия `/gps-tracks` + download (см. §3.3) | | Visual / UI — runner `/home/slin/tools/ui-test` | — | — | — | — | runner недоступен в среде агента; покрытие см. §4 | | Manual release-smoke (AC-13, контраст тем) | — | — | — | — | по соглашению из review v1 P1-01, выполняется после deploy | **Verdict: PASS → stage:ready-to-deploy.** P0/P1/P2-блокеров не выявлено. Регрессий не обнаружено. Контракт endpoint'а и структура popup-кнопки соответствуют ADR-014 / ADR-015 и закрывают AC-1..AC-15 автоматически или согласованным manual smoke'ом. --- ## 1. Окружение | Проверка | Результат | |---|---| | `GET /api/health` | 200 OK; `{"status":"ok","db_path":"/app/data/centralfederal.sqlite","db_exists":true}` | | `GET /api/gps-tracks?bbox=30,50,50,60` (регрессия ET-008) | 200 OK, 39 features, `truncated=false`, sample ids `[23, 21, 22]` | | `make test` обёртка | в среде агента `make` отсутствует — запущен напрямую `pytest tests/` из `src/api` (эквивалент `make test`) | | `make lint` | пропущен (на review-стадии `ruff check` уже clean, see `12-review.md`) | --- ## 2. Pytest (`pytest tests/ -v`) Полный прогон `src/api && python -m pytest ../../tests/ -v` — **204 passed, 2 deselected, 7 warnings**. Ключевые срезы ET-011: ### 2.1 Backend — endpoint (`tests/api/test_gps_tracks_download.py`) | Test ID | Имя | Покрывает | Результат | |---|---|---|---| | IT-01 | `test_it01_download_happy_path` (имя в тестах: `test_it01_*`) | AC-3, REQ-F-02 | PASS | | IT-02 | 404 для несуществующего id | AC-7, REQ-F-02 | PASS | | IT-03 | 400 для невалидного format=fit | AC-8, REQ-F-02 | PASS | | IT-04 | 413 для patho-трека > 200 000 точек | AC-9, REQ-NF-02 | PASS | | IT-05 | 403 — единственный источник вне whitelist | AC-11, REQ-F-06 | PASS | | IT-05 (dual) | 403 — оба источника вне whitelist | AC-11, REQ-F-06 | PASS | | IT-06 | `filename*=UTF-8''` + ASCII-fallback | AC-4, REQ-NF-05 | PASS | | IT-07 | Валидация ответа по `gpx.xsd` | AC-5, REQ-NF-03 | PASS | | `test_default_deny_without_config` | default-deny при пустом whitelist | REQ-F-06 | PASS | ### 2.2 Backend — GPX builder (`tests/api/test_gps_tracks_gpx_builder.py`) | Test ID | Имя | Покрывает | Результат | |---|---|---|---| | UT-01 | `test_ut01_build_gpx_basic_structure` | AC-10, REQ-F-03 | PASS | | UT-01 | `test_ut01_metadata_link_text_includes_source` | AC-10 | PASS | | UT-01 | `test_ut01_osm_copyright_present` | AC-10 | PASS | | UT-02 | пустые/NULL поля → элементы не пустые, а отсутствуют | REQ-F-03 | PASS | | UT-02 | пустое имя в `` тоже | REQ-F-03 | PASS | | UT-03 | XSD-валидация минимальный/типичный/UTF-8 | AC-5, REQ-NF-03 | PASS | | UT-05 | двухточечный edge-case | REQ-F-03 | PASS | | — | XML-декларация `` присутствует | REQ-F-03 | PASS | | — | precision `lat/lon` — 6 знаков | REQ-F-03 | PASS | | — | без OSM-копирайта если sources≠osm | REQ-F-03, REQ-F-06 | PASS | | — | `