auto-sync: 2026-05-04 10:20:01
This commit is contained in:
@@ -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 формат
|
||||
- Содержит: `<trk>` с геометрией маршрута + `<wpt>` для всех точек (A, промежуточные, B)
|
||||
- Метаданные: name, desc, time
|
||||
- Генерация на фронте (из геометрии OSRM ответа) — не требует бэкенда
|
||||
- Содержит **оба элемента** (подтверждено Славой):
|
||||
- `<trk>` + `<trkseg>` — полная геометрия маршрута (все точки от OSRM)
|
||||
- `<wpt>` — точки A, промежуточные, B + все флажки/метки с карты
|
||||
- Метаданные: name (`Enduro route YYYY-MM-DD`), desc (дистанция + % грунта), time
|
||||
- Генерация на фронте (из геометрии OSRM ответа + localStorage меток) — не требует бэкенда
|
||||
- Кнопка «Скачать GPX» активна только когда маршрут выбран
|
||||
|
||||
---
|
||||
@@ -239,7 +241,7 @@ OSRM поддерживает `alternatives=true` (до 3 вариантов) и
|
||||
> При скачивании GPX (F-05) метки включаются как `<wpt>` с именами.
|
||||
|
||||
#### Требования
|
||||
- Хранение: 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 | **Трек + метки** — `<trk>` с геометрией и `<wpt>` для всех точек и флажков |
|
||||
|
||||
---
|
||||
|
||||
*Документ готов к передаче Dev-агенту после согласования со Славой.*
|
||||
*Документ согласован. Готов к передаче Dev-агенту.*
|
||||
|
||||
703
tasks/enduro-trails/TEST_CASES_PHASE3.md
Normal file
703
tasks/enduro-trails/TEST_CASES_PHASE3.md
Normal file
@@ -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
|
||||
<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:**
|
||||
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:**
|
||||
- `<name>` содержит дату в формате YYYY-MM-DD
|
||||
- `<desc>` содержит дистанцию и % грунта
|
||||
- `<time>` — валидный ISO 8601 timestamp
|
||||
|
||||
---
|
||||
|
||||
## TC-F06: Флажки / именованные метки
|
||||
|
||||
### TC-F06-01 — Добавление метки с именем
|
||||
**Priority:** P1
|
||||
**Steps:**
|
||||
1. Нажать кнопку 🚩
|
||||
2. Кликнуть на карте
|
||||
3. Ввести название «Заправка»
|
||||
4. Нажать «Сохранить»
|
||||
|
||||
**Expected:**
|
||||
- Метка появляется на карте с иконкой 🚩
|
||||
- Метка отображается поверх всех слоёв
|
||||
- Диалог закрывается
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-02 — Добавление метки без имени
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Нажать 🚩, кликнуть на карте
|
||||
2. Оставить поле имени пустым, нажать Enter или «Сохранить»
|
||||
|
||||
**Expected:**
|
||||
- Метка сохраняется с автоименем «Метка 1» (или «Метка N» по счётчику)
|
||||
- Нет ошибки
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-03 — Выбор иконки метки
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Добавить метку, выбрать иконку ⛺
|
||||
2. Сохранить
|
||||
|
||||
**Expected:** на карте отображается иконка ⛺, не 🚩
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-04 — Клик по метке — попап
|
||||
**Priority:** P1
|
||||
**Steps:**
|
||||
1. Кликнуть по существующей метке на карте
|
||||
|
||||
**Expected:**
|
||||
- Попап с: названием, координатами (lat/lon), кнопками «Редактировать», «Удалить», «Сделать точкой A», «Сделать точкой B»
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-05 — Редактирование метки
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Открыть попап метки
|
||||
2. Нажать «Редактировать»
|
||||
3. Изменить название на «Ночёвка»
|
||||
4. Сохранить
|
||||
|
||||
**Expected:**
|
||||
- Метка на карте обновляет название
|
||||
- В попапе при следующем клике — новое название
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-06 — Удаление метки
|
||||
**Priority:** P1
|
||||
**Steps:**
|
||||
1. Открыть попап метки
|
||||
2. Нажать «Удалить»
|
||||
|
||||
**Expected:**
|
||||
- Метка исчезает с карты
|
||||
- Из localStorage удалена запись
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-07 — Метки сохраняются после перезагрузки
|
||||
**Priority:** P1
|
||||
**Steps:**
|
||||
1. Добавить 3 метки
|
||||
2. Закрыть вкладку браузера
|
||||
3. Открыть снова
|
||||
|
||||
**Expected:** все 3 метки на месте, с теми же именами и иконками
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-08 — Метка как точка маршрута
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Добавить метку «Старт»
|
||||
2. Открыть попап метки
|
||||
3. Нажать «Сделать точкой A»
|
||||
|
||||
**Expected:**
|
||||
- Маркер A перемещается на координаты метки
|
||||
- Если маршрут был построен — перестраивается
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-09 — Лимит меток
|
||||
**Priority:** P3
|
||||
**Steps:**
|
||||
1. Добавить 50 меток
|
||||
2. Попытаться добавить 51-ю
|
||||
|
||||
**Expected:**
|
||||
- Предупреждение: «Достигнут лимит 50 меток»
|
||||
- 51-я метка не добавляется
|
||||
|
||||
---
|
||||
|
||||
### TC-F06-10 — Очистить все метки
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Добавить несколько меток
|
||||
2. Нажать «Очистить все метки»
|
||||
3. Подтвердить в диалоге
|
||||
|
||||
**Expected:**
|
||||
- Все метки исчезают с карты
|
||||
- localStorage очищен
|
||||
- Без подтверждения — ничего не происходит
|
||||
|
||||
---
|
||||
|
||||
## TC-NFR: Нефункциональные требования
|
||||
|
||||
### TC-NFR-01 — Время построения маршрута
|
||||
**Priority:** P1
|
||||
**Steps:**
|
||||
1. Установить точки A и B (~150 км)
|
||||
2. Нажать «Дикий путь», засечь время
|
||||
|
||||
**Expected:** маршруты появляются не позднее чем через 5 секунд
|
||||
|
||||
---
|
||||
|
||||
### TC-NFR-02 — Спиннер при загрузке
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Нажать «Дикий путь»
|
||||
|
||||
**Expected:**
|
||||
- Кнопка показывает спиннер или меняет текст на «Строю...»
|
||||
- Карта остаётся интерактивной (можно зумировать, двигать)
|
||||
- После получения ответа — кнопка возвращается в исходное состояние
|
||||
|
||||
---
|
||||
|
||||
### TC-NFR-03 — Мобильный экран (< 768px)
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. Открыть в браузере с шириной 375px (iPhone)
|
||||
2. Построить маршруты
|
||||
|
||||
**Expected:**
|
||||
- Панель карточек расположена снизу, не перекрывает карту полностью
|
||||
- Карточки скроллируются горизонтально
|
||||
- Кнопки управления доступны
|
||||
|
||||
---
|
||||
|
||||
### TC-NFR-04 — Touch-перетаскивание точек (мобиле)
|
||||
**Priority:** P2
|
||||
**Steps:**
|
||||
1. На мобиле добавить промежуточную точку
|
||||
2. Перетащить пальцем
|
||||
|
||||
**Expected:** точка перемещается, маршрут перестраивается
|
||||
|
||||
---
|
||||
|
||||
### TC-NFR-05 — OSRM недоступен
|
||||
**Priority:** P1
|
||||
**Precondition:** OSRM контейнер остановлен
|
||||
**Steps:**
|
||||
1. Нажать «Дикий путь»
|
||||
|
||||
**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 перед передачей Славе.*
|
||||
Reference in New Issue
Block a user