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:
2025-09-06 18:35:12 +03:00
parent 50be010026
commit 596a2fa813
111 changed files with 16847 additions and 65 deletions

View File

@@ -0,0 +1,252 @@
"""
Пример теста для модели User
Этот файл демонстрирует, как должны выглядеть реальные тесты.
Остальные файлы содержат только заглушки с TODO комментариями.
"""
import pytest
from datetime import datetime
from models.user import User, escape_html
class TestUserExample:
"""Пример тестов для модели User"""
def test_user_creation_basic(self):
"""Тест базового создания пользователя"""
# Arrange
telegram_id = 123456789
first_name = "Test"
chat_id = 123456789
profile_link = "test_link"
# Act
user = User(
telegram_id=telegram_id,
first_name=first_name,
chat_id=chat_id,
profile_link=profile_link
)
# Assert
assert user.telegram_id == telegram_id
assert user.first_name == first_name
assert user.chat_id == chat_id
assert user.profile_link == profile_link
assert user.is_active is True
assert user.is_superuser is False
assert user.created_at is not None
assert user.updated_at is not None
def test_user_creation_with_all_fields(self):
"""Тест создания пользователя со всеми полями"""
# Arrange
telegram_id = 123456789
username = "testuser"
first_name = "Test"
last_name = "User"
chat_id = 123456789
profile_link = "test_link"
is_active = True
is_superuser = False
created_at = datetime.now()
updated_at = datetime.now()
banned_until = None
ban_reason = None
# Act
user = User(
telegram_id=telegram_id,
username=username,
first_name=first_name,
last_name=last_name,
chat_id=chat_id,
profile_link=profile_link,
is_active=is_active,
is_superuser=is_superuser,
created_at=created_at,
updated_at=updated_at,
banned_until=banned_until,
ban_reason=ban_reason
)
# Assert
assert user.telegram_id == telegram_id
assert user.username == username
assert user.first_name == first_name
assert user.last_name == last_name
assert user.chat_id == chat_id
assert user.profile_link == profile_link
assert user.is_active == is_active
assert user.is_superuser == is_superuser
assert user.created_at == created_at
assert user.updated_at == updated_at
assert user.banned_until == banned_until
assert user.ban_reason == ban_reason
def test_user_validation_telegram_id_positive(self):
"""Тест валидации положительного Telegram ID"""
# Arrange
telegram_id = 123456789
# Act
user = User(
telegram_id=telegram_id,
first_name="Test",
chat_id=123456789,
profile_link="test_link"
)
# Assert
assert user.telegram_id == telegram_id
assert user.telegram_id > 0
def test_user_display_name_with_username(self):
"""Тест метода get_display_name с username"""
# Arrange
user = User(
telegram_id=123456789,
username="testuser",
first_name="Test",
last_name="User",
chat_id=123456789,
profile_link="test_link"
)
# Act
display_name = user.get_display_name()
# Assert
assert display_name == "@testuser"
def test_user_display_name_without_username(self):
"""Тест метода get_display_name без username"""
# Arrange
user = User(
telegram_id=123456789,
first_name="Test",
last_name="User",
chat_id=123456789,
profile_link="test_link"
)
# Act
display_name = user.get_display_name()
# Assert
assert display_name == "Test User"
def test_user_display_name_first_name_only(self):
"""Тест метода get_display_name только с first_name"""
# Arrange
user = User(
telegram_id=123456789,
first_name="Test",
chat_id=123456789,
profile_link="test_link"
)
# Act
display_name = user.get_display_name()
# Assert
assert display_name == "Test"
def test_user_profile_link_generation(self):
"""Тест генерации ссылки профиля"""
# Arrange
user = User(
telegram_id=123456789,
first_name="Test",
chat_id=123456789,
profile_link="test_link"
)
# Act
profile_link = user.get_profile_link()
# Assert
assert profile_link == "test_link"
assert profile_link.startswith("https://t.me/")
def test_user_string_representation(self):
"""Тест строкового представления пользователя"""
# Arrange
user = User(
telegram_id=123456789,
username="testuser",
first_name="Test",
last_name="User",
chat_id=123456789,
profile_link="test_link"
)
# Act
str_repr = str(user)
# Assert
assert "User" in str_repr
assert "123456789" in str_repr
assert "testuser" in str_repr
class TestEscapeHtmlExample:
"""Пример тестов для функции escape_html"""
def test_escape_html_basic(self):
"""Тест базового HTML экранирования"""
# Arrange
text = "<script>alert('xss')</script>"
# Act
escaped = escape_html(text)
# Assert
assert escaped == "&lt;script&gt;alert(&#x27;xss&#x27;)&lt;/script&gt;"
assert "<" not in escaped
assert ">" not in escaped
assert "'" not in escaped
def test_escape_html_special_characters(self):
"""Тест экранирования специальных символов"""
# Arrange
text = "Test & < > \" '"
# Act
escaped = escape_html(text)
# Assert
assert escaped == "Test &amp; &lt; &gt; &quot; &#x27;"
def test_escape_html_none_input(self):
"""Тест обработки None входных данных"""
# Arrange
text = None
# Act
escaped = escape_html(text)
# Assert
assert escaped is None
def test_escape_html_empty_string(self):
"""Тест обработки пустой строки"""
# Arrange
text = ""
# Act
escaped = escape_html(text)
# Assert
assert escaped == ""
def test_escape_html_already_escaped(self):
"""Тест обработки уже экранированного текста"""
# Arrange
text = "&lt;script&gt;"
# Act
escaped = escape_html(text)
# Assert
assert escaped == "&amp;lt;script&amp;gt;"