Фиксируем модели, UserStory и тесты

This commit is contained in:
2026-07-12 15:50:41 +03:00
parent b2e15511c1
commit 9c13222d0d
15 changed files with 364 additions and 97 deletions

View File

@@ -9,75 +9,56 @@
"""
from django.db.utils import IntegrityError
from django.test import TestCase
from django.utils import timezone
from net.xeaf.rack.managers import CryptoManager
from net.xeaf.rack.models import AccountModel
from net.xeaf.rack.core import CoreTestCase
from net.xeaf.rack.management.userstory import AccountTestData
from net.xeaf.rack.management.userstory import SessionTestData
from net.xeaf.rack.models import SessionModel
class SessionModelTests(TestCase):
class SessionModelTests(CoreTestCase):
"""
Тесты для класса SessionModel
"""
def setUp(self):
def test_user_story_sessions_exist_and_linked(self):
"""
Атомарно создаем тестовых пользователей для связей
Проверяет, что сессии из User Story созданы и правильно связаны с аккаунтами
"""
self.primary_user = AccountModel.objects.create_user(
username="primary@example.com",
password="secure_password_123"
)
self.actual_user = AccountModel.objects.create_user(
username="actual@example.com",
password="secure_password_456"
)
# Ищем сессию Ивана по фиксированному токену
session = SessionModel.objects.get(token=SessionTestData.I_IVANOV_SESSION_TOKEN)
def test_create_session_with_defaults_and_relations(self):
"""
Проверяет успешное создание сессии, заполнение дефолтных полей и внешних ключей
"""
# Проверяем связи (включая твой крутой механизм имперсонации)
self.assertEqual(session.account_id, AccountTestData.I_IVANOV_ID)
self.assertEqual(session.actual_account_id, AccountTestData.I_IVANOV_ID)
token_str = CryptoManager.gen_token()
session = SessionModel()
session.token = token_str
session.account = self.primary_user
session.actual_account = self.actual_user
session.renew(3600)
session.save()
# Проверяем контракт полей и связей
self.assertEqual(session.token, token_str)
self.assertEqual(session.account.id, self.primary_user.id)
self.assertEqual(session.actual_account.id, self.actual_user.id)
# Проверяем дефолты текстовых полей, которые мы закладывали в модель
self.assertEqual(session.device_id, "WEB")
self.assertIsNone(session.fcm_token)
def test_session_expiration_logic(self):
"""
Проверяет, что метод renew() правильно выставил expires_at в будущем
"""
session = SessionModel.objects.get(token=SessionTestData.I_IVANOV_SESSION_TOKEN)
# Сессия должна быть активной прямо сейчас
self.assertGreater(session.expires_at, timezone.now())
def test_token_uniqueness_constraint(self):
"""
Проверяет жесткое ограничение уникальности токена сессии в базе данных
Проверяет жесткое ограничение уникальности токенов сессий
"""
duplicate_token = "same_token_xyz"
# Создаем первую валидную сессию
session1 = SessionModel(
token=duplicate_token,
account=self.primary_user,
actual_account=self.actual_user
)
session1.renew(3600)
session1.save()
# Попытка создать вторую сессию с тем же токеном должна намертво упасть в БД
session2 = SessionModel(
token=duplicate_token,
account=self.primary_user,
actual_account=self.actual_user
)
# Попытка создать новую сессию с токеном Петра должна упасть
duplicate_session = SessionModel()
duplicate_session.token = SessionTestData.P_PETROV_SESSION_TOKEN
duplicate_session.account_id = AccountTestData.I_IVANOV_ID
duplicate_session.actual_account_id = AccountTestData.I_IVANOV_ID
duplicate_session.expire()
with self.assertRaises(IntegrityError):
session2.renew(3600)
session2.save()
duplicate_session.save()