""" Тесты API пользователей. """ import pytest from django.contrib.auth import get_user_model from rest_framework import status User = get_user_model() @pytest.mark.django_db class TestUserRegistration: """Тесты регистрации пользователей.""" def test_register_mentor_success(self, api_client): """Тест успешной регистрации ментора.""" data = { 'email': 'newmentor@test.com', 'password': 'SecurePass123!', 'password_confirm': 'SecurePass123!', 'first_name': 'Новый', 'last_name': 'Ментор', 'phone': '+79991234567', 'role': 'mentor' } response = api_client.post('/api/users/register/', data) assert response.status_code == status.HTTP_201_CREATED assert 'user' in response.data assert response.data['user']['email'] == 'newmentor@test.com' assert response.data['user']['role'] == 'mentor' # Проверяем, что пользователь создан в БД user = User.objects.get(email='newmentor@test.com') assert user is not None assert user.is_email_verified is False # Требуется верификация def test_register_with_existing_email(self, api_client, mentor_user): """Тест регистрации с уже существующим email.""" data = { 'email': mentor_user.email, 'password': 'SecurePass123!', 'password_confirm': 'SecurePass123!', 'first_name': 'Другой', 'last_name': 'Пользователь', 'phone': '+79991234568', 'role': 'client' } response = api_client.post('/api/users/register/', data) assert response.status_code == status.HTTP_400_BAD_REQUEST def test_register_password_mismatch(self, api_client): """Тест регистрации с несовпадающими паролями.""" data = { 'email': 'test@test.com', 'password': 'SecurePass123!', 'password_confirm': 'DifferentPass123!', 'first_name': 'Тест', 'last_name': 'Пользователь', 'phone': '+79991234569', 'role': 'client' } response = api_client.post('/api/users/register/', data) assert response.status_code == status.HTTP_400_BAD_REQUEST @pytest.mark.django_db class TestUserLogin: """Тесты входа пользователей.""" def test_login_success(self, api_client, mentor_user): """Тест успешного входа.""" data = { 'email': 'mentor@test.com', 'password': 'TestPass123!' } response = api_client.post('/api/users/login/', data) assert response.status_code == status.HTTP_200_OK assert 'access' in response.data assert 'refresh' in response.data assert 'user' in response.data def test_login_invalid_credentials(self, api_client): """Тест входа с неверными учетными данными.""" data = { 'email': 'wrong@test.com', 'password': 'WrongPass123!' } response = api_client.post('/api/users/login/', data) assert response.status_code == status.HTTP_401_UNAUTHORIZED def test_login_unverified_email(self, api_client): """Тест входа с неподтвержденным email.""" # Создаем пользователя с неподтвержденным email user = User.objects.create_user( email='unverified@test.com', password='TestPass123!', first_name='Непроверенный', last_name='Пользователь', role='client', is_email_verified=False ) data = { 'email': 'unverified@test.com', 'password': 'TestPass123!' } response = api_client.post('/api/users/login/', data) # В зависимости от логики - может быть 401 или 403 assert response.status_code in [status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN] @pytest.mark.django_db class TestUserProfile: """Тесты профиля пользователя.""" def test_get_profile(self, authenticated_client, mentor_user): """Тест получения профиля.""" response = authenticated_client.get('/api/users/profile/') assert response.status_code == status.HTTP_200_OK assert response.data['email'] == mentor_user.email assert response.data['first_name'] == mentor_user.first_name def test_update_profile(self, authenticated_client): """Тест обновления профиля.""" data = { 'first_name': 'Обновленное', 'last_name': 'Имя', 'phone': '+79999999999' } response = authenticated_client.patch('/api/users/profile/', data) assert response.status_code == status.HTTP_200_OK assert response.data['first_name'] == 'Обновленное' assert response.data['last_name'] == 'Имя' def test_profile_unauthorized(self, api_client): """Тест доступа к профилю без аутентификации.""" response = api_client.get('/api/users/profile/') assert response.status_code == status.HTTP_401_UNAUTHORIZED @pytest.mark.django_db class TestTokenRefresh: """Тесты обновления токенов.""" def test_refresh_token(self, api_client, tokens_for_user, mentor_user): """Тест обновления access токена.""" tokens = tokens_for_user(mentor_user) data = {'refresh': tokens['refresh']} response = api_client.post('/api/users/token/refresh/', data) assert response.status_code == status.HTTP_200_OK assert 'access' in response.data def test_refresh_invalid_token(self, api_client): """Тест обновления с невалидным токеном.""" data = {'refresh': 'invalid_token'} response = api_client.post('/api/users/token/refresh/', data) assert response.status_code == status.HTTP_401_UNAUTHORIZED