"""
Тесты моделей пользователей.
"""
import pytest
from django.contrib.auth import get_user_model
from django.db import IntegrityError

User = get_user_model()


@pytest.mark.django_db
class TestUserModel:
    """Тесты модели User."""
    
    def test_create_user(self):
        """Тест создания обычного пользователя."""
        user = User.objects.create_user(
            email='test@example.com',
            password='testpass123',
            first_name='Тест',
            last_name='Тестов',
            phone='+79991234567',
            role='mentor'
        )
        
        assert user.email == 'test@example.com'
        assert user.first_name == 'Тест'
        assert user.last_name == 'Тестов'
        assert user.role == 'mentor'
        assert user.is_active is True
        assert user.is_staff is False
        assert user.is_superuser is False
        assert user.check_password('testpass123')
    
    def test_create_superuser(self):
        """Тест создания суперпользователя."""
        user = User.objects.create_superuser(
            email='admin@example.com',
            password='adminpass123',
            first_name='Админ',
            last_name='Админов'
        )
        
        assert user.is_active is True
        assert user.is_staff is True
        assert user.is_superuser is True
    
    def test_user_email_unique(self):
        """Тест уникальности email."""
        User.objects.create_user(
            email='test@example.com',
            password='testpass123',
            first_name='Тест',
            last_name='Тестов',
            role='mentor'
        )
        
        with pytest.raises(IntegrityError):
            User.objects.create_user(
                email='test@example.com',
                password='testpass456',
                first_name='Тест2',
                last_name='Тестов2',
                role='client'
            )
    
    def test_user_str(self):
        """Тест строкового представления пользователя."""
        user = User.objects.create_user(
            email='test@example.com',
            password='testpass123',
            first_name='Иван',
            last_name='Иванов',
            role='mentor'
        )
        
        assert str(user) == 'Иван Иванов (test@example.com)'
    
    def test_user_get_full_name(self):
        """Тест получения полного имени."""
        user = User.objects.create_user(
            email='test@example.com',
            password='testpass123',
            first_name='Петр',
            last_name='Петров',
            role='client'
        )
        
        assert user.get_full_name() == 'Петр Петров'
    
    def test_user_roles(self):
        """Тест различных ролей пользователей."""
        mentor = User.objects.create_user(
            email='mentor@test.com',
            password='pass123',
            first_name='Ментор',
            last_name='Менторов',
            role='mentor'
        )
        
        client = User.objects.create_user(
            email='client@test.com',
            password='pass123',
            first_name='Клиент',
            last_name='Клиентов',
            role='client'
        )
        
        parent = User.objects.create_user(
            email='parent@test.com',
            password='pass123',
            first_name='Родитель',
            last_name='Родителев',
            role='parent'
        )
        
        assert mentor.role == 'mentor'
        assert client.role == 'client'
        assert parent.role == 'parent'

