253 lines
7.5 KiB
Python
253 lines
7.5 KiB
Python
"""
|
||
Пример теста для модели 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;"
|