Files
enduro-trails/docs/work-items/ET-009/03-acceptance-criteria.md
claude-bot eaa6b4cd27
Some checks failed
CI / lint (push) Failing after 4s
CI / test (push) Failing after 5s
CI / build (push) Has been skipped
feat(ET-009): analyst artifacts — BRD, TRZ, AC, test plan
2026-06-01 17:51:47 +00:00

10 KiB
Raw Blame History

type, work_item_id, title, version, status, created_at, updated_at, authors
type work_item_id title version status created_at updated_at authors
acceptance-criteria ET-009 Acceptance Criteria: Новые источники GPS-треков — EnduroRussia и Wikiloc 1 draft 2026-06-01 2026-06-01
agent:analyst

Acceptance Criteria — ET-009

Критерии формализованы в Gherkin-стиле. Все критерии — обязательные; задача считается принятой, когда каждый прошёл проверку в test-среде или в автоматическом тестовом запуске CI.

AC-01 — Конфиг EnduroRussia исправлен и активирован

Given запись enduro_russia в config/gps_sources.yaml When работа ET-009 завершена Then:

  • base_url равно https://endurorussia.ru (без дефиса);
  • enabled равно true;
  • license_adr указывает на существующий файл с status: accepted;
  • rate_limit_sec ≥ 5.

AC-02 — Конфиг Wikiloc добавлен

Given config/gps_sources.yaml When работа ET-009 завершена Then существует запись с id: wikiloc, в которой:

  • enabled: true;
  • base_url: https://www.wikiloc.com;
  • rate_limit_sec: 10;
  • license_adr: docs/work-items/ET-008/06-adr/ADR-012-wikiloc-licensing.md;
  • parser_module: src.api.gps_tracks.sources.wikiloc;
  • save_user_field: false;
  • attribution: "© Wikiloc contributors";
  • задано max_tracks_per_run (любое целое > 0; для MVP — 50).

AC-03 — Wikiloc подписан на регион ЦФО+Чувашия

Given config/gps_regions.yaml When работа ET-009 завершена Then запись tsfo_plus_chuvashia.sources содержит элемент wikiloc. enduro_russia в этом списке уже был и остаётся.

AC-04 — Pipeline licensing-guard прозрачно работает

Given scripts/gps_collect.py и ADR-010 со status: accepted When оператор запускает python scripts/gps_collect.py --region tsfo_plus_chuvashia --source enduro_russia Then в логах нет сообщения skipped_license, в pipeline_runs последняя запись имеет status{ok, partial}, не skipped_license.

And given искусственная подмена status: accepted на status: proposed в копии ADR-010 When запуск pipeline с этим путём Then pipeline_runs[-1].status == 'skipped_license', exit-code 1.

AC-05 — Unit-тесты EnduroRussia зелёные

Given ветка feature/ET-009-… с коммитом изменений When CI запускает pytest tests/unit/test_gps_tracks_enduro_russia.py -v Then все тесты UT-ER-01..UT-ER-08 проходят, exit-code 0.

AC-06 — Unit-тесты Wikiloc зелёные

Given та же ветка When CI запускает pytest tests/unit/test_gps_tracks_wikiloc.py -v Then все тесты UT-WL-01..UT-WL-10 проходят, exit-code 0.

AC-07 — Integration-тесты pipeline зелёные

Given ветка When CI запускает pytest tests/integration/test_pipeline_et009.py -v Then все тесты IT-ER-01, IT-WL-01, IT-WL-02, IT-DEDUP-01, IT-LIC-01 проходят.

AC-08 — Тестовые фикстуры существуют в репо

Given репо после слияния When проверка файлов Then следующие файлы существуют и не пустые:

  • tests/fixtures/gps-tracks/enduro-russia-api-tracks-page1.json
  • tests/fixtures/gps-tracks/enduro-russia-track-1.gpx (≥ 10 trkpt)
  • tests/fixtures/gps-tracks/enduro-russia-track-2.gpx (пустой)
  • tests/fixtures/gps-tracks/enduro-russia-track-3.gpx (вне bbox)
  • tests/fixtures/gps-tracks/wikiloc-search-page1.html (≥ 5 ссылок на треки)
  • tests/fixtures/gps-tracks/wikiloc-trail-page.html
  • tests/fixtures/gps-tracks/wikiloc-track.gpx

AC-09 — Первый продакшн-прогон EnduroRussia

Given mva154, ветка смерджена в main, deploy выполнен When оператор выполняет

python scripts/gps_collect.py --region tsfo_plus_chuvashia --source enduro_russia

