84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
# DRF Rack
|
|
# Библиотека классов расширений для Django REST Framework
|
|
#
|
|
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
|
# Все права защищены. Лицензия: MIT
|
|
|
|
"""
|
|
Описание класса SessionModelTests
|
|
"""
|
|
|
|
from django.db.utils import IntegrityError
|
|
from django.test import TestCase
|
|
|
|
from net.xeaf.rack.managers import CryptoManager
|
|
from net.xeaf.rack.models import AccountModel
|
|
from net.xeaf.rack.models import SessionModel
|
|
|
|
|
|
class SessionModelTests(TestCase):
|
|
"""
|
|
Тесты для класса SessionModel
|
|
"""
|
|
|
|
def setUp(self):
|
|
"""
|
|
Атомарно создаем тестовых пользователей для связей
|
|
"""
|
|
|
|
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"
|
|
)
|
|
|
|
def test_create_session_with_defaults_and_relations(self):
|
|
"""
|
|
Проверяет успешное создание сессии, заполнение дефолтных полей и внешних ключей
|
|
"""
|
|
|
|
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")
|
|
|
|
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
|
|
)
|
|
|
|
with self.assertRaises(IntegrityError):
|
|
session2.renew(3600)
|
|
session2.save()
|