- Added `ca-certificates` installation to Dockerfile for improved network security. - Updated health check command in Dockerfile to include better timeout handling. - Refactored `run_helper.py` to implement proper signal handling and logging during shutdown. - Transitioned database operations to an asynchronous model in `async_db.py`, improving performance and responsiveness. - Updated database schema to support new foreign key relationships and optimized indexing for better query performance. - Enhanced various bot handlers to utilize async database methods, improving overall efficiency and user experience. - Removed obsolete database and fix scripts to streamline the project structure.
9.2 KiB
9.2 KiB
Тесты для PostRepository
Этот документ описывает тесты для PostRepository - репозитория для работы с постами из Telegram.
Структура тестов
1. test_post_repository.py - Unit тесты
Содержит модульные тесты с моками для всех методов PostRepository:
test_create_tables- тест создания таблиц БДtest_add_post_with_date- тест добавления поста с датойtest_add_post_without_date- тест добавления поста без даты (автогенерация)test_add_post_logs_correctly- тест логирования при добавлении постаtest_update_helper_message- тест обновления helper сообщенияtest_add_post_content_success- тест успешного добавления контентаtest_add_post_content_exception- тест обработки исключенийtest_get_post_content_by_helper_id- тест получения контента по helper IDtest_get_post_text_by_helper_id_found- тест получения текста поста (найден)test_get_post_text_by_helper_id_not_found- тест получения текста поста (не найден)test_get_post_ids_by_helper_id- тест получения ID сообщенийtest_get_author_id_by_message_id_found- тест получения ID автора по message ID (найден)test_get_author_id_by_message_id_not_found- тест получения ID автора по message ID (не найден)test_get_author_id_by_helper_message_id_found- тест получения ID автора по helper message ID (найден)test_get_author_id_by_helper_message_id_not_found- тест получения ID автора по helper message ID (не найден)test_create_tables_logs_success- тест логирования успешного создания таблиц
2. test_post_repository_integration.py - Интеграционные тесты
Содержит тесты с реальной базой данных SQLite:
test_create_tables_integration- интеграционный тест создания таблицtest_add_post_integration- интеграционный тест добавления постаtest_add_post_without_date_integration- интеграционный тест добавления поста без датыtest_update_helper_message_integration- интеграционный тест обновления helper сообщенияtest_add_post_content_integration- интеграционный тест добавления контента постаtest_add_post_content_with_helper_message_integration- интеграционный тест добавления контента с helper сообщениемtest_get_post_text_by_helper_id_integration- интеграционный тест получения текста постаtest_get_post_text_by_helper_id_not_found_integration- интеграционный тест получения текста несуществующего постаtest_get_post_ids_by_helper_id_integration- интеграционный тест получения ID сообщенийtest_get_author_id_by_message_id_integration- интеграционный тест получения ID автора по message IDtest_get_author_id_by_message_id_not_found_integration- интеграционный тест получения ID автора несуществующего постаtest_get_author_id_by_helper_message_id_integration- интеграционный тест получения ID автора по helper message IDtest_get_author_id_by_helper_message_id_not_found_integration- интеграционный тест получения ID автора несуществующего helper сообщенияtest_multiple_posts_integration- интеграционный тест работы с несколькими постамиtest_post_content_relationships_integration- интеграционный тест связей между постами и контентом
3. conftest_post_repository.py - Общие фикстуры
Содержит фикстуры для всех тестов:
mock_post_repository- мок PostRepository для unit тестовsample_telegram_post- тестовый объект TelegramPostsample_telegram_post_with_helper- тестовый объект TelegramPost с helper сообщениемsample_telegram_post_no_date- тестовый объект TelegramPost без датыsample_post_content- тестовый объект PostContentsample_message_content_link- тестовый объект MessageContentLinkmock_db_execute_query- мок для _execute_querymock_db_execute_query_with_result- мок для _execute_query_with_resultmock_logger- мок для loggertemp_db_file- временный файл БД для интеграционных тестовreal_post_repository- реальный PostRepository с временной БДsample_posts_batch- набор тестовых постов для batch тестовsample_content_batch- набор тестового контента для batch тестовmock_database_connection- мок для DatabaseConnectionsample_helper_message_ids- набор тестовых helper message IDsample_message_ids- набор тестовых message IDsample_author_ids- набор тестовых author IDmock_sql_queries- мок для SQL запросов
Запуск тестов
Запуск всех тестов для PostRepository:
pytest tests/test_post_repository.py -v
pytest tests/test_post_repository_integration.py -v
Запуск с покрытием:
pytest tests/test_post_repository.py --cov=database.repositories.post_repository --cov-report=html
pytest tests/test_post_repository_integration.py --cov=database.repositories.post_repository --cov-report=html
Запуск конкретного теста:
pytest tests/test_post_repository.py::TestPostRepository::test_add_post_with_date -v
Требования
pytest- фреймворк для тестированияpytest-asyncio- поддержка асинхронных тестовpytest-cov- для измерения покрытия кода (опционально)
Особенности тестирования
Unit тесты
- Используют моки для изоляции тестируемого кода
- Проверяют логику методов без зависимости от БД
- Быстрые и надежные
Интеграционные тесты
- Используют реальную SQLite БД в памяти
- Проверяют взаимодействие с БД
- Создают временные файлы БД для каждого теста
- Автоматически очищают ресурсы после тестов
Фикстуры
- Переиспользуемые объекты для тестов
- Автоматическая очистка ресурсов
- Разделение на unit и integration фикстуры
Покрытие тестами
Тесты покрывают все публичные методы PostRepository:
- ✅
create_tables()- создание таблиц БД - ✅
add_post()- добавление поста - ✅
update_helper_message()- обновление helper сообщения - ✅
add_post_content()- добавление контента поста - ✅
get_post_content_by_helper_id()- получение контента по helper ID - ✅
get_post_text_by_helper_id()- получение текста поста по helper ID - ✅
get_post_ids_by_helper_id()- получение ID сообщений по helper ID - ✅
get_author_id_by_message_id()- получение ID автора по message ID - ✅
get_author_id_by_helper_message_id()- получение ID автора по helper message ID
Добавление новых тестов
При добавлении новых методов в PostRepository:
- Добавьте unit тест в
test_post_repository.py - Добавьте интеграционный тест в
test_post_repository_integration.py - Добавьте необходимые фикстуры в
conftest_post_repository.py - Обновите этот README файл
Отладка тестов
Для отладки тестов используйте:
pytest tests/test_post_repository.py -v -s --tb=long
Флаг -s позволяет видеть print statements, --tb=long показывает полный traceback ошибок.