Corp/backend/tests/integration/test_ldap_integration.py.old

214 lines
6.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Интеграционные тесты для LDAP функциональности.
Требования:
1. Запущенный LDAP сервер: docker-compose -f docker-compose.test.yml up -d
2. Установленная библиотека: pip install python-ldap
Запуск:
pytest -m integration tests/integration/test_ldap_integration.py -v
Запуск с остановкой на первой ошибке:
pytest -m integration tests/integration/test_ldap_integration.py -v -x
"""
import pytest
from django.contrib.auth import get_user_model
from django.urls import reverse
from rest_framework import status
from employees.models import Group, Department
Employee = get_user_model()
pytestmark = pytest.mark.integration
@pytest.mark.django_db
def test_ldap_server_is_accessible(ldap_server):
"""Проверяет что LDAP сервер доступен"""
import ldap
conn = ldap.initialize(
f"ldap://{ldap_server['host']}:{ldap_server['port']}"
)
conn.simple_bind_s(
ldap_server['admin_dn'],
ldap_server['admin_password']
)
# Проверяем базовую структуру
results = conn.search_s(
ldap_server['base_dn'],
ldap.SCOPE_BASE,
"(objectClass=*)"
)
assert len(results) > 0
conn.unbind_s()
@pytest.mark.django_db
def test_register_user_creates_in_ldap(
api_client, ldap_test_settings, clean_ldap_users
):
"""INT-1: Регистрация пользователя создаёт запись в LDAP"""
url = reverse("api:v1:register")
data = {
"email": "ldap.test@test.local",
"first_name": "LDAP",
"last_name": "Test",
"phone_number": "+79990005555",
"password": "SecurePass123!",
"whatsapp": "+79990005555",
"birth_date": "1990-01-01",
}
response = api_client.post(url, data, format="json")
assert response.status_code == status.HTTP_201_CREATED
# Проверяем что пользователь создан в БД
user = Employee.objects.get(email="ldap.test@test.local")
assert user is not None
assert user.is_active is False # Не активен до верификации
# TODO: Проверить что запись создана в LDAP
# Требует настройку DirectoryService с тестовым LDAP
@pytest.mark.django_db
def test_verify_email_activates_in_ldap(
api_client, ldap_test_settings, clean_ldap_users
):
"""INT-2: Верификация email активирует пользователя в LDAP"""
# Сначала регистрируем
url = reverse("api:v1:register")
data = {
"email": "verify.test@test.local",
"first_name": "Verify",
"last_name": "Test",
"phone_number": "+79990006666",
"password": "SecurePass123!",
"whatsapp": "+79990006666",
"birth_date": "1990-01-01",
}
reg_response = api_client.post(url, data, format="json")
assert reg_response.status_code == status.HTTP_201_CREATED
# Получаем код верификации из БД
user = Employee.objects.get(email="verify.test@test.local")
verification_code = user.email_activation_code
# Верифицируем email
verify_url = reverse("api:v1:verify-email")
verify_data = {
"email": "verify.test@test.local",
"code": verification_code,
}
verify_response = api_client.post(verify_url, verify_data, format="json")
assert verify_response.status_code == status.HTTP_200_OK
# Проверяем активацию в БД
user.refresh_from_db()
assert user.is_active is True
assert user.email_verified is True
# TODO: Проверить активацию в LDAP
@pytest.mark.django_db
def test_create_group_syncs_to_ldap(
authenticated_client, ldap_test_settings, clean_ldap_users
):
"""INT-3: Создание группы синхронизируется в LDAP"""
url = reverse("api:v1:groups-list")
data = {
"name": "LDAP Test Group",
"cn": "ldap-test-group",
}
response = authenticated_client.post(url, data, format="json")
# Может быть 201 (успех) или 502 (LDAP ошибка)
assert response.status_code in [
status.HTTP_201_CREATED,
status.HTTP_502_BAD_GATEWAY
]
if response.status_code == status.HTTP_201_CREATED:
# Проверяем что группа создана в БД
group = Group.objects.get(cn="ldap-test-group")
assert group is not None
# TODO: Проверить что группа создана в LDAP
@pytest.mark.django_db
def test_full_user_lifecycle_with_ldap(
api_client, ldap_test_settings, clean_ldap_users
):
"""INT-4: Полный жизненный цикл пользователя с LDAP"""
# 1. Регистрация
reg_data = {
"email": "lifecycle.test@test.local",
"first_name": "Lifecycle",
"last_name": "Test",
"phone_number": "+79990007777",
"password": "SecurePass123!",
"whatsapp": "+79990007777",
"birth_date": "1990-01-01",
}
reg_response = api_client.post(
reverse("api:v1:register"),
reg_data,
format="json"
)
assert reg_response.status_code == status.HTTP_201_CREATED
# 2. Верификация email
user = Employee.objects.get(email="lifecycle.test@test.local")
verify_response = api_client.post(
reverse("api:v1:verify-email"),
{
"email": "lifecycle.test@test.local",
"code": user.email_activation_code,
},
format="json"
)
assert verify_response.status_code == status.HTTP_200_OK
# 3. Проверяем финальное состояние
user.refresh_from_db()
assert user.is_active is True
assert user.email_verified is True
# TODO: Проверить состояние в LDAP
# - Пользователь существует
# - Пользователь активен
# - Пароль установлен корректно
@pytest.fixture
def authenticated_client(api_client, db):
"""API клиент с аутентификацией для интеграционных тестов"""
user = Employee.objects.create(
email="admin@test.local",
first_name="Admin",
last_name="User",
phone_number="+79990009999",
is_active=True,
email_verified=True,
is_staff=True,
is_superuser=True,
)
user.set_password("admin123")
user.save()
api_client.force_authenticate(user=user)
return api_client