Перейти к содержанию

Master Plan — /admin/testing для всех ролей

Цель

Дашборд /admin/testing должен покрывать 1000+ сценариев для всех ролей системы: Турист · Отельер · Туроператор · Ресторатор · Инструктор · Трансфер-оператор · Админ · Модератор

Все сценарии — с возможностью запустить в реальном окне браузера (popup window, видно, что нажимается), плюс API-smoke тесты, плюс iframe-preview.


Архитектура страницы /admin/testing

┌──────────────────────────────────────────────────────────────┐
│ Tabs (роль): [Турист][Отельер][Туроператор][Ресторатор]      │
│              [Инструктор][Трансфер][Админ][Модератор]        │
├──────────────────────────────────────────────────────────────┤
│ Sub-tabs (раздел роли):                                       │
│   Турист:    [Все][Auth][Каталоги][Бронь+Оплата][Профиль]    │
│              [Истории][Гора][Трекинг][AI][Чаты+SOS][Платежи] │
│              [Поддержка][Соцсеть]                             │
├──────────────────────────────────────────────────────────────┤
│ Тулбар: [▶ Запустить ВСЁ API] [📺 Watch-mode] [Сбросить ✓]  │
├──────────────────────────────────────────────────────────────┤
│ Сценарий:                                                     │
│   ✓ Название сценария [pill: entity] [pill: scope]           │
│       URL: /tourist/...                                       │
│       Шаги: 1) ... 2) ...                                     │
│       [🌐 Открыть окно] [📱 iPhone-окно] [🧑 Кабинет]       │
│       [▶ API] [📺 Watch] [✓] [✗]                            │
│       └─ JSON ответа API                                      │
└──────────────────────────────────────────────────────────────┘

Режимы «видно, что происходит в браузере»

