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

Test Cases: CalmTrader MVP

Версия: 1.0 Дата: 13.01.2026 Количество: 30 test cases


Формат Test Case

Поле Описание
ID Уникальный идентификатор TC-XXX
Название Краткое описание теста
Приоритет P1 (критичный), P2 (важный), P3 (желательный)
Тип Functional, Integration, E2E
Preconditions Предусловия для теста
Steps Шаги выполнения
Expected Result Ожидаемый результат
Связь User Story (US-XXX)

Онбординг (TC-001 — TC-005)

TC-001: Первый /start создаёт пользователя

Приоритет: P1 Тип: Integration Связь: US-001

Preconditions:

  • Пользователь не существует в БД
  • Telegram ID: новый

Steps:

  1. Отправить команду /start в бот
  2. Проверить ответ бота
  3. Проверить запись в БД

Expected Result:

  • Бот отвечает экраном настроек
  • В таблице users создана запись с telegram_id
  • Поля first_name, language_code заполнены
  • created_at установлен

TC-002: Повторный /start не дублирует пользователя

Приоритет: P1 Тип: Functional Связь: US-001

Preconditions:

  • Пользователь уже существует в БД

Steps:

  1. Отправить команду /start
  2. Проверить количество записей в БД

Expected Result:

  • Бот отвечает экраном настроек
  • В БД ровно одна запись с данным telegram_id
  • Данные пользователя не изменились

TC-003: Смена языка применяется

Приоритет: P1 Тип: Functional Связь: US-002

Preconditions:

  • Пользователь существует с language_code = "ru"

Steps:

  1. Открыть /settings
  2. Нажать кнопку "Язык"
  3. Выбрать "English"
  4. Отправить любое сообщение

Expected Result:

  • Настройки обновились на английский интерфейс
  • В БД language_code = "en"
  • Ответ агента на английском языке

TC-004: Смена режима ответа (text → voice)

Приоритет: P2 Тип: Functional Связь: US-003

Preconditions:

  • response_mode = "text"

Steps:

  1. Открыть /settings
  2. Нажать кнопку "Режим"
  3. Выбрать "Голос"
  4. Отправить текстовое сообщение агенту

Expected Result:

  • В БД response_mode = "voice"
  • Агент отвечает голосовым сообщением
  • Показывается текстовая транскрипция (если show_transcript = true)

TC-005: Настройки сохраняются в БД

Приоритет: P1 Тип: Integration Связь: US-003

Preconditions:

  • Пользователь существует

Steps:

  1. Изменить язык на "en"
  2. Изменить режим на "voice"
  3. Изменить пол голоса на "male"
  4. Изменить скорость на "1.2"
  5. Перезапустить бота (/start)
  6. Открыть /settings

Expected Result:

  • Все настройки сохранены в БД
  • После перезапуска настройки отображаются корректно
  • language_code = "en"
  • response_mode = "voice"
  • voice_gender = "male"
  • tts_speed = 1.2

Check-in / Checkout (TC-006 — TC-012)

TC-006: /checkin показывает выбор длительности

Приоритет: P1 Тип: Functional Связь: US-004

Preconditions:

  • Пользователь авторизован

Steps:

  1. Отправить команду /checkin

Expected Result:

  • Показывается персонализированное приветствие
  • Отображается изображение (если доступно)
  • Показаны 3 кнопки: Быстро, Средняя, Полная
  • Есть кнопка "Отмена"

TC-007: Короткий check-in отправляет промпт

Приоритет: P1 Тип: Integration Связь: US-004

Preconditions:

  • Пользователь на экране выбора длительности /checkin

Steps:

  1. Нажать кнопку "Быстро (1-2 мин)"

Expected Result:

  • Загружается промпт из check-in-short.md
  • Плейсхолдеры заменены ({{user_name}} и др.)
  • Промпт отправлен в чат (может быть разбит на части)
  • Состояние агента = IN_SESSION_SHORT

TC-008: Средний check-in отправляет промпт

Приоритет: P1 Тип: Integration Связь: US-004

Preconditions:

  • Пользователь на экране выбора длительности /checkin

Steps:

  1. Нажать кнопку "Средняя (3-5 мин)"

Expected Result:

  • Загружается промпт из check-in-medium.md
  • Промпт отправлен в чат
  • Состояние агента = IN_SESSION_MEDIUM

