Skip to content

Бизнес-требования к работе с внешними сервисами #3

@Tozarin

Description

@Tozarin

Бизнес-требования для работы с внешними сервисами NetBox

Сценарий 1.1: Успешная отправка census данных

Описание: Проверить успешную отправку анонимной статистики на census сервер
Предусловия:

  • CENSUS_URL настроен корректно
  • Сеть доступна

Шаги:

  1. Создать экземпляр HousekeepingJob
  2. Вызвать метод submit_census()
  3. Проверить, что requests.get вызван с правильными параметрами

Ожидаемый результат:

Сценарий 1.2: Обработка таймаута при отправке census

Описание: Проверить корректную обработку таймаута сети
Предусловия: Census сервер недоступен или медленно отвечает

Шаги:

  1. Замокать requests.get для выброса requests.exceptions.Timeout
  2. Вызвать submit_census()
  3. Проверить, что исключение обработано корректно

Ожидаемый результат:

  • Исключение перехвачено
  • Приложение продолжает работу
  • Логи не содержат критических ошибок

Сценарий 1.3: Обработка ошибки сети при отправке census

Описание: Проверить обработку различных сетевых ошибок
Предусловия: Сетевые проблемы (DNS, connection refused, etc.)

Шаги:

  1. Замокать requests.get для выброса requests.exceptions.ConnectionError
  2. Вызвать submit_census()
  3. Проверить обработку ошибки

Ожидаемый результат:

  • RequestException перехвачено
  • Метод завершается без краха приложения

Сценарий 1.4: Отправка census через прокси

Описание: Проверить корректную работу с прокси сервером
Предусловия:

  • Настроен HTTP_PROXY в конфигурации
  • resolve_proxies возвращает прокси настройки

Шаги:

  1. Настроить прокси в конфигурации
  2. Замокать resolve_proxies
  3. Вызвать submit_census()
  4. Проверить, что requests.get вызван с параметром proxies

Ожидаемый результат:

  • Запрос отправлен через прокси
  • Параметр proxies передан в requests.get

Сценарий 2.1: Использование SSL сертификатов

Описание: Проверить поведение при невалидном SSL сертификате
Предусловия:

  • Webhook настроен с ssl_verification=True
  • URL использует невалидный SSL сертификат

Шаги:

  1. Создать webhook с ssl_verification=True
  2. Замокать requests для выброса SSLError
  3. Вызвать send_webhook()
  4. Проверить обработку SSL ошибки

Ожидаемый результат:

  • SSLError обработано корректно
  • Webhook помечается как неуспешный
  • Ошибка залогирована

Сценарий 3.1: Использование custom CA файла

Описание: Проверить корректную настройку custom CA сертификата
Предусловия:

  • Webhook настроен с ca_file_path
  • CA файл существует и валиден

Шаги:

  1. Создать webhook с ca_file_path="/path/to/ca.pem"
  2. Вызвать send_webhook()
  3. Проверить, что session.verify установлен в путь к CA файлу

Ожидаемый результат:

  • session.verify = "/path/to/ca.pem"
  • Запрос использует custom CA для проверки

Сценарий 3.2: Webhook через прокси сервер

Описание: Проверить отправку webhook через прокси
Предусловия:

  • Настроен прокси сервер
  • resolve_proxies возвращает прокси настройки

Шаги:

  1. Замокать resolve_proxies для возврата прокси конфигурации
  2. Вызвать send_webhook()
  3. Проверить использование прокси в запросе

Ожидаемый результат:

  • Запрос отправлен через прокси
  • Прокси настройки переданы в session

Сценарий 3.3: Ошибка рендеринга заголовков webhook

Описание: Проверить обработку ошибок в шаблонах заголовков
Предусловия: Webhook содержит невалидный шаблон в additional_headers

Шаги:

  1. Создать webhook с некорректным шаблоном в заголовках
  2. Замокать webhook.render_headers для выброса исключения
  3. Вызвать send_webhook()
  4. Проверить логирование ошибки

Ожидаемый результат:

  • Ошибка залогирована: "Error parsing HTTP headers for webhook {webhook}: {e}"
  • Webhook не отправляется
  • Возвращается None

Сценарий 3.4: Ошибка рендеринга тела webhook

Описание: Проверить обработку ошибок в шаблоне тела запроса
Предусловия: Webhook содержит невалидный шаблон тела