Кнопка Что делает Когда юзать
🌐 Окно window.open(url, '_blank', 'width=1280,height=900,popup=yes') — real popup смотрим админ-страницы, ЛК туриста
📱 iPhone window.open(url, '_blank', 'width=430,height=900') — iPhone-формат мобильное прилож. localhost:9013
🧑 Кабинет popup на /tourist/* ЛК туриста (сайт админки) ЛК на сайте
📺 Watch последовательно открывает шаги в попапе с задержкой (3-5с) end-to-end демо
▶ API fetch + проверка полей ответа smoke-тест без UI

Глобальное хранилище статусов

localStorage["admin-testing-statuses-v2"] — словарь {[scenarioId]: 'pass'|'fail'|'pending'}. Дополнительно localStorage["admin-testing-results-v2"] — JSON ответов последних API-тестов.


Каталог сценариев — Турист (~250 сценариев)

1. Авторизация (10)

  • auth-welcome-open — Welcome открывается, видны 3 кнопки
  • auth-welcome-tos — клик «Условия» открывает оферту
  • auth-phone-mask — маска +7, дисабл «Далее» при <11 цифр
  • auth-phone-resend — таймер 60с, кнопка «Отправить ещё раз»
  • auth-otp-empty — submit пустой → ошибка
  • auth-otp-wrong — 6 неверных → блок 5 мин
  • auth-otp-success — 6 правильных → переход на profile-setup
  • auth-profile-validation — пустое имя → ошибка
  • auth-profile-avatar — upload файл > 5MB → ошибка
  • auth-profile-save — POST /api/v1/auth/profile

2. Главная (Welcome, Dashboard) (15)

  • home-welcome-render — рендерится без ошибок
  • home-dashboard-widgets — 6+ виджетов (погода, курс, акции, AI, ToursMap)
  • home-quick-hotels / tours / restaurants / instructors / ski-pass (5)
  • home-search-empty — пустой поиск → подсказки
  • home-search-results — «Архыз» → 3+ результата
  • home-banner-promo-click — клик баннера → /tourist/promotions/:id
  • home-tours-map-toggle — переключение карта/список
  • home-greeting-time — приветствие по времени суток
  • home-weather-refresh — pull-to-refresh обновляет
  • home-notifications-bell — клик колокольчик → /notifications

3. Каталоги услуг (60)

Шаблон: ОТКРЫТЬ · ФИЛЬТРОВАТЬ · СОРТИРОВАТЬ · ПЕРЕКЛЮЧИТЬ_КАРТА · ИЗБРАННОЕ · КЛИК_КАРТОЧКА · ПОИСК · ПУСТО · ПАГИНАЦИЯ · ОТКРЫТЬ_В_МОБИЛЬНОМ

Применяется к 6 каталогам: hotels, tours, restaurants, instructors, transfers, ski-passes → 60 сценариев.

4. Детали услуг (70)

Шаблон на каждый детальный экран (hotels/:id, tours/:id, restaurants/:id, instructors/:id, transfers/:id, excursions/:id, events/:id): - открытие, галерея swipe, share, favorite toggle, маршрут к точке, отзывы tab, scroll-to-booking, фейк-ID → 404 friendly, datepicker, выбор номера/слота → бронь.

10 шаблонов × 7 типов = 70 кейсов.

5. Бронирование + Оплата (50)

Для каждой из 5 услуг (отель/тур/инструктор/ресторан/трансфер): - открытие формы, валидация ФИО, телефона, дат - выбор гостей (взрослые+/-, дети+/-, инфанты) - доп. услуги (toggle) - промокод (правильный/неверный) - предпросмотр итога (commission, total, остаток) - POST endpoint → ожидаем {commission, totals, payment.url} (API) - редирект на ЮKassa - успешный возврат → /tourist/booking-history - отмена брони - статус в БД: pending_paymentpending_providerconfirmed

5 услуг × 10 шагов = 50 кейсов.

6. Профиль / Кабинет (50)

  • ProfileData: render, edit, avatar upload, save
  • Password change: empty/wrong/match
  • 2FA enable/disable
  • Sessions list, logout-all
  • Lang/TZ change
  • Notifications settings (push toggle per type)
  • Subscriptions list, unsubscribe
  • Wallet: balance, topup, history
  • Favorites: render, remove, filter
  • Stories my: list, delete, new
  • Badges: list, share
  • Leaderboard: filter day/week/season, my-rank
  • FriendsLive: live-map, invite, follow
  • VirtualPass: QR, NFC activate
  • Tracking history: list, detail, delete, share
  • Insurance: list, buy
  • Role management: request partner
  • Settings/about/support: render, click links

50 кейсов.

7. Истории + Соцсеть (25)

  • Stories feed: open, swipe, like, share, reaction emoji
  • Story detail: comment add (+ ошибки 401/404 для фейк-ID)
  • Story new (mobile): camera, text, sticker, location, publish
  • News feed: open, filter, like, share, comment
  • Reviews: my list, new review (rating, text, photos)
  • Public user profile: follow, chat, share
  • Replies thread (story → comment → reply → like)

8. Гора / Склон / Погода (15)

  • Snow page widgets
  • Map3D: zoom, выбор подъёмника, выбор трассы, fullscreen
  • Lifts list/detail: статус, очередь, share
  • Slopes/Trails: открытие, сложность, фото
  • Webcams: list, fullscreen, переключение
  • Weather: 7д прогноз, по высотам, avalanche-risk

9. Трекинг / Бейджи / Лидерборд (15)

  • Tracking start/stop/save/discard
  • GPS permission flow
  • Session detail: stats, map, share, delete
  • Badges: progress, unlock animation, share
  • Leaderboard: period filter, my position, click user → profile
  • Targets dnja: today list, complete

10. AI / Путешествия (10)

  • Trip plans list, create form (dates/budget/interests/composition)
  • Plan detail: day-by-day, click service → detail, edit, export, share
  • AI chat: send message, get 3 vars, like/dislike

11. Чаты / Поддержка / SOS (15)

  • Chats list, search, new chat
  • Chat detail: send text/photo/geo, like, reply, delete msg
  • Chat info: members, mute, leave, media
  • Support: new ticket (тема, описание, attach), reply, close
  • Emergency/SOS: hold-to-call, выбор службы, cancel

12. Платежи / Комиссии (20)

  • Все 5 booking-комиссий: API+UI (✓ уже частично)
  • YK redirect → success/fail/timeout
  • Booking-history pending_payment → клик «Оплатить»
  • Refund flow
  • Payment-history фильтр
  • Чек (PDF) download

13. Уведомления (10)

  • Notifications list, mark read, mark all read
  • Detail page open
  • Push permission ask flow
  • Per-type toggles
  • Deep-link from push (notification → screen)

14. Debug (8)

  • /debug/supabase, /debug/photo-upload, /debug/simple-ski-pass, /ski-passes/debug
  • Тестовые UUIDs валидируются

Итого Турист: ~365 сценариев (с шаблонами и дублями по типам услуг).


Каталог сценариев — Партнёры (~400 сценариев)

Для каждой партнёрской роли (5 ролей: отельер, туроператор, ресторатор, инструктор, трансфер):

A. Кабинет — список услуг (5 × 12 = 60)

CRUD: создать, редактировать, удалить, опубликовать, снять, дублировать, фото upload (одно/много/удалить), теги, цены, расписание.

B. Бронирования (5 × 15 = 75)

Список + фильтры + принять/отклонить + чат с туристом + push уведомление туристу + возврат денег + поменять статус + история действий + экспорт CSV.

C. Отзывы (5 × 10 = 50)

Список, ответить, скрыть, пожаловаться, фильтр по оценке, экспорт, статистика.

D. Аналитика (5 × 8 = 40)

Дашборд, графики, конверсия, средний чек, drilldown, экспорт, фильтр периода, сравнение.

E. Финансы (5 × 10 = 50)

Поступления, выплаты, комиссии, налоги, отчёт, чек, реквизиты, история комиссий, инвойсы, заявки на вывод.

F. Профиль и команда (5 × 8 = 40)

Профиль организации, команда, роли, приглашения, права, лого upload, контакты, режим работы.

G. Контент-маркетинг (5 × 8 = 40)

Промо-баннеры, акции, рассылка, сториз, виджет на сайт, QR-офлайн, статистика трафика, A/B.

H. Уведомления и чаты (5 × 9 = 45)

Чаты с туристами, групповые с командой, push настройки, шаблоны автоответов, SLA.

Итого Партнёры: ~400 сценариев.


Каталог сценариев — Админ (~250 сценариев)

Управление пользователями (40)

Список, фильтры, бан, разбан, выдача роли, сброс пароля, история действий, экспорт.

Управление контентом (50)

Hotels, Tours, Restaurants, Instructors, Transfers, Stories — модерация, удаление, restore, dedup.

Модерация отзывов (15)

Очередь, approve/reject, фильтры, массовые действия, причины отказа.

Финансы (40)

Комиссии (правила, role_commissions, провайдеры), отчёты, доход, выплаты партнёрам, налоги, чеки, реконсиляция.

Платежи / ЮKassa (20)

Транзакции, refund, статусы, debug, повторные платежи, мониторинг очереди, ретраи.

Аналитика (25)

Dashboard, метрики, графики, drilldown, экспорт CSV/PDF, по ролям, по услугам.

Мониторинг (15)

Здоровье микросервисов, errors-log, Grafana, alerts, RTC статусы, очереди.

Тестирование (10)

Сам этот раздел — meta-сценарии (открыть таб, запустить группу, экспорт результата).

Настройки системы (35)

Модули вкл/выкл, фичефлаги, лимиты, prompts AI, mail templates, push templates, переводы (i18n), валюты, налоги, способы оплаты, банки-реквизиты.

Итого Админ: ~250 сценариев.


ИТОГ покрытия

Роль Сценариев
Турист ~365
Отельер ~80
Туроператор ~80
Ресторатор ~80
Инструктор ~80
Трансфер ~80
Админ ~250
Модератор ~50
ИТОГО ~1065

План реализации (поэтапно)

Фаза 1 (текущая) — инфра + Турист (1-2 дня)

  • ✓ Базовый дашборд (32 сценария)
  • ✓ Commission API-тесты (7 сценариев)
  • ⏳ Role-tabs + section sub-tabs
  • ⏳ window.open visible mode (🌐, 📱, 🧑)
  • ⏳ Watch-mode (sequential popup)
  • ⏳ Programmatic scenario generation (шаблоны)
  • ⏳ Tourist scenarios → 250+

Фаза 2 — Партнёры (3-4 дня)

  • 5 ролевых дашбордов
  • Шаблоны CRUD/Bookings/Reviews/Analytics
  • Live-демо логина под партнёром (одной кнопкой «Войти как отельер»)

Фаза 3 — Админ + Модератор (2 дня)

  • Покрытие всех админских разделов
  • Meta-сценарии тестирования
  • Финансовый, аналитический, мониторинг таб

Фаза 4 — Автоматизация (опционально, 3 дня)

  • Playwright-runner на отдельном сервисе (testing-runner-svc)
  • Запись макросов через chrome.recorder API → JSON шагов
  • Воспроизведение шагов в popup
  • CI-интеграция: nightly прогон, отчёт в Slack

Технические детали

Структура сценария (TypeScript)

type Scenario = {
  id: string;                   // 'tourist-auth-otp-success'
  role: Role;                   // 'tourist' | 'hotelier' | ...
  section: Section;             // 'auth' | 'catalogs' | ...
  title: string;
  steps: string[];
  url: string;                  // основной URL (админ)
  urlMobile?: string;           // localhost:9013/...
  urlTouristWeb?: string;       // /tourist/...
  apiCheck?: ApiCheck;          // авто-API тест
  watchSteps?: WatchStep[];     // для watch-mode
  entity?: string;              // отображ. badge
  priority?: 'p0' | 'p1' | 'p2';
};

type WatchStep = {
  action: 'navigate' | 'click' | 'type' | 'wait' | 'screenshot';
  selector?: string;
  value?: string;
  delayMs?: number;
};

Шаблоны сценариев (factory functions)

function catalogScenarios(role: Role, kind: 'hotels'|'tours'|...): Scenario[] {
  return [
    { id: `${role}-${kind}-open`, ... },
    { id: `${role}-${kind}-filter-price`, ... },
    // ... 10 шаблонов
  ];
}
function bookingScenarios(role: Role, kind: ...): Scenario[] { /* 10 шаблонов */ }
function profileScenarios(role: Role): Scenario[] { /* 50 шаблонов */ }
// и т.д.

