24 KiB
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:
- Построить маршрут A→B
- Проверить компактную карточку маршрута
- Раскрыть карточку «Подробнее»
- Проверить развёрнутую карточку
Expected: во всех местах время в формате X ч Y мин, нигде нет «минут» как числа > 60
TC-F01: Альтернативные маршруты
TC-F01-01 — Базовое построение альтернатив
Priority: P1
Precondition: Карта открыта, маркеры A и B не установлены
Steps:
- Кликнуть на карте — установить точку A (например, Москва)
- Кликнуть на карте — установить точку B (например, Тверь, ~170 км)
- Нажать кнопку «Дикий путь» 🗺️
Expected:
- На карте появляются 2–5 маршрутов разными цветами
- Каждый маршрут имеет свой уникальный цвет из палитры (синий, зелёный, фиолетовый, оранжевый, серый)
- Появляется панель с карточками вариантов
- Каждая карточка содержит: номер варианта, цветную точку, дистанцию, время, полоску покрытия
TC-F01-02 — Визуальное различие маршрутов
Priority: P1
Precondition: Построены 3+ маршрута
Expected:
- Все маршруты видны на карте одновременно
- Цвета не повторяются
- Маршруты не сливаются визуально (разная толщина или прозрачность для неактивных)
TC-F01-03 — Hover на карточке подсвечивает маршрут
Priority: P2
Precondition: Построены 3+ маршрута
Steps:
- Навести мышь на карточку «Вариант 2»
Expected:
- Маршрут варианта 2 на карте становится жирнее/ярче
- Остальные маршруты становятся тусклее
- При уходе мыши — возврат к исходному состоянию
TC-F01-04 — Выбор маршрута кликом на карточку
Priority: P1
Steps:
- Построить маршруты
- Кликнуть на карточку «Вариант 3»
Expected:
- Вариант 3 выделен в панели (рамка/фон)
- На карте вариант 3 отображается жирнее остальных
- Кнопка «Скачать GPX» становится активной
TC-F01-05 — Выбор маршрута кликом на линию карты
Priority: P2
Steps:
- Построить маршруты
- Кликнуть на линию маршрута на карте
Expected:
- Соответствующая карточка в панели выделяется
- Маршрут становится активным
TC-F01-06 — Только один маршрут (нет альтернатив)
Priority: P2
Precondition: Точки A и B очень близко (< 5 км) или OSRM вернул 1 маршрут
Expected:
- Показывается 1 карточка
- Нет сообщения об ошибке
- Опционально: подпись «Альтернативных маршрутов не найдено»
TC-F01-07 — Кнопка «Сбросить»
Priority: P1
Precondition: Построены маршруты, установлены маркеры A и B
Steps:
- Нажать кнопку «Сбросить»
Expected:
- Все маршруты исчезают с карты
- Маркеры A и B удалены
- Панель карточек скрывается
- Карта возвращается в исходное состояние
TC-F01-08 — Повторное построение маршрута
Priority: P1
Steps:
- Построить маршруты
- Переставить точку B в другое место
- Нажать «Дикий путь» снова
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:
- Построить маршрут
- Нажать «Подробнее» на карточке
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:
- Построить 5 маршрутов
- Проверить что карта за панелью кликабельна
Expected:
- Панель карточек расположена сбоку (десктоп) или снизу (мобиле)
- Карта за панелью остаётся интерактивной
TC-F04: Промежуточные точки
TC-F04-01 — Добавление промежуточной точки
Priority: P1
Precondition: Маршрут A→B построен
Steps:
- Нажать кнопку «+ Точка»
- Кликнуть на карте в произвольном месте между 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:
- Добавить 3 промежуточные точки последовательно
Expected:
- Маршрут строится A→C1→C2→C3→B
- В панели точек 5 строк: A, 1, 2, 3, B
- Все маркеры видны на карте
TC-F04-04 — Перетаскивание промежуточной точки
Priority: P1
Steps:
- Добавить промежуточную точку
- Перетащить её маркер на карте в другое место
Expected:
- Во время перетаскивания маршрут перестраивается (с debounce ~300ms)
- После отпускания маршрут зафиксирован в новом положении
- Координаты в панели точек обновляются
TC-F04-05 — Удаление промежуточной точки
Priority: P1
Steps:
- Добавить 2 промежуточные точки
- Нажать ✕ рядом с точкой «1» в панели
Expected:
- Точка «1» удалена из панели
- Маркер исчез с карты
- Маршрут перестроился: A→C2→B
- Нумерация обновилась
TC-F04-06 — Изменение порядка точек
Priority: P2
Steps:
- Добавить 2 промежуточные точки C1 и C2
- Перетащить строку C2 выше C1 в панели точек
Expected:
- Порядок в панели: A, C2, C1, B
- Маршрут перестроился: A→C2→C1→B
TC-F04-07 — Лимит промежуточных точек
Priority: P2
Steps:
- Добавить 8 промежуточных точек (максимум)
- Попытаться добавить 9-ю
Expected:
- Кнопка «+ Точка» неактивна или показывает предупреждение
- 9-я точка не добавляется
- Сообщение: «Максимум 8 промежуточных точек»
TC-F04-08 — Перестройка маршрута не блокирует UI
Priority: P2
Steps:
- Добавить промежуточную точку
- Быстро перетащить её несколько раз подряд
Expected:
- UI не зависает
- Карта остаётся интерактивной во время перестройки
- Финальный маршрут соответствует последней позиции точки
TC-F05: Экспорт GPX
TC-F05-01 — Кнопка GPX неактивна без маршрута
Priority: P1
Precondition: Маршрут не построен
Expected: кнопка «Скачать GPX» задизейблена или скрыта
TC-F05-02 — Базовый экспорт GPX
Priority: P1
Steps:
- Построить маршрут A→B
- Выбрать вариант
- Нажать «Скачать GPX»
Expected:
- Браузер скачивает файл
- Имя файла:
enduro-YYYYMMDD-HHMMSS.gpx - Файл открывается без ошибок в текстовом редакторе
TC-F05-03 — GPX содержит трек
Priority: P1
Steps:
- Скачать GPX
- Открыть файл, проверить структуру
Expected:
<gpx version="1.1" ...>
<metadata>
<name>Enduro route YYYY-MM-DD</name>
<desc>142 км · 86% грунт</desc>
<time>...</time>
</metadata>
<trk>
<trkseg>
<trkpt lat="..." lon="..."/>
<!-- все точки геометрии маршрута -->
</trkseg>
</trk>
...
</gpx>
TC-F05-04 — GPX содержит waypoints (точки маршрута)
Priority: P1
Precondition: Маршрут с промежуточными точками
Expected: в GPX присутствуют <wpt> для точек A, промежуточных и B с именами («Старт», «Точка 1», «Финиш»)
TC-F05-05 — GPX содержит флажки/метки
Priority: P1
Precondition: На карте расставлены метки (F-06)
Expected: в GPX присутствуют <wpt> для каждой метки с её именем и иконкой
TC-F05-06 — Уникальное имя файла
Priority: P2
Steps:
- Скачать GPX
- Подождать 1 секунду
- Скачать GPX снова
Expected: два файла с разными именами (разный timestamp), не перезаписывают друг друга
TC-F05-07 — GPX валиден для OsmAnd
Priority: P2
Steps:
- Скачать GPX
- Загрузить в OsmAnd (или валидатор gpx.studio)
Expected:
- Трек отображается на карте OsmAnd
- Waypoints видны как точки
- Нет ошибок парсинга
TC-F05-08 — Метаданные GPX корректны
Priority: P2
Expected:
<name>содержит дату в формате YYYY-MM-DD<desc>содержит дистанцию и % грунта<time>— валидный ISO 8601 timestamp
TC-F06: Флажки / именованные метки
TC-F06-01 — Добавление метки с именем
Priority: P1
Steps:
- Нажать кнопку 🚩
- Кликнуть на карте
- Ввести название «Заправка»
- Нажать «Сохранить»
Expected:
- Метка появляется на карте с иконкой 🚩
- Метка отображается поверх всех слоёв
- Диалог закрывается
TC-F06-02 — Добавление метки без имени
Priority: P2
Steps:
- Нажать 🚩, кликнуть на карте
- Оставить поле имени пустым, нажать Enter или «Сохранить»
Expected:
- Метка сохраняется с автоименем «Метка 1» (или «Метка N» по счётчику)
- Нет ошибки
TC-F06-03 — Выбор иконки метки
Priority: P2
Steps:
- Добавить метку, выбрать иконку ⛺
- Сохранить
Expected: на карте отображается иконка ⛺, не 🚩
TC-F06-04 — Клик по метке — попап
Priority: P1
Steps:
- Кликнуть по существующей метке на карте
Expected:
- Попап с: названием, координатами (lat/lon), кнопками «Редактировать», «Удалить», «Сделать точкой A», «Сделать точкой B»
TC-F06-05 — Редактирование метки
Priority: P2
Steps:
- Открыть попап метки
- Нажать «Редактировать»
- Изменить название на «Ночёвка»
- Сохранить
Expected:
- Метка на карте обновляет название
- В попапе при следующем клике — новое название
TC-F06-06 — Удаление метки
Priority: P1
Steps:
- Открыть попап метки
- Нажать «Удалить»
Expected:
- Метка исчезает с карты
- Из localStorage удалена запись
TC-F06-07 — Метки сохраняются после перезагрузки
Priority: P1
Steps:
- Добавить 3 метки
- Закрыть вкладку браузера
- Открыть снова
Expected: все 3 метки на месте, с теми же именами и иконками
TC-F06-08 — Метка как точка маршрута
Priority: P2
Steps:
- Добавить метку «Старт»
- Открыть попап метки
- Нажать «Сделать точкой A»
Expected:
- Маркер A перемещается на координаты метки
- Если маршрут был построен — перестраивается
TC-F06-09 — Лимит меток
Priority: P3
Steps:
- Добавить 50 меток
- Попытаться добавить 51-ю
Expected:
- Предупреждение: «Достигнут лимит 50 меток»
- 51-я метка не добавляется
TC-F06-10 — Очистить все метки
Priority: P2
Steps:
- Добавить несколько меток
- Нажать «Очистить все метки»
- Подтвердить в диалоге
Expected:
- Все метки исчезают с карты
- localStorage очищен
- Без подтверждения — ничего не происходит
TC-NFR: Нефункциональные требования
TC-NFR-01 — Время построения маршрута
Priority: P1
Steps:
- Установить точки A и B (~150 км)
- Нажать «Дикий путь», засечь время
Expected: маршруты появляются не позднее чем через 5 секунд
TC-NFR-02 — Спиннер при загрузке
Priority: P2
Steps:
- Нажать «Дикий путь»
Expected:
- Кнопка показывает спиннер или меняет текст на «Строю...»
- Карта остаётся интерактивной (можно зумировать, двигать)
- После получения ответа — кнопка возвращается в исходное состояние
TC-NFR-03 — Мобильный экран (< 768px)
Priority: P2
Steps:
- Открыть в браузере с шириной 375px (iPhone)
- Построить маршруты
Expected:
- Панель карточек расположена снизу, не перекрывает карту полностью
- Карточки скроллируются горизонтально
- Кнопки управления доступны
TC-NFR-04 — Touch-перетаскивание точек (мобиле)
Priority: P2
Steps:
- На мобиле добавить промежуточную точку
- Перетащить пальцем
Expected: точка перемещается, маршрут перестраивается
TC-NFR-05 — OSRM недоступен
Priority: P1
Precondition: OSRM контейнер остановлен
Steps:
- Нажать «Дикий путь»
Expected:
- Сообщение об ошибке: «Не удалось построить маршрут. Попробуйте позже.»
- UI не ломается, карта остаётся рабочей
- Нет необработанных JS-ошибок в консоли
TC-NFR-06 — localStorage недоступен
Priority: P3
Precondition: localStorage заблокирован (приватный режим Firefox)
Expected:
- Метки работают в рамках сессии
- Нет JS-ошибок
- Предупреждение: «Метки не будут сохранены после закрытия браузера»
Матрица покрытия
| Фича | Кол-во TC | P1 | P2 | P3 |
|---|---|---|---|---|
| F-03 Время | 8 | 4 | 3 | 1 |
| F-01 Альтернативы | 9 | 5 | 4 | 0 |
| F-02 Статистика | 7 | 4 | 3 | 0 |
| F-04 Промежуточные точки | 8 | 4 | 4 | 0 |
| F-05 GPX | 8 | 4 | 4 | 0 |
| F-06 Флажки | 10 | 4 | 5 | 1 |
| NFR | 6 | 2 | 3 | 1 |
| Итого | 56 | 27 | 26 | 3 |
Порядок прогона
Smoke (P1 only, ~15 мин): TC-F03-01, TC-F03-03, TC-F03-08 → TC-F01-01, TC-F01-04, TC-F01-07 → TC-F02-01, TC-F02-05, TC-F02-06 → TC-F04-01, TC-F04-04, TC-F04-05 → TC-F05-01, TC-F05-02, TC-F05-03, TC-F05-04 → TC-F06-01, TC-F06-04, TC-F06-06, TC-F06-07 → TC-NFR-01, TC-NFR-05
Full regression (~60 мин): все 56 тест-кейсов в порядке нумерации
Документ готов. После реализации — прогнать Smoke перед передачей Славе.