Шаги:

  1. Создать webhook с некорректным шаблоном тела
  2. Замокать webhook.render_body для выброса исключения
  3. Вызвать send_webhook()
  4. Проверить логирование ошибки

Ожидаемый результат:

  • Ошибка залогирована: "Error rendering request body for webhook {webhook}: {e}"
  • Webhook не отправляется
  • Возвращается None

Сценарий 4.1: Команда с опцией --check-releases при недоступном GitHub

Описание: Проверить поведение команды при недоступности GitHub API
Предусловия:

  • RELEASE_CHECK_URL настроен
  • GitHub API недоступен

Шаги:

  1. Замокать requests.get для выброса ConnectionError
  2. Запустить команду с --check-releases
  3. Проверить вывод ошибки

Ожидаемый результат:

  • Команда завершается без краха
  • Выводится сообщение об ошибке
  • Exit code = 0 (не критическая ошибка)

Сценарий 4.2: Команда с verbosity=2 показывает детали запросов

Описание: Проверить подробный вывод при высоком уровне verbosity
Предусловия: Команда запущена с -v 2

Шаги:

  1. Запустить команду с --check-releases -v 2
  2. Замокать успешный ответ от GitHub
  3. Проверить вывод URL запроса

Ожидаемый результат:

Сценарий 4.3: RELEASE_CHECK_URL не настроен в команде

Описание: Проверить поведение команды при отключенной проверке релизов
Предусловия: RELEASE_CHECK_URL = None

Шаги:

  1. Установить RELEASE_CHECK_URL = None
  2. Запустить команду с --check-releases
  3. Проверить сообщение о пропуске

Ожидаемый результат:

  • Выводится "Skipping: RELEASE_CHECK_URL not set"
  • Команда завершается успешно
  • Никаких HTTP запросов не делается

Сценарий 5.1: Недоступность каталога плагинов

Описание: Проверить поведение при недоступности api.netbox.oss.netboxlabs.com
Предусловия: Каталог плагинов недоступен

Шаги:

  1. Замокать requests.get для выброса ConnectionError
  2. Вызвать get_catalog_plugins()
  3. Проверить возврат пустого словаря

Ожидаемый результат:

  • Возвращается пустой словарь {}
  • Ошибка обработана корректно
  • Приложение продолжает работу

Сценарий 5.2: Каталог плагинов возвращает невалидный JSON

Описание: Проверить обработку поврежденного ответа от каталога
Предусловия: API возвращает невалидный JSON

Шаги:

  1. Замокать response.json() для выброса JSONDecodeError
  2. Вызвать get_catalog_plugins()
  3. Проверить обработку ошибки

Ожидаемый результат:

  • JSONDecodeError обработано
  • Возвращается пустой словарь
  • Ошибка залогирована

Сценарий 5.3: Изолированное развертывание (ISOLATED_DEPLOYMENT=True)

Описание: Проверить отключение внешних запросов в изолированном режиме
Предусловия: ISOLATED_DEPLOYMENT = True

Шаги:

  1. Установить settings.ISOLATED_DEPLOYMENT = True
  2. Вызвать get_catalog_plugins()
  3. Проверить, что HTTP запросы не делаются

Ожидаемый результат:

  • Возвращается пустой словарь {}
  • Никаких HTTP запросов не выполняется
  • Метод завершается досрочно

Сценарий 6.1: Некорректные настройки прокси

Описание: Проверить обработку невалидных прокси настроек
Предусловия: HTTP_PROXY содержит невалидный URL

Шаги:

  1. Установить HTTP_PROXY = "invalid-proxy-url"
  2. Вызвать resolve_proxies()
  3. Проверить обработку ошибки

Ожидаемый результат:

  • Невалидные настройки игнорируются
  • Возвращается None или пустой словарь
  • Ошибка обработана корректно

Сценарий 6.2: SOCKS прокси конфигурация

Описание: Проверить поддержку SOCKS прокси
Предусловия: Настроен SOCKS прокси

Шаги:

  1. Настроить SOCKS прокси в конфигурации
  2. Вызвать resolve_proxies()
  3. Проверить корректную обработку SOCKS

Ожидаемый результат:

  • SOCKS прокси корректно обработан
  • Возвращаются правильные настройки для requests

Инструменты для тестирования

  • unittest.mock.patch - для мокирования HTTP запросов
  • requests_mock - альтернатива для мокирования requests
  • pytest-httpserver - для создания тестового HTTP сервера
  • Django TestCase - базовый класс для тестов

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions