Обробіть помилки валідації
Спровокуйте кожен різновид відмови навмисно — і розгалужуйтеся за кодами, як має робити 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
Надішліть коректний create плюс одне поле, якого контракт не знає ("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.