Промокоды

Создание в dashboard, активация через /promo и deep link, feature overrides, права, валидация

0
Critical
0
High
0
Medium
0
Total
Статус:
Passed
Failed
Skipped
Pending

Путь: Создание промокода через Dashboard

PROMO-01Создание базового промокода через dashboard

Предусловия

Залогинен как super в https://dashboard.agent-os.space/admin/. Вкладка Promo видна.

Шаги

  1. Открой вкладку Promo
  2. Нажми Создать
  3. Заполни: код TESTBASIC7, тариф max, длительность 7 дней
  4. Нажми Создать

Ожидаемый результат

Модалка закрывается. Код появляется в таблице со статусом «активен», лимит «0/∞». Видна готовая deep-link для копирования.
PROMO-02Создание с лимитом активаций и сроком

Предусловия

Открыта модалка создания.

Шаги

  1. Код TEST_LIM3, тариф pro, длительность 30 дней
  2. Лимит активаций: 3
  3. Промокод действует до: завтра (через date-picker)
  4. Создать

Ожидаемый результат

Код создан. В таблице: max_uses=3, expires=завтрашняя дата. Date-picker открывает нативный календарь без выбора времени.
PROMO-03Создание с feature_overrides через чекбоксы

Предусловия

Модалка создания. Тариф free.

Шаги

  1. Код FREE_PLUS_GROUPS, тариф free, длительность 7
  2. В блоке «Дополнительные фичи» отметь чекбоксы: Группы, Opus models
  3. Создать

Ожидаемый результат

Код создан. В детали (открой по клику): plan=free, overrides={groups: true, opus_access: true}.
PROMO-04Дубликат кода — отказ с 409

Предусловия

Уже существует код TESTBASIC7.

Шаги

  1. Попробуй создать ещё один TESTBASIC7 (любые остальные поля)

Ожидаемый результат

Красная ошибка под формой: «Code already exists». Модалка не закрывается. В БД дубль не появляется.
PROMO-05Невалидный план — отказ с 400

Предусловия

UI ограничивает выбор select-ом, но проверяем через прямой API.

Шаги

  1. POST /api/admin/promo с plan: "fake"

Ожидаемый результат

HTTP 400, detail содержит список валидных планов: free, pro, max, ultra, unlimited.

Путь: Активация юзером

PROMO-10Активация через /promo CODE

Предусловия

В системе есть активный код TESTBASIC7 (plan=max, 7d). Юзер уже онбордился, тариф free.

Шаги

  1. Юзер пишет боту /promo TESTBASIC7

Ожидаемый результат

Бот отвечает «Активирован тариф max до DD.MM.YYYY». В БД у юзера plan=max, valid_until = now + 7d. В Dashboard у промо used_count = 1.
PROMO-11Активация через deep link (онбордившийся юзер)

Предусловия

Юзер уже онбордился (плюс знаком с ботом). Скопирована ссылка https://t.me/<bot>?start=promo_TESTBASIC7.

Шаги

  1. Юзер открывает ссылку в браузере → Telegram → жмёт «Запустить»

Ожидаемый результат

Бот сразу пишет «Активирован тариф max до …», далее показывает главное меню. Используется одна активация промо.
PROMO-12Активация через deep link до онбординга (новый юзер)

Предусловия

Юзер ещё не онбордился (никогда не писал боту).

Шаги

  1. Открой deep link ?start=promo_TESTBASIC7

Ожидаемый результат

Бот сначала активирует код (сообщение «Активирован …»), затем запускает онбординг. В БД у юзера применённый тариф ещё до завершения онбординга.
PROMO-13Feature overrides применяются при активации

Предусловия

Создан код FREE_PLUS_GROUPS (free + overrides: groups=true, opus_access=true).

Шаги

  1. Юзер активирует /promo FREE_PLUS_GROUPS
  2. Юзер добавляет бота в группу, делает /start
  3. Юзер пишет боту через @ в группе

Ожидаемый результат

План остаётся free, но группа работает (обычно не доступна на free). В сообщении активации видна строка «доп. опции: groups, opus_access».
PROMO-14Повторная активация одним и тем же юзером

