Files
2025-08-20 18:28:10 +03:00
..
2025-08-20 18:28:10 +03:00
2025-08-20 11:19:27 +03:00
2025-08-20 11:19:27 +03:00
2025-08-20 18:28:10 +03:00
2025-08-02 15:25:25 +03:00
2025-07-21 00:23:59 +03:00
2025-07-21 00:23:59 +03:00
2025-08-02 15:25:25 +03:00
2025-08-02 15:25:25 +03:00

Тесты для AiTransactionProcessingService

Данная тестовая система покрывает функциональность обработки SMS сообщений с помощью ИИ.

Структура тестов

Unit тесты (test/services/)

  • ai_transaction_processing_service_test.dart - основные unit тесты
    • Тестирование валидации данных от ИИ
    • Проверка парсинга ответов
    • Создание правил из обработанных транзакций
    • Обработка ошибок и граничных случаев

Интеграционные тесты (test/integration/)

  • ai_processing_integration_test.dart - тесты с реальным ИИ
    • Обработка реальных SMS с помощью OpenRouter
    • Тестирование производительности
    • Обработка ошибок API

Вспомогательные файлы (test/helpers/)

  • test_data.dart - примеры SMS сообщений
  • ai_responses.dart - заготовленные ответы ИИ
  • test_objects.dart - фабрика тестовых объектов

Моки и фейки (test/mocks/)

  • mocks.dart - автогенерированные моки
  • fake_ai_service.dart - настраиваемый фейковый AI сервис
  • fake_repositories.dart - in-memory репозитории

Настройка для запуска

1. Установка зависимостей

flutter pub get
flutter packages pub run build_runner build

2. Конфигурация AI токенов (опционально)

Скопируйте .env.example в .env и заполните:

cp .env.example .env

Добавьте ваш API ключ:

OPENROUTER_API_KEY=your_api_key_here
RUN_INTEGRATION_TESTS=true

3. Запуск тестов

Unit тесты (быстрые, не требуют AI):

flutter test test/services/

Все тесты включая интеграционные:

flutter test

Только интеграционные тесты:

flutter test test/integration/

Типы тестов

🏃‍♂️ Unit тесты (всегда запускаются)

  • Используют моки и фейки
  • Быстрые (< 1 секунды)
  • Не требуют внешних зависимостей
  • Покрывают всю логику валидации и парсинга

🌐 Интеграционные тесты (требуют настройки)

  • Используют реальный AI сервис
  • Медленные (могут занимать минуты)
  • Требуют AI API ключ
  • Тестируют реальное взаимодействие с OpenRouter

Конфигурация CI/CD

GitHub Actions

Добавьте в секреты репозитория:

AI_API_KEY=your_openrouter_key
RUN_INTEGRATION_TESTS=true

Локальная разработка

# Только unit тесты
flutter test test/services/

# С интеграционными (если настроен .env)
RUN_INTEGRATION_TESTS=true flutter test

Тестовые данные

SMS сообщения (TestSmsData)

  • Транзакционные: покупки, снятие наличных, переводы
  • Не-транзакционные: реклама, уведомления, коды подтверждения
  • Граничные случаи: пустые сообщения, эмодзи, иностранные языки

Ответы ИИ (TestAiResponses)

  • Корректные ответы для каждого типа SMS
  • Некорректные форматы для тестирования обработки ошибок
  • Автоматическое сопоставление SMS -> ответ ИИ

Тестовые объекты (TestObjects)

  • Готовые категории, транзакции, правила
  • Фабричные методы для создания объектов
  • Консистентные данные для всех тестов

Отладка тестов

Включить подробные логи:

VERBOSE_TESTS=true flutter test

Запустить конкретный тест:

flutter test test/services/ai_transaction_processing_service_test.dart -n "should process transaction SMS"

Пропустить интеграционные тесты:

RUN_INTEGRATION_TESTS=false flutter test

Покрытие кода

Тесты покрывают:

  • Парсинг ответов ИИ
  • Валидация данных транзакций и не-транзакций
  • Создание PrefilledTransaction объектов
  • Генерация AI правил
  • Обработка ошибок и исключений
  • Интеграция с репозиториями
  • Реальные запросы к ИИ (в интеграционных тестах)

Добавление новых тестов

  1. Unit тесты: добавьте в ai_transaction_processing_service_test.dart
  2. Новые SMS примеры: обновите test_data.dart
  3. Новые ответы ИИ: обновите ai_responses.dart
  4. Интеграционные сценарии: добавьте в ai_processing_integration_test.dart

Известные ограничения

  • Интеграционные тесты требуют рабочего интернета
  • API ключи не должны коммититься в репозиторий
  • Некоторые тесты могут быть медленными из-за ограничений AI API
  • В CI окружении интеграционные тесты могут быть отключены