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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions