Обработайте ошибки валидации
Спровоцируйте каждый вид отказа нарочно и ветвитесь по кодам так, как положено production-коду.
Обработка ошибок, написанная по реальности: каждый шаг провоцирует один режим отказа и проверяет точный error.code, по которому должна ветвиться ваша интеграция (Errors and Conventions).
Цель
Увидеть 400, 404, 409 и оба кода 422 вживую, каждый с полями конверта, которые нужны вашим логам и UI.
Предварительные условия
$CREDS_BASE,$TOKENи провайдер, чья схема требуетapi_key(сценарий 01).
Шаги
1. Секрет, нарушающий схему → 422
Создайте с неверным секретным объектом (поле пропущено, лишние добавлены):
curl -s -X POST "$CREDS_BASE/v1/credentials" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"provider_code": "'$CODE'",
"name": "broken",
"credentials": {"wrong_field": "x"}
}'
Ожидаемый 422, error.code = "CREDENTIAL_SCHEMA_VALIDATION_FAILED"; error.details.errors указывает на проблемные поля, не эхо-повторяя ваши значения (Provider Schemas). Некорректная configuration падает так же — как CONFIGURATION_SCHEMA_VALIDATION_FAILED.
2. Неизвестное поле тела → 400
Отправьте корректное создание плюс одно поле, которого контракт не знает ("note": "hi"). Ожидаемый 400 INVALID_REQUEST — неизвестные поля отклоняются, а не молча выбрасываются.
3. Провайдер, которого не существует → 404
Создайте против no_such_provider. Ожидаемый 404 PROVIDER_NOT_FOUND — и помните: тот же код покрывает провайдеров, которых ваша роль не видит.
4. Устаревшая версия → 409
Создайте валидный credential, затем дважды сделайте PATCH с одной и той же version:
first = httpx.patch(url, headers=headers, json={"name": "renamed", "version": 1})
assert first.status_code == 200
second = httpx.patch(url, headers=headers, json={"name": "again", "version": 1})
assert second.status_code == 409
assert second.json()["error"]["code"] == "CREDENTIAL_VERSION_CONFLICT"
Ожидаемо: вторая запись проигрывает чисто — перечитайте ради свежей версии, затем повторите (Defaults and Lifecycle).
5. Конверт всегда один и тот же
Каждый сбой выше нёс error.code, error.message, error.details, error.correlation_id. Ветвитесь по коду; логируйте correlation id; пользователям показывайте собственные слова. Полная таблица кодов: Error Codes.
Проверено тестом test_s10_handle_validation_errors.