201 lines
6.9 KiB
Python
201 lines
6.9 KiB
Python
"""
|
||
Простые интеграционные тесты с реальным LDAP сервером.
|
||
|
||
ВАЖНО: Перед запуском запустите LDAP сервер:
|
||
cd backend
|
||
./ldap-test.sh start
|
||
|
||
Запуск тестов:
|
||
pytest tests/integration/test_ldap_simple.py -v
|
||
"""
|
||
|
||
import pytest
|
||
from rest_framework.test import APIClient
|
||
|
||
from employees.models import Employee
|
||
from tests.integration.conftest import ldap_search_user
|
||
|
||
|
||
@pytest.mark.django_db
|
||
def test_register_user_creates_in_ldap(ldap_test_settings, ldap_connection):
|
||
"""Регистрация пользователя создает запись в LDAP"""
|
||
client = APIClient()
|
||
|
||
# Arrange
|
||
username = "test_newuser"
|
||
user_data = {
|
||
"username": username,
|
||
"email": "test_newuser@test.local",
|
||
"password": "TestPassword123!",
|
||
"password_confirmation": "TestPassword123!",
|
||
"first_name": "Test",
|
||
"last_name": "User",
|
||
"telegram": "@test_newuser",
|
||
"birth_date": "1990-01-01",
|
||
"phone_number": "+79001234567",
|
||
}
|
||
|
||
# Act - регистрируем пользователя
|
||
response = client.post("/api/v1/auth/register/", user_data)
|
||
|
||
# Отладка - посмотрим что пришло
|
||
print(f"\n Response status: {response.status_code}")
|
||
print(f"Response data: {response.data}")
|
||
|
||
# Assert - проверяем что пользователь создался
|
||
assert response.status_code == 201, f"Expected 201, got {response.status_code}: {response.data}"
|
||
assert Employee.objects.filter(username=username).exists()
|
||
|
||
# Assert - проверяем что пользователь появился в LDAP
|
||
ldap_user = ldap_search_user(ldap_connection, username)
|
||
assert ldap_user is not None, "Пользователь должен быть создан в LDAP"
|
||
|
||
dn, attrs = ldap_user
|
||
assert b"test_newuser@test.local" in attrs.get("mail", [])
|
||
|
||
|
||
@pytest.mark.django_db
|
||
def test_verify_email_activates_in_ldap(ldap_test_settings, ldap_connection):
|
||
"""Верификация email активирует пользователя в LDAP"""
|
||
client = APIClient()
|
||
|
||
# Arrange - создаем пользователя
|
||
username = "test_verify"
|
||
user_data = {
|
||
"username": username,
|
||
"email": "test_verify@test.local",
|
||
"password": "TestPassword123!",
|
||
"password_confirmation": "TestPassword123!",
|
||
"first_name": "Test",
|
||
"last_name": "Verify",
|
||
}
|
||
|
||
response = client.post("/api/v1/auth/register/", user_data)
|
||
assert response.status_code == 201
|
||
|
||
# Получаем токен верификации
|
||
employee = Employee.objects.get(username=username)
|
||
token = employee.email_verification_token
|
||
|
||
# Act - верифицируем email
|
||
verify_response = client.post(
|
||
"/api/v1/employees/verify-email/",
|
||
{"token": token}
|
||
)
|
||
|
||
# Assert
|
||
assert verify_response.status_code == 200
|
||
|
||
# Проверяем что в LDAP пользователь активен
|
||
ldap_user = ldap_search_user(ldap_connection, username)
|
||
assert ldap_user is not None
|
||
|
||
dn, attrs = ldap_user
|
||
# TODO: Проверяем что accountStatus = active или аналогичное поле
|
||
|
||
|
||
@pytest.mark.django_db
|
||
def test_delete_user_removes_from_ldap(ldap_test_settings, ldap_connection):
|
||
"""Удаление пользователя удаляет его из LDAP"""
|
||
client = APIClient()
|
||
|
||
# Arrange - создаем пользователя
|
||
username = "test_delete"
|
||
user_data = {
|
||
"username": username,
|
||
"email": "test_delete@test.local",
|
||
"password": "TestPassword123!",
|
||
"password_confirmation": "TestPassword123!",
|
||
"first_name": "Test",
|
||
"last_name": "Delete",
|
||
}
|
||
|
||
response = client.post("/api/v1/auth/register/", user_data)
|
||
assert response.status_code == 201
|
||
|
||
# Проверяем что пользователь есть в LDAP
|
||
assert ldap_search_user(ldap_connection, username) is not None
|
||
|
||
# Act - удаляем пользователя
|
||
employee = Employee.objects.get(username=username)
|
||
employee.delete()
|
||
|
||
# Assert - проверяем что пользователя нет в LDAP
|
||
ldap_user = ldap_search_user(ldap_connection, username)
|
||
assert ldap_user is None, "Пользователь должен быть удален из LDAP"
|
||
|
||
|
||
@pytest.mark.django_db
|
||
def test_update_user_syncs_to_ldap(ldap_test_settings, ldap_connection):
|
||
"""Обновление данных пользователя синхронизируется в LDAP"""
|
||
client = APIClient()
|
||
|
||
# Arrange - создаем пользователя
|
||
username = "test_update"
|
||
user_data = {
|
||
"username": username,
|
||
"email": "test_update@test.local",
|
||
"password": "TestPassword123!",
|
||
"password_confirmation": "TestPassword123!",
|
||
"first_name": "Test",
|
||
"last_name": "Update",
|
||
}
|
||
|
||
response = client.post("/api/v1/auth/register/", user_data)
|
||
assert response.status_code == 201
|
||
|
||
# Act - обновляем email
|
||
employee = Employee.objects.get(username=username)
|
||
new_email = "new_email@test.local"
|
||
employee.email = new_email
|
||
employee.save()
|
||
|
||
# Assert - проверяем что email обновился в LDAP
|
||
ldap_user = ldap_search_user(ldap_connection, username)
|
||
assert ldap_user is not None
|
||
|
||
dn, attrs = ldap_user
|
||
assert new_email.encode() in attrs.get("mail", [])
|
||
|
||
|
||
@pytest.mark.django_db
|
||
def test_full_user_lifecycle_with_ldap(ldap_test_settings, ldap_connection):
|
||
"""Полный жизненный цикл пользователя: создание → верификация → обновление → удаление"""
|
||
client = APIClient()
|
||
username = "test_lifecycle"
|
||
|
||
# 1. Создание
|
||
user_data = {
|
||
"username": username,
|
||
"email": "lifecycle@test.local",
|
||
"password": "TestPassword123!",
|
||
"password_confirmation": "TestPassword123!",
|
||
"first_name": "Lifecycle",
|
||
"last_name": "Test",
|
||
}
|
||
|
||
response = client.post("/api/v1/auth/register/", user_data)
|
||
assert response.status_code == 201
|
||
assert ldap_search_user(ldap_connection, username) is not None
|
||
|
||
# 2. Верификация
|
||
employee = Employee.objects.get(username=username)
|
||
token = employee.email_verification_token
|
||
verify_response = client.post(
|
||
"/api/v1/employees/verify-email/",
|
||
{"token": token}
|
||
)
|
||
assert verify_response.status_code == 200
|
||
|
||
# 3. Обновление
|
||
employee.refresh_from_db()
|
||
employee.first_name = "Updated"
|
||
employee.save()
|
||
|
||
ldap_user = ldap_search_user(ldap_connection, username)
|
||
assert ldap_user is not None
|
||
|
||
# 4. Удаление
|
||
employee.delete()
|
||
assert ldap_search_user(ldap_connection, username) is None
|