TC-009: Полный check-in отправляет промпт

Приоритет: P1 Тип: Integration Связь: US-005

Preconditions:

  • Пользователь на экране выбора длительности /checkin

Steps:

  1. Нажать кнопку "Полная (10+ мин)"

Expected Result:

  • Загружается промпт из check-in-unlimited.md
  • Промпт отправлен в чат
  • Состояние агента = IN_SESSION_UNLIMITED

TC-010: /checkout показывает выбор длительности

Приоритет: P1 Тип: Functional Связь: US-006

Preconditions:

  • Пользователь авторизован

Steps:

  1. Отправить команду /checkout

Expected Result:

  • Показывается персонализированное приветствие
  • Показаны 3 кнопки: Быстро, Средняя, Полная
  • Текст приветствия отличается от /checkin

TC-011: Checkout устанавливает состояние OUT_SESSION

Приоритет: P1 Тип: Integration Связь: US-006

Preconditions:

  • Пользователь на экране выбора длительности /checkout

Steps:

  1. Нажать кнопку "Средняя (3-5 мин)"
  2. Проверить состояние агента через API

Expected Result:

  • Загружается промпт из check-out-medium.md
  • Состояние агента = OUT_SESSION_MEDIUM
  • Агент анализирует торговый день

TC-012: Персонализированное приветствие генерируется

Приоритет: P2 Тип: Integration Связь: US-007

Preconditions:

  • Пользователь с заполненным профилем
  • Агент имеет заметки о пользователе

Steps:

  1. Отправить /checkin
  2. Проверить текст приветствия

Expected Result:

  • Приветствие содержит имя пользователя
  • Приветствие уникальное (не шаблон)
  • Учитывается время суток
  • Генерация через OpenAI GPT-4o-mini

Практики осознанности (TC-013 — TC-024)

TC-013: /meditate показывает 4 категории

Приоритет: P1 Тип: Functional Связь: US-008

Preconditions:

  • Пользователь авторизован

Steps:

  1. Отправить команду /meditate

Expected Result:

  • Показывается персонализированное приветствие
  • Отображается изображение
  • Показаны 4 кнопки категорий:
  • 🌬️ Дыхательные упражнения
  • 📿 Общие практики
  • 🎯 Ситуативные (эмоции)
  • 📖 Справка и методология

TC-014: Категория "Дыхательные" показывает 5 техник

Приоритет: P1 Тип: Functional Связь: US-009

Preconditions:

  • Пользователь на экране выбора категории

Steps:

  1. Нажать кнопку "🌬️ Дыхательные упражнения"

Expected Result:

  • Показаны 5 кнопок с техниками:
  • Физиологический вздох
  • Квадратное дыхание
  • Дыхание 4-7-8
  • Когерентное дыхание
  • Удлинённый выдох
  • Есть кнопка "Назад"

TC-015: Выбор техники показывает длительности

Приоритет: P1 Тип: Functional Связь: US-009

Preconditions:

  • Пользователь в категории "Дыхательные"

Steps:

  1. Нажать кнопку "Квадратное дыхание"

Expected Result:

  • Показывается описание техники
  • Показаны 3 кнопки длительности: 3 мин, 5 мин, 10 мин
  • Есть кнопка "Назад"

TC-016: Кнопка "Техника" отправляет объяснение

Приоритет: P1 Тип: Integration Связь: US-010

Preconditions:

  • Пользователь выбрал технику и длительность

Steps:

  1. Нажать кнопку "Техника"

Expected Result:

  • Отправляется голосовое сообщение с объяснением
  • Аудио на языке пользователя (ru/en)
  • Голос соответствует настройкам (м/ж)
  • Показывается транскрипция
  • Появляется кнопка "Выполнить"

TC-017: Кнопка "Выполнить" отправляет аудио

Приоритет: P1 Тип: Integration Связь: US-010

Preconditions:

  • Пользователь выбрал технику и длительность

Steps:

  1. Нажать кнопку "Выполнить"

Expected Result:

  • Показывается инструкция "Найди удобное положение..."
  • Отправляется голосовое сообщение с практикой
  • Формат: OGG Opus
  • Длительность соответствует выбранной (3/5/10 мин)
  • После 5 секунд появляется кнопка "Готово"

TC-018: Кнопка "Готово" (дыхание) устанавливает BREATHE_FEEDBACK

