214 lines
6.7 KiB
Python
214 lines
6.7 KiB
Python
"""
|
||
Интеграционные тесты для 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['change-me-redacted-secret']
|
||
)
|
||
|
||
# Проверяем базовую структуру
|
||
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
|