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-setupauth-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/:idhome-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_payment → pending_provider → confirmed
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-режиме).
Что делаем СЕЙЧАС (в этом коммите)¶
- ✓ Этот документ.
- Restructure
TestingDashboardPage.tsx: - Role tabs сверху (Турист активна, остальные с counter «soon»)
- Section sub-tabs внутри роли туриста (~12 секций)
- Кнопка 🌐 Окно — открывает popup
window.openдля админ-URL - Кнопка 📱 iPhone — popup для mobile (localhost:9013)
- Кнопка 🧑 Кабинет — popup для /tourist/*
- ▶ API (уже есть)
- Генерация ~150 tourist-сценариев из шаблонов.
- Тулбар: Watch-кнопка-заглушка (планируется фаза 2).
После этого коммита — фаза 1 готова на ~60%. Остаток (генерация партнёрских) — отдельные PR.