- 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.
143 lines
9.2 KiB
Markdown
143 lines
9.2 KiB
Markdown
# Тесты для 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 ID
|
||
- **`test_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 ID
|
||
- **`test_get_author_id_by_message_id_not_found_integration`** - интеграционный тест получения ID автора несуществующего поста
|
||
- **`test_get_author_id_by_helper_message_id_integration`** - интеграционный тест получения ID автора по helper message ID
|
||
- **`test_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`** - тестовый объект TelegramPost
|
||
- **`sample_telegram_post_with_helper`** - тестовый объект TelegramPost с helper сообщением
|
||
- **`sample_telegram_post_no_date`** - тестовый объект TelegramPost без даты
|
||
- **`sample_post_content`** - тестовый объект PostContent
|
||
- **`sample_message_content_link`** - тестовый объект MessageContentLink
|
||
- **`mock_db_execute_query`** - мок для _execute_query
|
||
- **`mock_db_execute_query_with_result`** - мок для _execute_query_with_result
|
||
- **`mock_logger`** - мок для logger
|
||
- **`temp_db_file`** - временный файл БД для интеграционных тестов
|
||
- **`real_post_repository`** - реальный PostRepository с временной БД
|
||
- **`sample_posts_batch`** - набор тестовых постов для batch тестов
|
||
- **`sample_content_batch`** - набор тестового контента для batch тестов
|
||
- **`mock_database_connection`** - мок для DatabaseConnection
|
||
- **`sample_helper_message_ids`** - набор тестовых helper message ID
|
||
- **`sample_message_ids`** - набор тестовых message ID
|
||
- **`sample_author_ids`** - набор тестовых author ID
|
||
- **`mock_sql_queries`** - мок для SQL запросов
|
||
|
||
## Запуск тестов
|
||
|
||
### Запуск всех тестов для PostRepository:
|
||
```bash
|
||
pytest tests/test_post_repository.py -v
|
||
pytest tests/test_post_repository_integration.py -v
|
||
```
|
||
|
||
### Запуск с покрытием:
|
||
```bash
|
||
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
|
||
```
|
||
|
||
### Запуск конкретного теста:
|
||
```bash
|
||
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`:
|
||
|
||
1. Добавьте unit тест в `test_post_repository.py`
|
||
2. Добавьте интеграционный тест в `test_post_repository_integration.py`
|
||
3. Добавьте необходимые фикстуры в `conftest_post_repository.py`
|
||
4. Обновите этот README файл
|
||
|
||
## Отладка тестов
|
||
|
||
Для отладки тестов используйте:
|
||
|
||
```bash
|
||
pytest tests/test_post_repository.py -v -s --tb=long
|
||
```
|
||
|
||
Флаг `-s` позволяет видеть print statements, `--tb=long` показывает полный traceback ошибок.
|