Then:

  • exit-code 0;
  • последняя запись pipeline_runs имеет region_id='tsfo_plus_chuvashia', source_id='enduro_russia', status='ok' или 'partial';
  • tracks_new + tracks_updated ≥ 200;
  • errors_json IS NULL или содержит ≤ 5% от tracks_new;
  • длительность ≤ 45 минут.

AC-10 — Первый продакшн-прогон Wikiloc

Given mva154 и активированный wikiloc When оператор выполняет

python scripts/gps_collect.py --region tsfo_plus_chuvashia --source wikiloc

Then:

  • exit-code 0 (graceful-stop приемлем);
  • последняя запись pipeline_runs имеет status{ok, partial, rate_limited};
  • tracks_new + tracks_updated ≥ 1 (любое ненулевое — успех; ограничение max_tracks_per_run=50).

AC-11 — API возвращает новые источники

Given БД после двух прогонов AC-09 + AC-10 When клиент делает GET /api/gps-tracks?bbox=37.0,55.0,38.0,56.0 Then в ответе:

  • статус 200;
  • в FeatureCollection.features[].properties.sources встречаются строки "enduro_russia" и/или "wikiloc" (для разных треков);
  • ни одна feature не имеет в sources значение "enduro-russia" (с дефисом) или другую опечатку.

AC-12 — Health-эндпоинт показывает новые источники

Given БД после прогонов When клиент делает GET /api/gps-tracks/health Then в ответе:

  • статус 200;
  • поле tracks_by_source содержит ключи enduro_russia и wikiloc с числовыми значениями ≥ 1.

AC-13 — Dedup-merge работает между источниками

Given БД после прогонов When SQL-запрос:

SELECT id, sources_json FROM tracks
WHERE sources_json LIKE '%enduro_russia%'
  AND (sources_json LIKE '%wikiloc%' OR sources_json LIKE '%osm%');

Then возвращается ≥ 1 строка (хотя бы один трек попал в БД из ≥ 2 источников и был объединён по dedup-key).

Note. Если для данного снимка БД таких пересечений нет физически (маловероятно при ≥ 200 треков EnduroRussia), AC-13 проверяется синтетически через integration-тест IT-DEDUP-01 и считается покрытым.

AC-14 — Стили карты содержат цвета новых источников

Given src/web/style.json и src/web/style-dark.json When работа ET-009 завершена Then в paint.line-color слоя для публичных треков (имя слоя по ET-008 — gps-tracks-layer или эквивалент) match-expression содержит ключи osm, enduro_russia, wikiloc с присвоенными цветами, и есть fallback-значение по умолчанию.

AC-15 — Атрибуция отображается в UI

Given в БД есть треки из всех трёх источников When пользователь открывает страницу, включает «Публичные треки», ждёт 3 сек Then в строке атрибуции MapLibre (правый нижний угол) видны:

  • «© OpenStreetMap contributors (ODbL)»;
  • «EnduroRussia.ru»;
  • «© Wikiloc contributors».

AC-16 — UI-фильтр источников показывает 3 чекбокса

Given в БД есть треки трёх источников When пользователь открывает #sheet-gps-filters Then в секции «ИСТОЧНИК» (#gps-source-grid) видны минимум три чекбокса с подписями «OSM», «EnduroRussia», «Wikiloc». По умолчанию все установлены.

AC-17 — Снятие галки источника убирает соответствующие линии

Given включён слой и видны треки трёх источников When пользователь снимает галку «EnduroRussia» в фильтре Then через ≤ 200 мс на карте все линии цвета enduro_russia (или все треки с этим источником в properties.sources) исчезают; OSM и Wikiloc остаются.

AC-18 — Документация work item полная

Given репо после слияния ET-009 When проверка docs/work-items/ET-009/ Then существуют:

  • 00-business-request.md
  • 01-brd.md
  • 02-trz.md
  • 03-acceptance-criteria.md
  • 04-test-plan.yaml
  • 04b-ui-test-cases.md
  • 13-test-report.md (после Тестирования)
  • 14-deploy-log.md (после Деплоя)

AC-19 — Регрессия ET-008 не сломана

Given все существующие e2e-тесты ET-008 When CI прогоняет pytest tests/e2e/ -v (или соответствующий маркер) Then все тесты ET-008 (E-01..E-41 из docs/work-items/ET-008/04-test-plan.yaml) проходят без регрессий, как и до ET-009.

AC-20 — Производительность endpoint не деградировала

Given БД с треками после ET-009 (новые источники добавлены) When нагрузочный тест 100 запросов GET /api/gps-tracks?bbox=… на z=10 с 500 треков в bbox Then p95 latency ≤ 300 мс (не выше, чем baseline ET-008).