Implement user-specific question numbering and update database schema. Added triggers for automatic question numbering and adjustments upon deletion. Enhanced CRUD operations to manage user_question_number effectively.
This commit is contained in:
3
tests/unit/database/__init__.py
Normal file
3
tests/unit/database/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
"""
|
||||
Unit тесты для базы данных
|
||||
"""
|
||||
314
tests/unit/database/test_crud.py
Normal file
314
tests/unit/database/test_crud.py
Normal file
@@ -0,0 +1,314 @@
|
||||
"""
|
||||
Тесты для CRUD операций
|
||||
|
||||
Что тестировать:
|
||||
- UserCRUD (создание, обновление, удаление, получение)
|
||||
- QuestionCRUD (создание, обновление, удаление, получение)
|
||||
- UserBlockCRUD (блокировки пользователей)
|
||||
- UserSettingsCRUD (настройки пользователей)
|
||||
- Batch операции (create_batch для пользователей и вопросов)
|
||||
- Cursor-based пагинация
|
||||
- Обработка ошибок БД
|
||||
- Валидация входных данных
|
||||
- Транзакции
|
||||
- Connection pooling
|
||||
- SQL injection защита
|
||||
"""
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
from datetime import datetime
|
||||
from database.crud import UserCRUD, QuestionCRUD, UserBlockCRUD, UserSettingsCRUD
|
||||
from models.user import User
|
||||
from models.question import Question, QuestionStatus
|
||||
from models.user_block import UserBlock
|
||||
from models.user_settings import UserSettings
|
||||
|
||||
|
||||
class TestUserCRUD:
|
||||
"""Тесты для UserCRUD"""
|
||||
|
||||
def test_create_user_basic(self):
|
||||
"""Тест базового создания пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_user_with_all_fields(self):
|
||||
"""Тест создания пользователя со всеми полями"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_user_duplicate_telegram_id(self):
|
||||
"""Тест создания пользователя с дублирующимся telegram_id"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_user_duplicate_profile_link(self):
|
||||
"""Тест создания пользователя с дублирующимся profile_link"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_batch_users(self):
|
||||
"""Тест batch создания пользователей"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_batch_users_empty_list(self):
|
||||
"""Тест batch создания пустого списка пользователей"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_telegram_id_existing(self):
|
||||
"""Тест получения пользователя по telegram_id - существующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_telegram_id_nonexistent(self):
|
||||
"""Тест получения пользователя по telegram_id - несуществующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_profile_link_existing(self):
|
||||
"""Тест получения пользователя по profile_link - существующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_profile_link_nonexistent(self):
|
||||
"""Тест получения пользователя по profile_link - несуществующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_update_user_existing(self):
|
||||
"""Тест обновления существующего пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_update_user_nonexistent(self):
|
||||
"""Тест обновления несуществующего пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_user_existing(self):
|
||||
"""Тест удаления существующего пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_user_nonexistent(self):
|
||||
"""Тест удаления несуществующего пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_all_users(self):
|
||||
"""Тест получения всех пользователей"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_all_users_cursor_pagination(self):
|
||||
"""Тест cursor-based пагинации пользователей"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_all_users_asc(self):
|
||||
"""Тест получения пользователей в порядке возрастания"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_stats(self):
|
||||
"""Тест получения статистики пользователей"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
|
||||
class TestQuestionCRUD:
|
||||
"""Тесты для QuestionCRUD"""
|
||||
|
||||
def test_create_question_basic(self):
|
||||
"""Тест базового создания вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_question_with_answer(self):
|
||||
"""Тест создания вопроса с ответом"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_question_anonymous(self):
|
||||
"""Тест создания анонимного вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_batch_questions(self):
|
||||
"""Тест batch создания вопросов"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_id_existing(self):
|
||||
"""Тест получения вопроса по ID - существующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_id_nonexistent(self):
|
||||
"""Тест получения вопроса по ID - несуществующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_to_user(self):
|
||||
"""Тест получения вопросов для пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_to_user_with_status_filter(self):
|
||||
"""Тест получения вопросов с фильтром по статусу"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_to_user_with_authors(self):
|
||||
"""Тест получения вопросов с информацией об авторах"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_to_user_cursor_pagination(self):
|
||||
"""Тест cursor-based пагинации вопросов"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_to_user_asc(self):
|
||||
"""Тест получения вопросов в порядке возрастания"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_update_question_existing(self):
|
||||
"""Тест обновления существующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_update_question_nonexistent(self):
|
||||
"""Тест обновления несуществующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_question_existing(self):
|
||||
"""Тест удаления существующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_question_nonexistent(self):
|
||||
"""Тест удаления несуществующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_stats(self):
|
||||
"""Тест получения статистики вопросов"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
|
||||
class TestUserBlockCRUD:
|
||||
"""Тесты для UserBlockCRUD"""
|
||||
|
||||
def test_create_block_basic(self):
|
||||
"""Тест базового создания блокировки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_block_duplicate(self):
|
||||
"""Тест создания дублирующейся блокировки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_block_self_block(self):
|
||||
"""Тест попытки заблокировать самого себя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_block_existing(self):
|
||||
"""Тест получения существующей блокировки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_block_nonexistent(self):
|
||||
"""Тест получения несуществующей блокировки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_block_existing(self):
|
||||
"""Тест удаления существующей блокировки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_block_nonexistent(self):
|
||||
"""Тест удаления несуществующей блокировки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_blocks_by_blocker(self):
|
||||
"""Тест получения блокировок по блокирующему"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_blocks_by_blocked(self):
|
||||
"""Тест получения блокировок по заблокированному"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
|
||||
class TestUserSettingsCRUD:
|
||||
"""Тесты для UserSettingsCRUD"""
|
||||
|
||||
def test_create_settings_basic(self):
|
||||
"""Тест базового создания настроек"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_settings_duplicate_user(self):
|
||||
"""Тест создания дублирующихся настроек для пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_user_id_existing(self):
|
||||
"""Тест получения настроек по user_id - существующие"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_by_user_id_nonexistent(self):
|
||||
"""Тест получения настроек по user_id - несуществующие"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_update_settings_existing(self):
|
||||
"""Тест обновления существующих настроек"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_update_settings_nonexistent(self):
|
||||
"""Тест обновления несуществующих настроек"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_settings_existing(self):
|
||||
"""Тест удаления существующих настроек"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_settings_nonexistent(self):
|
||||
"""Тест удаления несуществующих настроек"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
|
||||
class TestDatabaseErrors:
|
||||
"""Тесты для обработки ошибок БД"""
|
||||
|
||||
def test_connection_error_handling(self):
|
||||
"""Тест обработки ошибок подключения"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_sql_error_handling(self):
|
||||
"""Тест обработки SQL ошибок"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_transaction_rollback(self):
|
||||
"""Тест отката транзакций при ошибках"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
Reference in New Issue
Block a user