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/services/business/__init__.py
Normal file
3
tests/unit/services/business/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
"""
|
||||
Unit тесты для бизнес-сервисов
|
||||
"""
|
||||
102
tests/unit/services/business/test_message_service.py
Normal file
102
tests/unit/services/business/test_message_service.py
Normal file
@@ -0,0 +1,102 @@
|
||||
"""
|
||||
Тесты для MessageService
|
||||
|
||||
Что тестировать:
|
||||
- Отправка сообщений (send_message)
|
||||
- Отправка сообщений с клавиатурой
|
||||
- Отправка сообщений об ошибках
|
||||
- Форматирование сообщений
|
||||
- Валидация входных данных
|
||||
- Обработка ошибок отправки
|
||||
- Интеграция с ботом
|
||||
- Логирование операций
|
||||
- Rate limiting интеграция
|
||||
"""
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
from aiogram.types import Message, InlineKeyboardMarkup, ReplyKeyboardMarkup
|
||||
from services.business.message_service import MessageService
|
||||
|
||||
|
||||
class TestMessageService:
|
||||
"""Тесты для MessageService"""
|
||||
|
||||
def test_send_message_basic(self):
|
||||
"""Тест базовой отправки сообщения"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_message_with_inline_keyboard(self):
|
||||
"""Тест отправки сообщения с inline клавиатурой"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_message_with_reply_keyboard(self):
|
||||
"""Тест отправки сообщения с reply клавиатурой"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_message_with_parse_mode(self):
|
||||
"""Тест отправки сообщения с режимом парсинга"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_error_message(self):
|
||||
"""Тест отправки сообщения об ошибке"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_error_message_with_keyboard(self):
|
||||
"""Тест отправки сообщения об ошибке с клавиатурой"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_message_basic(self):
|
||||
"""Тест базового форматирования сообщения"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_message_with_placeholders(self):
|
||||
"""Тест форматирования сообщения с плейсхолдерами"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_message_html_escaping(self):
|
||||
"""Тест HTML экранирования в сообщениях"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_message_text_valid(self):
|
||||
"""Тест валидации корректного текста сообщения"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_message_text_invalid(self):
|
||||
"""Тест валидации некорректного текста сообщения"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_message_telegram_error(self):
|
||||
"""Тест обработки ошибки Telegram API"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_message_network_error(self):
|
||||
"""Тест обработки сетевой ошибки"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_message_rate_limit_error(self):
|
||||
"""Тест обработки ошибки rate limiting"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_message_service_initialization(self):
|
||||
"""Тест инициализации MessageService"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_message_service_with_none_bot(self):
|
||||
"""Тест MessageService с None ботом"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
115
tests/unit/services/business/test_pagination_service.py
Normal file
115
tests/unit/services/business/test_pagination_service.py
Normal file
@@ -0,0 +1,115 @@
|
||||
"""
|
||||
Тесты для PaginationService
|
||||
|
||||
Что тестировать:
|
||||
- Offset-based пагинация
|
||||
- Cursor-based пагинация
|
||||
- Валидация параметров пагинации
|
||||
- Форматирование результатов пагинации
|
||||
- Обработка граничных случаев
|
||||
- Обработка ошибок БД
|
||||
- Интеграция с другими сервисами
|
||||
- Производительность пагинации
|
||||
"""
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
from services.business.pagination_service import PaginationService
|
||||
|
||||
|
||||
class TestPaginationService:
|
||||
"""Тесты для PaginationService"""
|
||||
|
||||
def test_offset_pagination_basic(self):
|
||||
"""Тест базовой offset пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_offset_pagination_first_page(self):
|
||||
"""Тест первой страницы offset пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_offset_pagination_middle_page(self):
|
||||
"""Тест средней страницы offset пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_offset_pagination_last_page(self):
|
||||
"""Тест последней страницы offset пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_offset_pagination_empty_result(self):
|
||||
"""Тест пустого результата offset пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_cursor_pagination_basic(self):
|
||||
"""Тест базовой cursor пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_cursor_pagination_first_page(self):
|
||||
"""Тест первой страницы cursor пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_cursor_pagination_next_page(self):
|
||||
"""Тест следующей страницы cursor пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_cursor_pagination_previous_page(self):
|
||||
"""Тест предыдущей страницы cursor пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_cursor_pagination_empty_result(self):
|
||||
"""Тест пустого результата cursor пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_pagination_params_valid(self):
|
||||
"""Тест валидации корректных параметров пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_pagination_params_invalid_page(self):
|
||||
"""Тест валидации некорректной страницы"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_pagination_params_invalid_per_page(self):
|
||||
"""Тест валидации некорректного количества элементов на странице"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_pagination_info_basic(self):
|
||||
"""Тест базового форматирования информации о пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_pagination_info_with_navigation(self):
|
||||
"""Тест форматирования с навигацией"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_pagination_info_first_page(self):
|
||||
"""Тест форматирования первой страницы"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_pagination_info_last_page(self):
|
||||
"""Тест форматирования последней страницы"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_pagination_service_initialization(self):
|
||||
"""Тест инициализации PaginationService"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_pagination_database_error(self):
|
||||
"""Тест обработки ошибки БД при пагинации"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
171
tests/unit/services/business/test_question_service.py
Normal file
171
tests/unit/services/business/test_question_service.py
Normal file
@@ -0,0 +1,171 @@
|
||||
"""
|
||||
Тесты для QuestionService
|
||||
|
||||
Что тестировать:
|
||||
- Создание вопроса (create_question)
|
||||
- Получение вопросов пользователя (get_user_questions)
|
||||
- Получение вопроса по ID (get_question_by_id)
|
||||
- Ответ на вопрос (answer_question)
|
||||
- Редактирование ответа (edit_answer)
|
||||
- Удаление вопроса (delete_question)
|
||||
- Валидация текста вопроса и ответа
|
||||
- Отправка ответа автору
|
||||
- Форматирование информации о вопросе
|
||||
- Обработка ошибок БД
|
||||
- Интеграция с другими сервисами
|
||||
- Логирование операций
|
||||
"""
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
from services.business.question_service import QuestionService
|
||||
from models.question import Question, QuestionStatus
|
||||
from models.user import User
|
||||
|
||||
|
||||
class TestQuestionService:
|
||||
"""Тесты для QuestionService"""
|
||||
|
||||
def test_create_question_basic(self):
|
||||
"""Тест базового создания вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_question_with_validation(self):
|
||||
"""Тест создания вопроса с валидацией"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_question_invalid_text(self):
|
||||
"""Тест создания вопроса с невалидным текстом"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_question_database_error(self):
|
||||
"""Тест обработки ошибки БД при создании вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_questions_existing(self):
|
||||
"""Тест получения вопросов пользователя - существующие"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_questions_nonexistent(self):
|
||||
"""Тест получения вопросов пользователя - несуществующие"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_questions_with_pagination(self):
|
||||
"""Тест получения вопросов с пагинацией"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_questions_with_status_filter(self):
|
||||
"""Тест получения вопросов с фильтром по статусу"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_question_by_id_existing(self):
|
||||
"""Тест получения вопроса по ID - существующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_question_by_id_nonexistent(self):
|
||||
"""Тест получения вопроса по ID - несуществующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_answer_question_valid(self):
|
||||
"""Тест ответа на вопрос - валидный ответ"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_answer_question_invalid_text(self):
|
||||
"""Тест ответа на вопрос - невалидный текст"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_answer_question_nonexistent_question(self):
|
||||
"""Тест ответа на несуществующий вопрос"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_answer_question_already_answered(self):
|
||||
"""Тест ответа на уже отвеченный вопрос"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_edit_answer_valid(self):
|
||||
"""Тест редактирования ответа - валидный ответ"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_edit_answer_invalid_text(self):
|
||||
"""Тест редактирования ответа - невалидный текст"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_edit_answer_nonexistent_question(self):
|
||||
"""Тест редактирования ответа несуществующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_question_existing(self):
|
||||
"""Тест удаления существующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_delete_question_nonexistent(self):
|
||||
"""Тест удаления несуществующего вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_question_text_valid(self):
|
||||
"""Тест валидации корректного текста вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_question_text_invalid(self):
|
||||
"""Тест валидации некорректного текста вопроса"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_answer_text_valid(self):
|
||||
"""Тест валидации корректного текста ответа"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_answer_text_invalid(self):
|
||||
"""Тест валидации некорректного текста ответа"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_answer_to_author_success(self):
|
||||
"""Тест успешной отправки ответа автору"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_send_answer_to_author_failure(self):
|
||||
"""Тест неудачной отправки ответа автору"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_question_info_basic(self):
|
||||
"""Тест базового форматирования информации о вопросе"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_question_info_with_answer(self):
|
||||
"""Тест форматирования информации с ответом"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_question_info_anonymous(self):
|
||||
"""Тест форматирования информации об анонимном вопросе"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_question_service_initialization(self):
|
||||
"""Тест инициализации QuestionService"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
103
tests/unit/services/business/test_user_service.py
Normal file
103
tests/unit/services/business/test_user_service.py
Normal file
@@ -0,0 +1,103 @@
|
||||
"""
|
||||
Тесты для UserService
|
||||
|
||||
Что тестировать:
|
||||
- Создание пользователя (create_or_update_user)
|
||||
- Обновление пользователя
|
||||
- Получение пользователя по ID
|
||||
- Получение пользователя по profile_link
|
||||
- Проверка существования пользователя
|
||||
- Форматирование данных пользователя
|
||||
- Валидация входных данных
|
||||
- Обработка ошибок БД
|
||||
- Интеграция с другими сервисами
|
||||
- Логирование операций
|
||||
"""
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
from services.business.user_service import UserService
|
||||
from models.user import User
|
||||
|
||||
|
||||
class TestUserService:
|
||||
"""Тесты для UserService"""
|
||||
|
||||
def test_create_or_update_user_new_user(self):
|
||||
"""Тест создания нового пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_or_update_user_existing_user(self):
|
||||
"""Тест обновления существующего пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_or_update_user_with_telegram_user(self):
|
||||
"""Тест создания пользователя из Telegram User"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_create_or_update_user_database_error(self):
|
||||
"""Тест обработки ошибки БД при создании пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_by_id_existing(self):
|
||||
"""Тест получения пользователя по ID - существующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_by_id_nonexistent(self):
|
||||
"""Тест получения пользователя по ID - несуществующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_by_profile_link_existing(self):
|
||||
"""Тест получения пользователя по profile_link - существующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_get_user_by_profile_link_nonexistent(self):
|
||||
"""Тест получения пользователя по profile_link - несуществующий"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_user_exists_true(self):
|
||||
"""Тест проверки существования пользователя - существует"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_user_exists_false(self):
|
||||
"""Тест проверки существования пользователя - не существует"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_user_info(self):
|
||||
"""Тест форматирования информации о пользователе"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_format_user_info_with_none_values(self):
|
||||
"""Тест форматирования информации с None значениями"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_user_data_valid(self):
|
||||
"""Тест валидации корректных данных пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_validate_user_data_invalid(self):
|
||||
"""Тест валидации некорректных данных пользователя"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_user_service_initialization(self):
|
||||
"""Тест инициализации UserService"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
|
||||
def test_user_service_with_none_database(self):
|
||||
"""Тест UserService с None базой данных"""
|
||||
# TODO: Реализовать тест
|
||||
pass
|
||||
Reference in New Issue
Block a user