Приоритет: P1 Тип: Integration Связь: US-013

Preconditions:

  • Пользователь завершил дыхательную практику, видит кнопку "Готово"

Steps:

  1. Нажать кнопку "Готово"
  2. Проверить состояние агента

Expected Result:

  • Кнопка "Готово" удаляется из сообщения
  • Состояние агента = BREATHE_FEEDBACK
  • Контекст содержит: technique, duration
  • Агент отправляет сообщение "[Практика завершена]"
  • Агент спрашивает об ощущениях

TC-019: Категория "Общие практики" показывает 6 медитаций

Приоритет: P1 Тип: Functional Связь: US-011

Preconditions:

  • Пользователь на экране выбора категории

Steps:

  1. Нажать кнопку "📿 Общие практики"

Expected Result:

  • Показаны 6 кнопок медитаций:
  • Утренняя настройка
  • Вечерняя рефлексия
  • Визуализация успеха
  • Развитие терпения
  • Принятие результатов
  • Отстранённость от рынка
  • Есть кнопка "Справка"
  • Есть кнопка "Назад"

TC-020: Категория "Ситуативные" показывает 8 медитаций

Приоритет: P1 Тип: Functional Связь: US-011

Preconditions:

  • Пользователь на экране выбора категории

Steps:

  1. Нажать кнопку "🎯 Ситуативные (эмоции)"

Expected Result:

  • Показаны 8 кнопок медитаций:
  • Сброс после убытка
  • Предотвращение тильта
  • Сброс овертрейдинга
  • Работа с FOMO
  • Риск-менеджмент
  • Месть рынку
  • Тревога от прибыли
  • Паралич анализа
  • Есть кнопка "Справка"
  • Есть кнопка "Назад"

TC-021: Выбор медитации генерирует аудио

Приоритет: P1 Тип: Integration Связь: US-012

Preconditions:

  • Пользователь в категории "Общие практики"

Steps:

  1. Нажать кнопку "Утренняя настройка"
  2. Дождаться генерации

Expected Result:

  • Показывается "Генерируем..."
  • Показывается typing indicator
  • Запрос к API /meditation-audio/execution
  • Аудио генерируется за <10 секунд

TC-022: Аудио отправляется как voice message

Приоритет: P1 Тип: Integration Связь: US-012

Preconditions:

  • Аудио медитации сгенерировано

Steps:

  1. Проверить отправленное сообщение

Expected Result:

  • Сообщение типа "voice"
  • Формат: OGG Opus
  • Длительность ~5-7 минут
  • Показывается инструкция перед аудио

TC-023: Кнопка "Готово" (медитация) устанавливает MEDITATE_FEEDBACK

Приоритет: P1 Тип: Integration Связь: US-014

Preconditions:

  • Пользователь прослушал медитацию, видит кнопку "Готово"

Steps:

  1. Нажать кнопку "Готово"
  2. Проверить состояние агента

Expected Result:

  • Кнопка "Готово" удаляется
  • Состояние агента = MEDITATE_FEEDBACK
  • Контекст содержит: meditation
  • Агент спрашивает об ощущениях

TC-024: Ambient звуки добавляются (10 вариантов)

Приоритет: P3 Тип: Integration Связь: US-012

Preconditions:

  • В БД есть 10 ambient звуков (forest, rain, ocean, fire, wind, birds, night, stream, cafe, thunderstorm)

Steps:

  1. Запросить медитацию через API
  2. Проверить наличие фонового звука

Expected Result:

  • Голос медитации слышен чётко
  • Фоновый звук на ~30% громкости
  • Звуки не мешают восприятию инструкций
  • Выбирается случайный ambient из 10

AI Agent (TC-025 — TC-028)

TC-025: Текстовое сообщение получает ответ

Приоритет: P1 Тип: E2E Связь: US-015

Preconditions:

  • Пользователь авторизован
  • Состояние агента = IDLE

Steps:

  1. Отправить текст: "Привет, как дела?"
  2. Дождаться ответа

Expected Result:

  • Показывается индикатор набора текста
  • Ответ приходит за <5 секунд
  • Ответ релевантный и персонализированный
  • Сообщения сохраняются в БД (user и bot)

TC-026: Голосовое сообщение транскрибируется

Приоритет: P1 Тип: Integration Связь: US-016

Preconditions:

  • Пользователь авторизован

