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:
- Отправить команду /start в бот
- Проверить ответ бота
- Проверить запись в БД
Expected Result:
- Бот отвечает экраном настроек
- В таблице
usersсоздана запись с telegram_id - Поля
first_name,language_codeзаполнены -
created_atустановлен
TC-002: Повторный /start не дублирует пользователя¶
Приоритет: P1 Тип: Functional Связь: US-001
Preconditions:
- Пользователь уже существует в БД
Steps:
- Отправить команду /start
- Проверить количество записей в БД
Expected Result:
- Бот отвечает экраном настроек
- В БД ровно одна запись с данным telegram_id
- Данные пользователя не изменились
TC-003: Смена языка применяется¶
Приоритет: P1 Тип: Functional Связь: US-002
Preconditions:
- Пользователь существует с language_code = "ru"
Steps:
- Открыть /settings
- Нажать кнопку "Язык"
- Выбрать "English"
- Отправить любое сообщение
Expected Result:
- Настройки обновились на английский интерфейс
- В БД
language_code= "en" - Ответ агента на английском языке
TC-004: Смена режима ответа (text → voice)¶
Приоритет: P2 Тип: Functional Связь: US-003
Preconditions:
- response_mode = "text"
Steps:
- Открыть /settings
- Нажать кнопку "Режим"
- Выбрать "Голос"
- Отправить текстовое сообщение агенту
Expected Result:
- В БД
response_mode= "voice" - Агент отвечает голосовым сообщением
- Показывается текстовая транскрипция (если show_transcript = true)
TC-005: Настройки сохраняются в БД¶
Приоритет: P1 Тип: Integration Связь: US-003
Preconditions:
- Пользователь существует
Steps:
- Изменить язык на "en"
- Изменить режим на "voice"
- Изменить пол голоса на "male"
- Изменить скорость на "1.2"
- Перезапустить бота (/start)
- Открыть /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:
- Отправить команду /checkin
Expected Result:
- Показывается персонализированное приветствие
- Отображается изображение (если доступно)
- Показаны 3 кнопки: Быстро, Средняя, Полная
- Есть кнопка "Отмена"
TC-007: Короткий check-in отправляет промпт¶
Приоритет: P1 Тип: Integration Связь: US-004
Preconditions:
- Пользователь на экране выбора длительности /checkin
Steps:
- Нажать кнопку "Быстро (1-2 мин)"
Expected Result:
- Загружается промпт из
check-in-short.md - Плейсхолдеры заменены ({{user_name}} и др.)
- Промпт отправлен в чат (может быть разбит на части)
- Состояние агента = IN_SESSION_SHORT
TC-008: Средний check-in отправляет промпт¶
Приоритет: P1 Тип: Integration Связь: US-004
Preconditions:
- Пользователь на экране выбора длительности /checkin
Steps:
- Нажать кнопку "Средняя (3-5 мин)"
Expected Result:
- Загружается промпт из
check-in-medium.md - Промпт отправлен в чат
- Состояние агента = IN_SESSION_MEDIUM
TC-009: Полный check-in отправляет промпт¶
Приоритет: P1 Тип: Integration Связь: US-005
Preconditions:
- Пользователь на экране выбора длительности /checkin
Steps:
- Нажать кнопку "Полная (10+ мин)"
Expected Result:
- Загружается промпт из
check-in-unlimited.md - Промпт отправлен в чат
- Состояние агента = IN_SESSION_UNLIMITED
TC-010: /checkout показывает выбор длительности¶
Приоритет: P1 Тип: Functional Связь: US-006
Preconditions:
- Пользователь авторизован
Steps:
- Отправить команду /checkout
Expected Result:
- Показывается персонализированное приветствие
- Показаны 3 кнопки: Быстро, Средняя, Полная
- Текст приветствия отличается от /checkin
TC-011: Checkout устанавливает состояние OUT_SESSION¶
Приоритет: P1 Тип: Integration Связь: US-006
Preconditions:
- Пользователь на экране выбора длительности /checkout
Steps:
- Нажать кнопку "Средняя (3-5 мин)"
- Проверить состояние агента через API
Expected Result:
- Загружается промпт из
check-out-medium.md - Состояние агента = OUT_SESSION_MEDIUM
- Агент анализирует торговый день
TC-012: Персонализированное приветствие генерируется¶
Приоритет: P2 Тип: Integration Связь: US-007
Preconditions:
- Пользователь с заполненным профилем
- Агент имеет заметки о пользователе
Steps:
- Отправить /checkin
- Проверить текст приветствия
Expected Result:
- Приветствие содержит имя пользователя
- Приветствие уникальное (не шаблон)
- Учитывается время суток
- Генерация через OpenAI GPT-4o-mini
Практики осознанности (TC-013 — TC-024)¶
TC-013: /meditate показывает 4 категории¶
Приоритет: P1 Тип: Functional Связь: US-008
Preconditions:
- Пользователь авторизован
Steps:
- Отправить команду /meditate
Expected Result:
- Показывается персонализированное приветствие
- Отображается изображение
- Показаны 4 кнопки категорий:
- 🌬️ Дыхательные упражнения
- 📿 Общие практики
- 🎯 Ситуативные (эмоции)
- 📖 Справка и методология
TC-014: Категория "Дыхательные" показывает 5 техник¶
Приоритет: P1 Тип: Functional Связь: US-009
Preconditions:
- Пользователь на экране выбора категории
Steps:
- Нажать кнопку "🌬️ Дыхательные упражнения"
Expected Result:
- Показаны 5 кнопок с техниками:
- Физиологический вздох
- Квадратное дыхание
- Дыхание 4-7-8
- Когерентное дыхание
- Удлинённый выдох
- Есть кнопка "Назад"
TC-015: Выбор техники показывает длительности¶
Приоритет: P1 Тип: Functional Связь: US-009
Preconditions:
- Пользователь в категории "Дыхательные"
Steps:
- Нажать кнопку "Квадратное дыхание"
Expected Result:
- Показывается описание техники
- Показаны 3 кнопки длительности: 3 мин, 5 мин, 10 мин
- Есть кнопка "Назад"
TC-016: Кнопка "Техника" отправляет объяснение¶
Приоритет: P1 Тип: Integration Связь: US-010
Preconditions:
- Пользователь выбрал технику и длительность
Steps:
- Нажать кнопку "Техника"
Expected Result:
- Отправляется голосовое сообщение с объяснением
- Аудио на языке пользователя (ru/en)
- Голос соответствует настройкам (м/ж)
- Показывается транскрипция
- Появляется кнопка "Выполнить"
TC-017: Кнопка "Выполнить" отправляет аудио¶
Приоритет: P1 Тип: Integration Связь: US-010
Preconditions:
- Пользователь выбрал технику и длительность
Steps:
- Нажать кнопку "Выполнить"
Expected Result:
- Показывается инструкция "Найди удобное положение..."
- Отправляется голосовое сообщение с практикой
- Формат: OGG Opus
- Длительность соответствует выбранной (3/5/10 мин)
- После 5 секунд появляется кнопка "Готово"
TC-018: Кнопка "Готово" (дыхание) устанавливает BREATHE_FEEDBACK¶
Приоритет: P1 Тип: Integration Связь: US-013
Preconditions:
- Пользователь завершил дыхательную практику, видит кнопку "Готово"
Steps:
- Нажать кнопку "Готово"
- Проверить состояние агента
Expected Result:
- Кнопка "Готово" удаляется из сообщения
- Состояние агента = BREATHE_FEEDBACK
- Контекст содержит: technique, duration
- Агент отправляет сообщение "[Практика завершена]"
- Агент спрашивает об ощущениях
TC-019: Категория "Общие практики" показывает 6 медитаций¶
Приоритет: P1 Тип: Functional Связь: US-011
Preconditions:
- Пользователь на экране выбора категории
Steps:
- Нажать кнопку "📿 Общие практики"
Expected Result:
- Показаны 6 кнопок медитаций:
- Утренняя настройка
- Вечерняя рефлексия
- Визуализация успеха
- Развитие терпения
- Принятие результатов
- Отстранённость от рынка
- Есть кнопка "Справка"
- Есть кнопка "Назад"
TC-020: Категория "Ситуативные" показывает 8 медитаций¶
Приоритет: P1 Тип: Functional Связь: US-011
Preconditions:
- Пользователь на экране выбора категории
Steps:
- Нажать кнопку "🎯 Ситуативные (эмоции)"
Expected Result:
- Показаны 8 кнопок медитаций:
- Сброс после убытка
- Предотвращение тильта
- Сброс овертрейдинга
- Работа с FOMO
- Риск-менеджмент
- Месть рынку
- Тревога от прибыли
- Паралич анализа
- Есть кнопка "Справка"
- Есть кнопка "Назад"
TC-021: Выбор медитации генерирует аудио¶
Приоритет: P1 Тип: Integration Связь: US-012
Preconditions:
- Пользователь в категории "Общие практики"
Steps:
- Нажать кнопку "Утренняя настройка"
- Дождаться генерации
Expected Result:
- Показывается "Генерируем..."
- Показывается typing indicator
- Запрос к API
/meditation-audio/execution - Аудио генерируется за <10 секунд
TC-022: Аудио отправляется как voice message¶
Приоритет: P1 Тип: Integration Связь: US-012
Preconditions:
- Аудио медитации сгенерировано
Steps:
- Проверить отправленное сообщение
Expected Result:
- Сообщение типа "voice"
- Формат: OGG Opus
- Длительность ~5-7 минут
- Показывается инструкция перед аудио
TC-023: Кнопка "Готово" (медитация) устанавливает MEDITATE_FEEDBACK¶
Приоритет: P1 Тип: Integration Связь: US-014
Preconditions:
- Пользователь прослушал медитацию, видит кнопку "Готово"
Steps:
- Нажать кнопку "Готово"
- Проверить состояние агента
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:
- Запросить медитацию через API
- Проверить наличие фонового звука
Expected Result:
- Голос медитации слышен чётко
- Фоновый звук на ~30% громкости
- Звуки не мешают восприятию инструкций
- Выбирается случайный ambient из 10
AI Agent (TC-025 — TC-028)¶
TC-025: Текстовое сообщение получает ответ¶
Приоритет: P1 Тип: E2E Связь: US-015
Preconditions:
- Пользователь авторизован
- Состояние агента = IDLE
Steps:
- Отправить текст: "Привет, как дела?"
- Дождаться ответа
Expected Result:
- Показывается индикатор набора текста
- Ответ приходит за <5 секунд
- Ответ релевантный и персонализированный
- Сообщения сохраняются в БД (user и bot)
TC-026: Голосовое сообщение транскрибируется¶
Приоритет: P1 Тип: Integration Связь: US-016
Preconditions:
- Пользователь авторизован
Steps:
- Отправить голосовое сообщение (10 секунд)
- Дождаться обработки
Expected Result:
- Сообщение принято
- Транскрипция через Whisper
- Аудио загружено в MinIO
- Транскрипция отправлена агенту
- Ответ получен
TC-027: Voice mode отправляет TTS ответ¶
Приоритет: P1 Тип: Integration Связь: US-016
Preconditions:
- response_mode = "voice"
- tts_provider = "openai"
- tts_voice = "nova"
Steps:
- Отправить текстовое сообщение агенту
- Проверить формат ответа
Expected Result:
- Ответ приходит как voice message
- Голос соответствует настройкам (nova)
- Скорость соответствует настройкам
- Текст показывается (если show_transcript = true)
TC-028: Состояние агента меняется корректно¶
Приоритет: P1 Тип: Integration Связь: US-015
Preconditions:
- Пользователь авторизован
Steps:
- Проверить состояние = IDLE
- Выполнить /checkin → short
- Проверить состояние = IN_SESSION_SHORT
- Завершить сессию
- Проверить состояние = IDLE
Expected Result:
- Состояния меняются корректно
- Переходы логируются
- Контекст передаётся при смене состояния
Управление (TC-029 — TC-030)¶
TC-029: /reset удаляет сообщения из Telegram¶
Приоритет: P2 Тип: E2E Связь: US-018
Preconditions:
- Пользователь имеет историю сообщений с ботом
Steps:
- Отправить команду /reset
- Подтвердить действие
- Проверить чат
Expected Result:
- Сообщения удалены из Telegram чата
- Записи удалены из БД (таблица messages)
- Заметки агента сброшены
- Состояние агента = IDLE
- Показывается подтверждение
TC-030: /users показывает список (admin only)¶
Приоритет: P2 Тип: Functional Связь: US-020
Preconditions:
- Пользователь с is_admin = true
Steps:
- Отправить команду /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