# Пользовательские истории — ручные тестовые вебхуки

Документ описывает реализованные сценарии уровня продукта для `webhook-test-events`. См. также [описание функции](/docs#webhook-test-events/description) и [API](/docs#webhook-test-events/apireference).

---

## US-1 — Отправить ручной тестовый вебхук

**Как** разработчик HTTP-обработчика,  
**я хочу** отправить тестовый POST из инспектора на мой туннель или inbox,  
**чтобы** проверить код и тело ответа без внешнего провайдера.

**Поддерживается:** да.

**Поведение**

- Панель на `/dashboard/tunnels/<tunnel_id>/inspector` для HTTP/HTTPS-эндпоинта, на вкладке **Тест** (рядом с **События** и **Настройки**).
- Поля: метод (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `HEAD`, `OPTIONS`), путь, query, content-type, заголовки, тело; кнопка **Send test**.
- Несохранённый запрос остаётся в форме при переключении вкладок; выбор встроенного примера поверх изменённых полей спрашивает подтверждение.
- Успешная отправка возвращает `event_id` и открывает детали события в инспекторе.
- Для inbox «только хранение» ответ в событии — «сохранено»; для активного туннеля — реальный downstream status.

---

## US-2 — Создать и управлять сохранёнными шаблонами

**Как** QA-инженер,  
**я хочу** сохранить типовой запрос как шаблон и редактировать его с версиями,  
**чтобы** не вводить одни и те же поля перед каждым прогоном.

**Поддерживается:** да.

**Поведение**

- Создание, список, чтение, обновление и удаление через API или блок **Saved webhook templates** в панели.
- Сохранение шаблона возможно, даже если клиент туннеля не подключён или доставка inbox временно недоступна; **Run** и ручная отправка проверяют цель отдельно.
- Имя уникально на эндпоинт; при параллельном редактировании нужна актуальная `version` (конфликт — `409 stale_version` с понятным текстом в UI).
- До 100 шаблонов на аккаунт, до 50 тегов, поле «пример результата»; метод — только из списка поддерживаемых, устаревший метод в старом шаблоне нужно заменить перед сохранением.

---

## US-3 — Сохранить событие инспектора как шаблон

**Как** интегратор,  
**я хочу** превратить зафиксированный вебхук в очищенный шаблон,  
**чтобы** воспроизводить сценарий без копирования секретов вручную.

**Поддерживается:** да.

**Поведение**

- Кнопка **Save as template** в деталях HTTP-события или `POST /templates/from-event`.
- Сервис маскирует чувствительные query/JSON поля и показывает `redacted_fields`.
- Исходное событие не изменяется.
- Непрозрачное или обрезанное тело требует «не включать» или заменить перед сохранением.

---

## US-4 — Запустить сохранённый шаблон

**Как** разработчик,  
**я хочу** выполнить шаблон одной кнопкой,  
**чтобы** быстро проверить регрессию после деплоя.

**Поддерживается:** да.

**Поведение**

- **Run** в библиотеке или `POST /templates/<id>/run`.
- Создаётся новое событие с тегами `webhook-test-event` и `webhook-template:<id>`.
- Шаблон при запуске не изменяется; цель — текущий эндпоинт шаблона.

---

## US-5 — Использовать встроенные примеры запросов

**Как** новый пользователь,  
**я хочу** выбрать готовый пример (валидный JSON, битый JSON, пустой POST),  
**чтобы** быстро начать тест без знания формата провайдера.

**Поддерживается:** да.

**Поведение**

- Селектор **Built-in webhook example** в панели или `GET /builtins`.
- Четыре примера с фиксированными id; не редактируются через API.
- Выбор примера заполняет поля ручного редактора; если поля уже изменены, интерфейс запрашивает подтверждение замены.

---

## US-6 — Доступ по тарифу, безопасность и ограничения

**Как** владелец аккаунта,  
**я хочу** чтобы тесты были доступны только на моём тарифе и не раскрывали секреты,  
**чтобы** снизить риск злоупотреблений и утечек.

**Поддерживается:** да.

**Поведение**

- Требуется вход; мутации из браузера — CSRF-токен.
- Без возможности `webhook-test-events` — отказ API и скрытая панель.
- Абсолютные пути, недопустимые HTTP-методы, лимит 32 КБ, санитизация заголовков и секретных полей, лимит частоты HTTP.
- Ошибки **409** в панели показывают отдельный текст для каждого `code` (`stale_version`, `template_name_conflict`, `template_quota_exceeded`, `template_tag_limit`, `endpoint_unavailable`), а не общее «конфликт».
- Шаблоны и события других пользователей не читаются (404).
- Из инспектора inbox настройки доставки открываются через пункт **Webhook inbox** в боковом меню (`/dashboard/webhook-inbox`).

**См. также:** [ошибки](/docs#webhook-test-events/errorreference), [ограничения](/docs#webhook-test-events/knownlimitations).
