From 32c6939ef96749c53d221fdcf282a5fd28600e08 Mon Sep 17 00:00:00 2001 From: Stream Date: Mon, 4 May 2026 10:20:01 +0300 Subject: [PATCH] auto-sync: 2026-05-04 10:20:01 --- tasks/enduro-trails/BRD_PHASE3.md | 42 +- tasks/enduro-trails/TEST_CASES_PHASE3.md | 703 +++++++++++++++++++++++ 2 files changed, 726 insertions(+), 19 deletions(-) create mode 100644 tasks/enduro-trails/TEST_CASES_PHASE3.md diff --git a/tasks/enduro-trails/BRD_PHASE3.md b/tasks/enduro-trails/BRD_PHASE3.md index 6d4b2b3..c272a69 100644 --- a/tasks/enduro-trails/BRD_PHASE3.md +++ b/tasks/enduro-trails/BRD_PHASE3.md @@ -1,9 +1,9 @@ # BRD: Enduro Trails — Фаза 3 «Умный маршрут» -**Версия:** 1.0 +**Версия:** 1.1 **Дата:** 2026-05-04 **Автор:** Стрим 🌊 -**Статус:** На согласовании со Славой +**Статус:** Согласовано ✅ --- @@ -49,7 +49,7 @@ > Точки A и B близко, только один разумный путь. Система показывает 1–2 варианта и поясняет: «Альтернативных маршрутов не найдено». #### Требования -- Минимум 1 маршрут, максимум 5 +- Минимум 1 маршрут, максимум **5** (подтверждено Славой) - Варианты визуально различимы: разные цвета (палитра: синий, зелёный, фиолетовый, оранжевый, серый) - Активный (выбранный) маршрут — жирнее и ярче - Hover на карточке → подсветка маршрута на карте @@ -58,7 +58,7 @@ - Кнопка «Сбросить» убирает все маршруты и маркеры #### Технические заметки -OSRM поддерживает `alternatives=true` (до 3 вариантов) и `alternatives=N` (до 5). Параметр передаётся в запросе к `/route/v1/driving/`. Дополнительно можно варьировать `radiuses` и `snapping` для получения более разнообразных вариантов. +OSRM поддерживает `alternatives=true` (до 3 вариантов) и `alternatives=N` (до 5). Параметр передаётся в запросе к `/route/v1/driving/`. Дополнительно можно варьировать `radiuses` и `snapping` для получения более разнообразных вариантов. Запрашивать `alternatives=5` всегда — показывать сколько вернёт OSRM (от 1 до 5). --- @@ -164,7 +164,7 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и **UC-04.2 — Несколько точек** > Слава добавляет 3 промежуточные точки. Маршрут строится A→C1→C2→C3→B. В панели точек видны все 5 точек с возможностью удалить любую. -**UC-04.3 — Перетаскивание точки** +**UC-04.3 — Перетаскивание точки** ✅ (подтверждено) > Слава хочет немного сдвинуть промежуточную точку. Перетаскивает маркер на карте. Маршрут перестраивается в реальном времени (debounce 300ms). **UC-04.4 — Удаление точки** @@ -176,7 +176,7 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и #### Требования - Максимум 8 промежуточных точек (итого 10 точек включая A и B) - Маркеры промежуточных точек визуально отличаются от A/B (меньше, другой цвет — белый с цветной обводкой) -- Перестройка маршрута при перетаскивании — debounce 300ms +- Перестройка маршрута при перетаскивании — debounce 300ms (**обязательно**, подтверждено Славой) - Панель точек: список с иконками A, 1, 2, ..., B и кнопками удаления - При добавлении точки режим «добавить точку» активируется кнопкой, деактивируется после клика @@ -193,7 +193,7 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и #### Use Cases **UC-05.1 — Скачать маршрут** -> Слава выбрал маршрут. Нажимает «Скачать GPX». Браузер скачивает файл `enduro-route-2026-05-04.gpx`. Слава загружает его в OsmAnd. +> Слава выбрал маршрут. Нажимает «Скачать GPX». Браузер скачивает файл `enduro-route-2026-05-04.gpx`. Слава загружает его в OsmAnd. Файл содержит и трек (полная геометрия), и waypoints (метки + точки маршрута). **UC-05.2 — GPX с промежуточными точками** > Маршрут с 3 промежуточными точками. GPX содержит все waypoints + трек. В OsmAnd точки отображаются как промежуточные остановки. @@ -203,9 +203,11 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и #### Требования - GPX 1.1 формат -- Содержит: `` с геометрией маршрута + `` для всех точек (A, промежуточные, B) -- Метаданные: name, desc, time -- Генерация на фронте (из геометрии OSRM ответа) — не требует бэкенда +- Содержит **оба элемента** (подтверждено Славой): + - `` + `` — полная геометрия маршрута (все точки от OSRM) + - `` — точки A, промежуточные, B + все флажки/метки с карты +- Метаданные: name (`Enduro route YYYY-MM-DD`), desc (дистанция + % грунта), time +- Генерация на фронте (из геометрии OSRM ответа + localStorage меток) — не требует бэкенда - Кнопка «Скачать GPX» активна только когда маршрут выбран --- @@ -239,7 +241,7 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и > При скачивании GPX (F-05) метки включаются как `` с именами. #### Требования -- Хранение: localStorage, ключ `enduro_markers` +- Хранение: localStorage, ключ `enduro_markers` (**только браузер**, подтверждено Славой — синхронизация между устройствами не нужна) - Максимум 50 меток (предупреждение при достижении лимита) - Иконки: 🚩 (по умолчанию), ⛺, 🔧, ⛽, 💧, 📍 - Метки отображаются поверх всех слоёв @@ -314,7 +316,7 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и 4. Суммировать длины по типам: `highway_type` + `track_type` 5. Вернуть в ответе вместе с геометрией -> ⚠️ Расчёт статистики — приближённый (snap to nearest road). Точность ±5% — достаточно для принятия решения. +> ⚠️ Расчёт статистики — приближённый (snap to nearest road). Точность ±5% — **согласовано со Славой**, достаточно для принятия решения. --- @@ -386,14 +388,16 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и --- -## 7. Открытые вопросы для Славы +## 7. Решения (согласовано 2026-05-04) -1. **Количество альтернатив:** сколько вариантов хочешь видеть максимум? OSRM даёт до 5, но 3–4 обычно достаточно. -2. **Статистика — точность vs скорость:** расчёт по сегментам даёт ~5% погрешность, но быстро. Нужна точнее — будет медленнее. Устраивает приближение? -3. **Промежуточные точки — перетаскивание на карте:** нужно ли, или достаточно удалить + добавить заново? -4. **Флажки — синхронизация:** метки только в браузере (localStorage) или хочешь чтобы сохранялись на сервере (между устройствами)? -5. **GPX — треки или маршрут:** GPX может содержать трек (все точки геометрии) или маршрут (только waypoints для навигатора). Что нужно? Или оба варианта? +| # | Вопрос | Решение | +|---|--------|---------| +| 1 | Количество альтернатив | **5** — запрашивать максимум, показывать сколько вернёт OSRM | +| 2 | Точность статистики | **±5% ок** — приближённый расчёт по сегментам | +| 3 | Перетаскивание точек | **Нужно** — drag на карте с debounce 300ms | +| 4 | Синхронизация меток | **Только localStorage** — между устройствами не нужно | +| 5 | Формат GPX | **Трек + метки** — `` с геометрией и `` для всех точек и флажков | --- -*Документ готов к передаче Dev-агенту после согласования со Славой.* +*Документ согласован. Готов к передаче Dev-агенту.* diff --git a/tasks/enduro-trails/TEST_CASES_PHASE3.md b/tasks/enduro-trails/TEST_CASES_PHASE3.md new file mode 100644 index 0000000..d32b50e --- /dev/null +++ b/tasks/enduro-trails/TEST_CASES_PHASE3.md @@ -0,0 +1,703 @@ +# Test Cases: Enduro Trails — Фаза 3 «Умный маршрут» + +**Версия:** 1.0 +**Дата:** 2026-05-04 +**Автор:** Стрим 🌊 +**Статус:** Готов к ревью +**Связан с:** BRD_PHASE3.md + +--- + +## Соглашения + +- **Precondition** — состояние системы до теста +- **Steps** — шаги воспроизведения +- **Expected** — ожидаемый результат +- **Priority:** P1 (блокер) / P2 (важный) / P3 (желательный) +- **URL:** `https://openclaw.mva154.duckdns.org/enduro/` + +--- + +## TC-F03: Человекочитаемое время + +### TC-F03-01 — Время меньше часа +**Priority:** P1 +**Precondition:** Маршрут построен, OSRM вернул duration +**Input:** `duration_s = 2700` (45 минут) +**Expected:** отображается `45 мин` +**Not expected:** `2700`, `45`, `0 ч 45 мин` + +--- + +### TC-F03-02 — Ровно час +**Priority:** P1 +**Input:** `duration_s = 3600` +**Expected:** `1 ч` +**Not expected:** `1 ч 0 мин`, `60 мин` + +--- + +### TC-F03-03 — Часы и минуты +**Priority:** P1 +**Input:** `duration_s = 9300` (155 минут) +**Expected:** `2 ч 35 мин` +**Not expected:** `155 мин`, `2.58 ч` + +--- + +### TC-F03-04 — Ровно сутки +**Priority:** P2 +**Input:** `duration_s = 86400` +**Expected:** `1 дн` +**Not expected:** `24 ч`, `1 дн 0 ч` + +--- + +### TC-F03-05 — Больше суток +**Priority:** P2 +**Input:** `duration_s = 93600` (26 часов) +**Expected:** `1 дн 2 ч` +**Not expected:** `26 ч`, `1 дн 2 ч 0 мин` + +--- + +### TC-F03-06 — Дни, часы и минуты +**Priority:** P2 +**Input:** `duration_s = 165000` (2750 минут = 1 дн 21 ч 50 мин) +**Expected:** `1 дн 21 ч 50 мин` +**Not expected:** `2750 мин`, `45 ч 50 мин` + +--- + +### TC-F03-07 — Ноль секунд (граничный случай) +**Priority:** P3 +**Input:** `duration_s = 0` +**Expected:** `0 мин` +**Not expected:** ошибка, пустая строка, `NaN` + +--- + +### TC-F03-08 — Время применено везде +**Priority:** P1 +**Steps:** +1. Построить маршрут A→B +2. Проверить компактную карточку маршрута +3. Раскрыть карточку «Подробнее» +4. Проверить развёрнутую карточку + +**Expected:** во всех местах время в формате `X ч Y мин`, нигде нет «минут» как числа > 60 + +--- + +## TC-F01: Альтернативные маршруты + +### TC-F01-01 — Базовое построение альтернатив +**Priority:** P1 +**Precondition:** Карта открыта, маркеры A и B не установлены +**Steps:** +1. Кликнуть на карте — установить точку A (например, Москва) +2. Кликнуть на карте — установить точку B (например, Тверь, ~170 км) +3. Нажать кнопку «Дикий путь» 🗺️ + +**Expected:** +- На карте появляются 2–5 маршрутов разными цветами +- Каждый маршрут имеет свой уникальный цвет из палитры (синий, зелёный, фиолетовый, оранжевый, серый) +- Появляется панель с карточками вариантов +- Каждая карточка содержит: номер варианта, цветную точку, дистанцию, время, полоску покрытия + +--- + +### TC-F01-02 — Визуальное различие маршрутов +**Priority:** P1 +**Precondition:** Построены 3+ маршрута +**Expected:** +- Все маршруты видны на карте одновременно +- Цвета не повторяются +- Маршруты не сливаются визуально (разная толщина или прозрачность для неактивных) + +--- + +### TC-F01-03 — Hover на карточке подсвечивает маршрут +**Priority:** P2 +**Precondition:** Построены 3+ маршрута +**Steps:** +1. Навести мышь на карточку «Вариант 2» + +**Expected:** +- Маршрут варианта 2 на карте становится жирнее/ярче +- Остальные маршруты становятся тусклее +- При уходе мыши — возврат к исходному состоянию + +--- + +### TC-F01-04 — Выбор маршрута кликом на карточку +**Priority:** P1 +**Steps:** +1. Построить маршруты +2. Кликнуть на карточку «Вариант 3» + +**Expected:** +- Вариант 3 выделен в панели (рамка/фон) +- На карте вариант 3 отображается жирнее остальных +- Кнопка «Скачать GPX» становится активной + +--- + +### TC-F01-05 — Выбор маршрута кликом на линию карты +**Priority:** P2 +**Steps:** +1. Построить маршруты +2. Кликнуть на линию маршрута на карте + +**Expected:** +- Соответствующая карточка в панели выделяется +- Маршрут становится активным + +--- + +### TC-F01-06 — Только один маршрут (нет альтернатив) +**Priority:** P2 +**Precondition:** Точки A и B очень близко (< 5 км) или OSRM вернул 1 маршрут +**Expected:** +- Показывается 1 карточка +- Нет сообщения об ошибке +- Опционально: подпись «Альтернативных маршрутов не найдено» + +--- + +### TC-F01-07 — Кнопка «Сбросить» +**Priority:** P1 +**Precondition:** Построены маршруты, установлены маркеры A и B +**Steps:** +1. Нажать кнопку «Сбросить» + +**Expected:** +- Все маршруты исчезают с карты +- Маркеры A и B удалены +- Панель карточек скрывается +- Карта возвращается в исходное состояние + +--- + +### TC-F01-08 — Повторное построение маршрута +**Priority:** P1 +**Steps:** +1. Построить маршруты +2. Переставить точку B в другое место +3. Нажать «Дикий путь» снова + +**Expected:** +- Старые маршруты исчезают +- Появляются новые маршруты для новых точек +- Нет задвоения линий на карте + +--- + +### TC-F01-09 — Максимум 5 вариантов +**Priority:** P2 +**Expected:** +- Никогда не показывается больше 5 карточек +- Если OSRM вернул 5 — показываем 5 + +--- + +## TC-F02: Статистика маршрута + +### TC-F02-01 — Компактная карточка содержит все элементы +**Priority:** P1 +**Precondition:** Маршрут построен +**Expected:** каждая карточка содержит: +- [ ] Цветную точку (совпадает с цветом маршрута на карте) +- [ ] Номер варианта («Вариант 1») +- [ ] Дистанцию в км (`142 км`) +- [ ] Время в читаемом формате (`4 ч 35 мин`) +- [ ] Цветную полоску покрытия +- [ ] Процент грунта и асфальта (`86% грунт · 14% асфальт`) +- [ ] Кнопку «Подробнее» + +--- + +### TC-F02-02 — Полоска покрытия пропорциональна +**Priority:** P2 +**Precondition:** Маршрут с известной статистикой (например, 50% Lev1-2, 30% Lev3-5, 20% асфальт) +**Expected:** +- Жёлтый сегмент занимает ~50% ширины полоски +- Красный — ~30% +- Серый — ~20% +- Ни один сегмент не исчезает полностью если > 0% + +--- + +### TC-F02-03 — Цвета полоски совпадают с картой +**Priority:** P2 +**Expected:** +- Lev1-2 в полоске — тот же жёлтый (#FFD700) что на карте +- Lev3-5 — тот же красный (#FF4400) +- Тропы — тот же красный пунктир (#cc0000) или близкий +- Асфальт — серый + +--- + +### TC-F02-04 — Развёрнутая карточка +**Priority:** P1 +**Steps:** +1. Построить маршрут +2. Нажать «Подробнее» на карточке + +**Expected:** +- Карточка разворачивается +- Показаны строки: Lev1-2, Lev3-5, Тропы, Асфальт +- Каждая строка: иконка цвета + название + км + % +- Итоговые строки: «Итого грунт» и «Итого асфальт» +- Кнопки «📥 GPX» и «Выбрать маршрут» + +--- + +### TC-F02-05 — Сумма процентов = 100% +**Priority:** P1 +**Expected:** track_lev12_pct + track_lev345_pct + path_pct + asphalt_pct = 100 (±1% погрешность округления) + +--- + +### TC-F02-06 — Статистика не ломает UI при ошибке бэкенда +**Priority:** P1 +**Precondition:** Бэкенд вернул маршрут без поля `stats` (или stats = null) +**Expected:** +- Маршрут отображается на карте +- Карточка показывает дистанцию и время +- Полоска покрытия отсутствует или показывает «нет данных» +- Нет JS-ошибок в консоли, UI не ломается + +--- + +### TC-F02-07 — Карточки не перекрывают карту +**Priority:** P2 +**Steps:** +1. Построить 5 маршрутов +2. Проверить что карта за панелью кликабельна + +**Expected:** +- Панель карточек расположена сбоку (десктоп) или снизу (мобиле) +- Карта за панелью остаётся интерактивной + +--- + +## TC-F04: Промежуточные точки + +### TC-F04-01 — Добавление промежуточной точки +**Priority:** P1 +**Precondition:** Маршрут A→B построен +**Steps:** +1. Нажать кнопку «+ Точка» +2. Кликнуть на карте в произвольном месте между A и B + +**Expected:** +- На карте появляется маркер промежуточной точки (визуально отличается от A/B) +- В панели точек появляется строка «1» с координатами и кнопкой ✕ +- Маршрут перестраивается через новую точку: A→C→B +- Режим «добавить точку» деактивируется + +--- + +### TC-F04-02 — Маркер промежуточной точки отличается от A/B +**Priority:** P2 +**Expected:** +- Маркер A — зелёный с буквой A +- Маркер B — красный с буквой B +- Промежуточные — белые с цветной обводкой и номером (1, 2, ...) + +--- + +### TC-F04-03 — Несколько промежуточных точек +**Priority:** P1 +**Steps:** +1. Добавить 3 промежуточные точки последовательно + +**Expected:** +- Маршрут строится A→C1→C2→C3→B +- В панели точек 5 строк: A, 1, 2, 3, B +- Все маркеры видны на карте + +--- + +### TC-F04-04 — Перетаскивание промежуточной точки +**Priority:** P1 +**Steps:** +1. Добавить промежуточную точку +2. Перетащить её маркер на карте в другое место + +**Expected:** +- Во время перетаскивания маршрут перестраивается (с debounce ~300ms) +- После отпускания маршрут зафиксирован в новом положении +- Координаты в панели точек обновляются + +--- + +### TC-F04-05 — Удаление промежуточной точки +**Priority:** P1 +**Steps:** +1. Добавить 2 промежуточные точки +2. Нажать ✕ рядом с точкой «1» в панели + +**Expected:** +- Точка «1» удалена из панели +- Маркер исчез с карты +- Маршрут перестроился: A→C2→B +- Нумерация обновилась + +--- + +### TC-F04-06 — Изменение порядка точек +**Priority:** P2 +**Steps:** +1. Добавить 2 промежуточные точки C1 и C2 +2. Перетащить строку C2 выше C1 в панели точек + +**Expected:** +- Порядок в панели: A, C2, C1, B +- Маршрут перестроился: A→C2→C1→B + +--- + +### TC-F04-07 — Лимит промежуточных точек +**Priority:** P2 +**Steps:** +1. Добавить 8 промежуточных точек (максимум) +2. Попытаться добавить 9-ю + +**Expected:** +- Кнопка «+ Точка» неактивна или показывает предупреждение +- 9-я точка не добавляется +- Сообщение: «Максимум 8 промежуточных точек» + +--- + +### TC-F04-08 — Перестройка маршрута не блокирует UI +**Priority:** P2 +**Steps:** +1. Добавить промежуточную точку +2. Быстро перетащить её несколько раз подряд + +**Expected:** +- UI не зависает +- Карта остаётся интерактивной во время перестройки +- Финальный маршрут соответствует последней позиции точки + +--- + +## TC-F05: Экспорт GPX + +### TC-F05-01 — Кнопка GPX неактивна без маршрута +**Priority:** P1 +**Precondition:** Маршрут не построен +**Expected:** кнопка «Скачать GPX» задизейблена или скрыта + +--- + +### TC-F05-02 — Базовый экспорт GPX +**Priority:** P1 +**Steps:** +1. Построить маршрут A→B +2. Выбрать вариант +3. Нажать «Скачать GPX» + +**Expected:** +- Браузер скачивает файл +- Имя файла: `enduro-YYYYMMDD-HHMMSS.gpx` +- Файл открывается без ошибок в текстовом редакторе + +--- + +### TC-F05-03 — GPX содержит трек +**Priority:** P1 +**Steps:** +1. Скачать GPX +2. Открыть файл, проверить структуру + +**Expected:** +```xml + + + Enduro route YYYY-MM-DD + 142 км · 86% грунт + + + + + + + + + ... + +``` + +--- + +### TC-F05-04 — GPX содержит waypoints (точки маршрута) +**Priority:** P1 +**Precondition:** Маршрут с промежуточными точками +**Expected:** в GPX присутствуют `` для точек A, промежуточных и B с именами («Старт», «Точка 1», «Финиш») + +--- + +### TC-F05-05 — GPX содержит флажки/метки +**Priority:** P1 +**Precondition:** На карте расставлены метки (F-06) +**Expected:** в GPX присутствуют `` для каждой метки с её именем и иконкой + +--- + +### TC-F05-06 — Уникальное имя файла +**Priority:** P2 +**Steps:** +1. Скачать GPX +2. Подождать 1 секунду +3. Скачать GPX снова + +**Expected:** два файла с разными именами (разный timestamp), не перезаписывают друг друга + +--- + +### TC-F05-07 — GPX валиден для OsmAnd +**Priority:** P2 +**Steps:** +1. Скачать GPX +2. Загрузить в OsmAnd (или валидатор gpx.studio) + +**Expected:** +- Трек отображается на карте OsmAnd +- Waypoints видны как точки +- Нет ошибок парсинга + +--- + +### TC-F05-08 — Метаданные GPX корректны +**Priority:** P2 +**Expected:** +- `` содержит дату в формате YYYY-MM-DD +- `` содержит дистанцию и % грунта +- `