Steps:

  1. Отправить голосовое сообщение (10 секунд)
  2. Дождаться обработки

Expected Result:

  • Сообщение принято
  • Транскрипция через Whisper
  • Аудио загружено в MinIO
  • Транскрипция отправлена агенту
  • Ответ получен

TC-027: Voice mode отправляет TTS ответ

Приоритет: P1 Тип: Integration Связь: US-016

Preconditions:

  • response_mode = "voice"
  • tts_provider = "openai"
  • tts_voice = "nova"

Steps:

  1. Отправить текстовое сообщение агенту
  2. Проверить формат ответа

Expected Result:

  • Ответ приходит как voice message
  • Голос соответствует настройкам (nova)
  • Скорость соответствует настройкам
  • Текст показывается (если show_transcript = true)

TC-028: Состояние агента меняется корректно

Приоритет: P1 Тип: Integration Связь: US-015

Preconditions:

  • Пользователь авторизован

Steps:

  1. Проверить состояние = IDLE
  2. Выполнить /checkin → short
  3. Проверить состояние = IN_SESSION_SHORT
  4. Завершить сессию
  5. Проверить состояние = IDLE

Expected Result:

  • Состояния меняются корректно
  • Переходы логируются
  • Контекст передаётся при смене состояния

Управление (TC-029 — TC-030)

TC-029: /reset удаляет сообщения из Telegram

Приоритет: P2 Тип: E2E Связь: US-018

Preconditions:

  • Пользователь имеет историю сообщений с ботом

Steps:

  1. Отправить команду /reset
  2. Подтвердить действие
  3. Проверить чат

Expected Result:

  • Сообщения удалены из Telegram чата
  • Записи удалены из БД (таблица messages)
  • Заметки агента сброшены
  • Состояние агента = IDLE
  • Показывается подтверждение

TC-030: /users показывает список (admin only)

Приоритет: P2 Тип: Functional Связь: US-020

Preconditions:

  • Пользователь с is_admin = true

Steps:

  1. Отправить команду /users

Expected Result:

  • Показывается список пользователей
  • Для каждого: имя, username, последняя активность
  • Сортировка по последней активности
  • Для non-admin команда не работает

Сводная таблица

ID Название Приоритет Тип Статус
TC-001 Первый /start создаёт пользователя P1 Integration
TC-002 Повторный /start не дублирует P1 Functional
TC-003 Смена языка применяется P1 Functional
TC-004 Смена режима (text→voice) P2 Functional
TC-005 Настройки сохраняются в БД P1 Integration
TC-006 /checkin показывает выбор P1 Functional
TC-007 Короткий check-in P1 Integration
TC-008 Средний check-in P1 Integration
TC-009 Полный check-in P1 Integration
TC-010 /checkout показывает выбор P1 Functional
TC-011 Checkout устанавливает состояние P1 Integration
TC-012 Персонализированное приветствие P2 Integration
TC-013 /meditate показывает 4 категории P1 Functional
TC-014 Категория "Дыхательные" показывает 5 техник P1 Functional
TC-015 Выбор техники показывает длительности P1 Functional
TC-016 Кнопка "Техника" отправляет объяснение P1 Integration
TC-017 Кнопка "Выполнить" отправляет аудио P1 Integration
TC-018 Кнопка "Готово" (дыхание) устанавливает BREATHE_FEEDBACK P1 Integration
TC-019 Категория "Общие практики" показывает 6 медитаций P1 Functional
TC-020 Категория "Ситуативные" показывает 8 медитаций P1 Functional
TC-021 Выбор медитации генерирует аудио P1 Integration
TC-022 Аудио отправляется как voice P1 Integration
TC-023 Кнопка "Готово" (медитация) устанавливает MEDITATE_FEEDBACK P1 Integration
TC-024 Ambient звуки добавляются (10 вариантов) P3 Integration
TC-025 Текстовое сообщение получает ответ P1 E2E
TC-026 Голосовое сообщение транскрибируется P1 Integration
TC-027 Voice mode отправляет TTS P1 Integration
TC-028 Состояние агента меняется P1 Integration
TC-029 /reset удаляет сообщения P2 E2E
TC-030 /users показывает список (admin) P2 Functional

Статистика:

  • P1 (критичные): 23
  • P2 (важные): 6
  • P3 (желательные): 1
  • Всего: 30

Документ создан: 13.01.2026 Версия: 1.0