# 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-DD142 км · 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
- `` содержит дистанцию и % грунта
- `