From 8b7d81639043003aa534a7500bfcc16e9995a674 Mon Sep 17 00:00:00 2001 From: igor_nadein Date: Mon, 16 Feb 2026 17:34:26 +0300 Subject: [PATCH] docs: add LDAP testing infrastructure summary --- .../docs/testing/TEST_IMPROVEMENTS_SUMMARY.md | 268 ++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 backend/docs/testing/TEST_IMPROVEMENTS_SUMMARY.md diff --git a/backend/docs/testing/TEST_IMPROVEMENTS_SUMMARY.md b/backend/docs/testing/TEST_IMPROVEMENTS_SUMMARY.md new file mode 100644 index 00000000..5543c3b3 --- /dev/null +++ b/backend/docs/testing/TEST_IMPROVEMENTS_SUMMARY.md @@ -0,0 +1,268 @@ +# Улучшения тестов API Employees - Итоги + +## Реализовано + +### 1. Инфраструктура LDAP для тестов ✅ + +**Создано:** +- `.env.test` - конфигурация для тестового окружения +- `backend/scripts/ldap/init/01-base-structure.ldif` - инициализация LDAP структуры +- Обновлен `docker-compose.yml` с правильным профилем LDAP + +**LDAP структура:** +``` +dc=eusrr,dc=local +├── OU=Users (пользователи) +├── OU=Departments (отделы) +│ ├── OU=IT +│ └── OU=HR +├── OU=Groups (группы безопасности) +│ ├── CN=Developers +│ └── CN=Managers +├── OU=Positions (должности) +└── OU=Dismissed (уволенные) +``` + +### 2. Pytest фикстуры для LDAP ✅ + +**Файл:** `backend/tests/ldap_fixtures.py` + +**Фикстуры:** +- `ldap_available` - проверка доступности LDAP сервера +- `ldap_config` - конфигурация LDAP +- `ensure_ldap_enabled` - принудительное включение LDAP для теста +- `ensure_ldap_disabled` - принудительное выключение LDAP для теста +- `ldap_cleanup` - автоматическая очистка LDAP записей после теста + +**Маркеры:** +- `@pytest.mark.ldap_required` - тест требует LDAP (автоскип если недоступен) +- `@pytest.mark.ldap_optional` - тест работает с LDAP и без (параметризация) + +### 3. Централизованные helper-функции ✅ + +**Файл:** `backend/tests/api/v1/employees/test_helpers.py` + +**Функции:** +- `make_user()` - создание пользователя с настройками +- `grant_permission()` - выдача разрешений +- `make_department()` - создание отдела +- `make_position()` - создание должности +- `make_department_role()` - создание роли отдела +- `extract_results()` - извлечение из пагинированного ответа +- `make_unique_email()` - генерация email +- `make_unique_phone()` - генерация телефона + +**Преимущества:** +- Единый источник правды для создания тестовых данных +- Убраны дубликаты из 13+ тестовых файлов +- Упрощена поддержка и обновление тестов + +### 4. Документация ✅ + +**Файл:** `backend/docs/testing/LDAP_TESTING.md` + +**Содержание:** +- Подготовка тестового окружения +- Запуск LDAP контейнера +- Настройка переменных окружения +- Запуск тестов с/без LDAP +- Примеры параметризованных тестов +- Troubleshooting +- CI/CD integration примеры + +### 5. Исправления тестов ✅ + +**Исправлено:** +- Удален неправильный `@pytest.fixture` из `make_user` в test_employees.py +- Обновлены пути к `_is_ldap_enabled` после разделения views +- Добавлен импорт `ldap_fixtures` в `conftest.py` +- Добавлены LDAP маркеры в `pytest.ini` +- Начато обновление test_department_head_rights.py + +## Как использовать + +### Запуск LDAP контейнера + +```bash +# Запустить LDAP +docker-compose --profile ldap up -d ldap ldap-admin + +# Проверить статус +docker ps | grep ldap + +# Логи +docker-compose logs -f ldap +``` + +### Запуск тестов + +```bash +cd backend + +# Все тесты (с LDAP если доступен) +../.venv/Scripts/python -m pytest tests/api/v1/employees/ -v + +# Только тесты требующие LDAP +../.venv/Scripts/python -m pytest tests/api/v1/employees/ -v -m ldap_required + +# Только тесты без LDAP +LDAP_ENABLED=false ../.venv/Scripts/python -m pytest tests/api/v1/employees/ -v +``` + +### Написание новых тестов + +#### Тест с обязательным LDAP: + +```python +from tests.api.v1.employees.test_helpers import make_user + +@pytest.mark.ldap_required +def test_ldap_sync(api_client, ldap_cleanup): + """Тест автоматически скипается если LDAP недоступен.""" + user = make_user(email="test@example.com") + ldap_cleanup.add_for_deletion(user.ldap_dn) + + # Проверяем синхронизацию + assert user.ldap_dn is not None +``` + +#### Параметризованный тест (с LDAP и без): + +```python +@pytest.mark.ldap_optional +@pytest.mark.parametrize("with_ldap", [True, False]) +def test_employee_creation(api_client, with_ldap, settings): + """Тест работает в обоих режимах.""" + settings.LDAP_ENABLED = with_ldap + + user = make_user(email="test@example.com") + + # Проверяем что работает в обоих случаях + assert user.id is not None + + if with_ldap: + assert hasattr(user, 'ldap_dn') +``` + +#### Использование централизованных helpers: + +```python +from tests.api.v1.employees.test_helpers import ( + make_user, + grant_permission, + make_department +) + +def test_department_permission(api_client): + user = make_user(staff=True) + dept = make_department(name="IT") + grant_permission(user, "employees.manage_department") + + api_client.force_authenticate(user=user) + # ... тест +``` + +## Что осталось сделать + +### 1. Обновить остальные тестовые файлы (12 файлов) + +Заменить локальные `make_user`, `_make_user`, `_user`, `_grant` на импорты из `test_helpers`: + +- ✅ test_employees.py +- ✅ test_email_verification_security.py +- ✅ test_employee_actions.py +- 🔧 test_department_head_rights.py (частично) +- ⬜ test_department_membership_separation.py +- ⬜ test_department_roles.py +- ⬜ test_department_roles_extra.py +- ⬜ test_departments.py +- ⬜ test_employees_fields_in_list.py +- ⬜ test_ldap_optional_groups.py +- ⬜ test_positions.py +- ⬜ test_role_assignment.py +- ⬜ test_skills.py + +**Скрипт для автоматизации:** +`backend/scripts/update_test_helpers.py` - готов к использованию + +### 2. Добавить параметризацию для LDAP тестов + +Обновить существующие тесты с маркером `@pytest.mark.skip` для работы с реальным LDAP: + +- test_ldap_optional_register.py +- test_ldap_optional_verify_email.py +- test_ldap_optional_groups.py +- test_ldap_optional_departments.py + +### 3. Расширить LDAP фикстуры + +Добавить: +- Фикстуру для создания тестовых пользователей в LDAP +- Фикстуру для создания тестовых групп в LDAP +- Фикстуру для создания тестовых отделов в LDAP + +### 4. Добавить integration тесты + +Создать полноценные интеграционные тесты: +- Создание пользователя: DB → LDAP sync +- Обновление пользователя: DB → LDAP sync +- Удаление пользователя: DB → LDAP sync +- Rollback при ошибках LDAP +- Работа без LDAP (fallback mode) + +### 5. CI/CD интеграция + +Добавить в GitHub Actions: +- Запуск LDAP контейнера в service +- Параллельные тесты: с LDAP и без LDAP +- Отчеты о покрытии LDAP кода + +## Метрики улучшений + +**До:** +- 81 failed, 37 passed, 19 errors +- Много дубликатов кода в тестах +- Нет инфраструктуры для LDAP тестирования +- Тесты не проверяют реальную интеграцию с LDAP + +**После:** +- 74 failed, 59 passed, 4 errors (+22 passed, -15 errors) +- Централизованные helpers +- Полная LDAP инфраструктура +- Готовность к интеграционным тестам + +**Прогресс:** +37% passed tests, -79% errors + +## Следующие шаги + +1. **Запустить скрипт обновления:** + ```bash + cd backend + ../.venv/Scripts/python scripts/update_test_helpers.py + ``` + +2. **Проверить обновленные тесты:** + ```bash + ../.venv/Scripts/python -m pytest tests/api/v1/employees/ -v --tb=short + ``` + +3. **Запустить LDAP контейнер и протестировать:** + ```bash + docker-compose --profile ldap up -d + ../.venv/Scripts/python -m pytest tests/api/v1/employees/ -v -m ldap_optional + ``` + +4. **Добавить параметризацию в ключевые тесты** + +5. **Написать интеграционные тесты для ExternalSystemSyncMixin** + +## Заключение + +✅ **Создана полная инфраструктура для тестирования с LDAP** +✅ **Централизованы helper-функции** +✅ **Добавлена документация** +✅ **Исправлены критические проблемы тестов** +🔧 **В процессе: обновление оставшихся 12 тестовых файлов** +⬜ **Следующее: интеграционные тесты с реальным LDAP** + +Архитектура готова к полноценному тестированию как с LDAP, так и без него!