-
Notifications
You must be signed in to change notification settings - Fork 1
Description
Бизнес-требования для работы с внешними сервисами NetBox
Сценарий 1.1: Успешная отправка census данных
Описание: Проверить успешную отправку анонимной статистики на census сервер
Предусловия:
- CENSUS_URL настроен корректно
- Сеть доступна
Шаги:
- Создать экземпляр HousekeepingJob
- Вызвать метод submit_census()
- Проверить, что requests.get вызван с правильными параметрами
Ожидаемый результат:
- Запрос отправлен на https://census.netbox.oss.netboxlabs.com/api/v1/
- Переданы корректные данные: version, python_version, deployment_id
- Установлен timeout=3
Сценарий 1.2: Обработка таймаута при отправке census
Описание: Проверить корректную обработку таймаута сети
Предусловия: Census сервер недоступен или медленно отвечает
Шаги:
- Замокать requests.get для выброса requests.exceptions.Timeout
- Вызвать submit_census()
- Проверить, что исключение обработано корректно
Ожидаемый результат:
- Исключение перехвачено
- Приложение продолжает работу
- Логи не содержат критических ошибок
Сценарий 1.3: Обработка ошибки сети при отправке census
Описание: Проверить обработку различных сетевых ошибок
Предусловия: Сетевые проблемы (DNS, connection refused, etc.)
Шаги:
- Замокать requests.get для выброса requests.exceptions.ConnectionError
- Вызвать submit_census()
- Проверить обработку ошибки
Ожидаемый результат:
- RequestException перехвачено
- Метод завершается без краха приложения
Сценарий 1.4: Отправка census через прокси
Описание: Проверить корректную работу с прокси сервером
Предусловия:
- Настроен HTTP_PROXY в конфигурации
- resolve_proxies возвращает прокси настройки
Шаги:
- Настроить прокси в конфигурации
- Замокать resolve_proxies
- Вызвать submit_census()
- Проверить, что requests.get вызван с параметром proxies
Ожидаемый результат:
- Запрос отправлен через прокси
- Параметр proxies передан в requests.get
Сценарий 2.1: Использование SSL сертификатов
Описание: Проверить поведение при невалидном SSL сертификате
Предусловия:
- Webhook настроен с ssl_verification=True
- URL использует невалидный SSL сертификат
Шаги:
- Создать webhook с ssl_verification=True
- Замокать requests для выброса SSLError
- Вызвать send_webhook()
- Проверить обработку SSL ошибки
Ожидаемый результат:
- SSLError обработано корректно
- Webhook помечается как неуспешный
- Ошибка залогирована
Сценарий 3.1: Использование custom CA файла
Описание: Проверить корректную настройку custom CA сертификата
Предусловия:
- Webhook настроен с ca_file_path
- CA файл существует и валиден
Шаги:
- Создать webhook с ca_file_path="/path/to/ca.pem"
- Вызвать send_webhook()
- Проверить, что session.verify установлен в путь к CA файлу
Ожидаемый результат:
- session.verify = "/path/to/ca.pem"
- Запрос использует custom CA для проверки
Сценарий 3.2: Webhook через прокси сервер
Описание: Проверить отправку webhook через прокси
Предусловия:
- Настроен прокси сервер
- resolve_proxies возвращает прокси настройки
Шаги:
- Замокать resolve_proxies для возврата прокси конфигурации
- Вызвать send_webhook()
- Проверить использование прокси в запросе
Ожидаемый результат:
- Запрос отправлен через прокси
- Прокси настройки переданы в session
Сценарий 3.3: Ошибка рендеринга заголовков webhook
Описание: Проверить обработку ошибок в шаблонах заголовков
Предусловия: Webhook содержит невалидный шаблон в additional_headers
Шаги:
- Создать webhook с некорректным шаблоном в заголовках
- Замокать webhook.render_headers для выброса исключения
- Вызвать send_webhook()
- Проверить логирование ошибки
Ожидаемый результат:
- Ошибка залогирована: "Error parsing HTTP headers for webhook {webhook}: {e}"
- Webhook не отправляется
- Возвращается None
Сценарий 3.4: Ошибка рендеринга тела webhook
Описание: Проверить обработку ошибок в шаблоне тела запроса
Предусловия: Webhook содержит невалидный шаблон тела
Шаги:
- Создать webhook с некорректным шаблоном тела
- Замокать webhook.render_body для выброса исключения
- Вызвать send_webhook()
- Проверить логирование ошибки
Ожидаемый результат:
- Ошибка залогирована: "Error rendering request body for webhook {webhook}: {e}"
- Webhook не отправляется
- Возвращается None
Сценарий 4.1: Команда с опцией --check-releases при недоступном GitHub
Описание: Проверить поведение команды при недоступности GitHub API
Предусловия:
- RELEASE_CHECK_URL настроен
- GitHub API недоступен
Шаги:
- Замокать requests.get для выброса ConnectionError
- Запустить команду с --check-releases
- Проверить вывод ошибки
Ожидаемый результат:
- Команда завершается без краха
- Выводится сообщение об ошибке
- Exit code = 0 (не критическая ошибка)
Сценарий 4.2: Команда с verbosity=2 показывает детали запросов
Описание: Проверить подробный вывод при высоком уровне verbosity
Предусловия: Команда запущена с -v 2
Шаги:
- Запустить команду с --check-releases -v 2
- Замокать успешный ответ от GitHub
- Проверить вывод URL запроса
Ожидаемый результат:
- Выводится "Fetching https://api.github.com/repos/netbox-community/netbox/releases"
- Показываются найденные релизы
- Подробная информация о процессе
Сценарий 4.3: RELEASE_CHECK_URL не настроен в команде
Описание: Проверить поведение команды при отключенной проверке релизов
Предусловия: RELEASE_CHECK_URL = None
Шаги:
- Установить RELEASE_CHECK_URL = None
- Запустить команду с --check-releases
- Проверить сообщение о пропуске
Ожидаемый результат:
- Выводится "Skipping: RELEASE_CHECK_URL not set"
- Команда завершается успешно
- Никаких HTTP запросов не делается
Сценарий 5.1: Недоступность каталога плагинов
Описание: Проверить поведение при недоступности api.netbox.oss.netboxlabs.com
Предусловия: Каталог плагинов недоступен
Шаги:
- Замокать requests.get для выброса ConnectionError
- Вызвать get_catalog_plugins()
- Проверить возврат пустого словаря
Ожидаемый результат:
- Возвращается пустой словарь {}
- Ошибка обработана корректно
- Приложение продолжает работу
Сценарий 5.2: Каталог плагинов возвращает невалидный JSON
Описание: Проверить обработку поврежденного ответа от каталога
Предусловия: API возвращает невалидный JSON
Шаги:
- Замокать response.json() для выброса JSONDecodeError
- Вызвать get_catalog_plugins()
- Проверить обработку ошибки
Ожидаемый результат:
- JSONDecodeError обработано
- Возвращается пустой словарь
- Ошибка залогирована
Сценарий 5.3: Изолированное развертывание (ISOLATED_DEPLOYMENT=True)
Описание: Проверить отключение внешних запросов в изолированном режиме
Предусловия: ISOLATED_DEPLOYMENT = True
Шаги:
- Установить settings.ISOLATED_DEPLOYMENT = True
- Вызвать get_catalog_plugins()
- Проверить, что HTTP запросы не делаются
Ожидаемый результат:
- Возвращается пустой словарь {}
- Никаких HTTP запросов не выполняется
- Метод завершается досрочно
Сценарий 6.1: Некорректные настройки прокси
Описание: Проверить обработку невалидных прокси настроек
Предусловия: HTTP_PROXY содержит невалидный URL
Шаги:
- Установить HTTP_PROXY = "invalid-proxy-url"
- Вызвать resolve_proxies()
- Проверить обработку ошибки
Ожидаемый результат:
- Невалидные настройки игнорируются
- Возвращается None или пустой словарь
- Ошибка обработана корректно
Сценарий 6.2: SOCKS прокси конфигурация
Описание: Проверить поддержку SOCKS прокси
Предусловия: Настроен SOCKS прокси
Шаги:
- Настроить SOCKS прокси в конфигурации
- Вызвать resolve_proxies()
- Проверить корректную обработку SOCKS
Ожидаемый результат:
- SOCKS прокси корректно обработан
- Возвращаются правильные настройки для requests
Инструменты для тестирования
- unittest.mock.patch - для мокирования HTTP запросов
- requests_mock - альтернатива для мокирования requests
- pytest-httpserver - для создания тестового HTTP сервера
- Django TestCase - базовый класс для тестов