Это позволяет генерировать 1000+ сценариев из ~50 строк кода.

Хранение результатов

  • localStorage по умолчанию
  • При деплое — POST в /api/v1/admin/testing/results (новый endpoint) → таблица test_runs для истории прогонов

Watch-mode реализация

async function watchScenario(s: Scenario) {
  const win = window.open(s.url, '_blank', 'width=430,height=900');
  for (const step of s.watchSteps || []) {
    await delay(step.delayMs || 3000);
    if (step.action === 'navigate' && win) win.location.href = step.value!;
    // click/type через postMessage с целевой стороны (нужен слушатель в tourist-app)
  }
}

Для реальных кликов/вводов потребуется script-injection (CORS-friendly через postMessage с tourist-app, где будет слушатель в dev-режиме).


Что делаем СЕЙЧАС (в этом коммите)

  1. ✓ Этот документ.
  2. Restructure TestingDashboardPage.tsx:
  3. Role tabs сверху (Турист активна, остальные с counter «soon»)
  4. Section sub-tabs внутри роли туриста (~12 секций)
  5. Кнопка 🌐 Окно — открывает popup window.open для админ-URL
  6. Кнопка 📱 iPhone — popup для mobile (localhost:9013)
  7. Кнопка 🧑 Кабинет — popup для /tourist/*
  8. ▶ API (уже есть)
  9. Генерация ~150 tourist-сценариев из шаблонов.
  10. Тулбар: Watch-кнопка-заглушка (планируется фаза 2).

После этого коммита — фаза 1 готова на ~60%. Остаток (генерация партнёрских) — отдельные PR.