Предусловия

Юзер уже активировал TESTBASIC7.

Шаги

  1. Юзер пишет /promo TESTBASIC7 повторно

Ожидаемый результат

Бот: «Ты уже активировал этот промокод». used_count не растёт.
PROMO-15Промокод исчерпан (max_uses достигнут)

Предусловия

Код с max_uses=1, уже активирован одним юзером.

Шаги

  1. Другой юзер пишет /promo TEST_LIM1

Ожидаемый результат

Бот: «Промокод исчерпан — все активации израсходованы». План юзера не меняется.
PROMO-16Промокод истёк (valid_until в прошлом)

Предусловия

Код с valid_until = вчера.

Шаги

  1. Юзер активирует через /promo или deep link

Ожидаемый результат

Бот: «Срок промокода истёк». Активация не выполняется.
PROMO-17Деактивированный код

Предусловия

Админ в Dashboard нажал кнопку power-off у промо → is_active=false.

Шаги

  1. Юзер пишет /promo CODE

Ожидаемый результат

Бот: «Промокод деактивирован». Активация не выполняется.
PROMO-18Несуществующий код

Предусловия

Кода NOPE123 нет в БД.

Шаги

  1. /promo NOPE123
  2. Открыть deep link ?start=promo_NOPE123

Ожидаемый результат

В обоих случаях: «Промокод не найден». Активация не выполняется.

Путь: Управление в Dashboard

PROMO-20Toggle активен/выключен

Предусловия

В списке промокодов есть активный код.

Шаги

  1. Нажми иконку power-off у строки
  2. Нажми иконку power обратно

Ожидаемый результат

После клика статус строки переключается без перезагрузки. PATCH /api/admin/promo/<code> с is_active=false/true.
PROMO-21Detail-модалка с историей активаций

Предусловия

У промо есть >= 1 активация.

Шаги

  1. Клик на код в таблице (или на иконку шеврона)

Ожидаемый результат

Модалка с info-блоком (plan, days, uses, expires, статус, notes, overrides) + таблица активаций (User → @username/имя, Активирован, Действует до). Сортировка — свежие сверху.
PROMO-22Copy deep link

Предусловия

В таблице есть промо.

Шаги

  1. Нажми иконку copy в строке
  2. Вставь из буфера в любом редакторе

Ожидаемый результат

В буфере: https://t.me/<bot_username>?start=promo_<CODE>. Bot_username берётся из /api/admin/bot-info.
PROMO-23Hint про тариф меняется при выборе плана

Предусловия

Открыта модалка создания.

Шаги

  1. Переключай select «Тариф»: free → pro → max → ultra → unlimited

Ожидаемый результат

Под select-ом подпись меняется на соответствующий хинт (free=Haiku/Sonnet…, pro=Группы+Opus…, и т.д.).

Путь: Права и доступ

PROMO-30Вкладка Promo видна только super

Предусловия

В Dashboard есть три admin-юзера: super, ops, business.

Шаги

  1. Логин под ops → проверь навигацию
  2. Логин под business → проверь навигацию
  3. Логин под super → проверь навигацию

Ожидаемый результат

Вкладка «Promo» видна только super (permission admin_mgmt). У ops/business её нет, прямой переход на /admin/promo показывает «Access denied — missing permission: admin_mgmt».
PROMO-31Admin-команды в боте — только ADMIN_ID

Предусловия

Юзер X не равен ADMIN_ID.

Шаги

  1. Юзер X: /promonew TEST max 7
  2. Юзер X: /promolist
  3. Юзер X: /promoinfo CODE
  4. Юзер X: /promooff CODE
  5. Юзер X: /give @other max 7

Ожидаемый результат

Бот игнорирует команды (молча не отвечает). В БД ничего не создаётся, никаких прав не выдаётся.
PROMO-32Юзеры могут активировать /promo (не админ)

Предусловия

Юзер не админ.

Шаги

  1. Юзер: /promo CODE

Ожидаемый результат

Активация работает как обычно. /promo доступна всем, в отличие от админских команд.