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:
252
tests/unit/models/test_user_example.py
Normal file
252
tests/unit/models/test_user_example.py
Normal 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 == "<script>alert('xss')</script>"
|
||||
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 & < > " '"
|
||||
|
||||
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 = "<script>"
|
||||
|
||||
# Act
|
||||
escaped = escape_html(text)
|
||||
|
||||
# Assert
|
||||
assert escaped == "&lt;script&gt;"
|
||||
Reference in New Issue
Block a user