Мок-API

Управление ответом

Заголовки X-Mock-Scenario и X-Mock-Delay, задержка метода и доля случайных ошибок песочницы.

На этой странице · 4

Ошибочные ветки в интеграции обычно не проверены: воспроизвести на боевом API просроченный токен, лимит или таймаут трудно. В песочнице ответ выбирается заголовком запроса, а задержка задаётся числом миллисекунд.

X-Mock-Scenario

Значения заголовка

ЗначениеЧто отдаёт шлюз
successобычный успешный ответ (значение по умолчанию)
invalid_tokenошибка авторизации в конверте сервиса
not_found«не найдено» в конверте сервиса
rate_limitпревышение лимита, с кодом и заголовками этого сервиса
server_errorвнутренняя ошибка сервиса
timeoutответа нет 30 секунд, затем 504

Сценарий применяется к найденному методу: путь всё равно должен существовать в каталоге, иначе ответом будет обычный 404. Неизвестное значение заголовка трактуется как success — запрос не отклоняется.

Один и тот же сценарий у разных сервисов выглядит по-разному, потому что по-разному выглядит в бою:

curl -i -X POST localhost:8080/b24/rest/crm.deal.list.json \
  -H "X-Mock-Key: $KEY" -H "X-Mock-Scenario: rate_limit"
HTTP/1.1 503 Service Unavailable
{"error":"QUERY_LIMIT_EXCEEDED","error_description":"Too many requests"}

Сценарий отработавшего запроса возвращается в заголовке X-APIStend-Scenario — по нему в тесте видно, что сработала именно нужная ветка.

Таймаут занимает соединение на 30 секунд

X-Mock-Scenario: timeout держит соединение открытым ровно 30 секунд, затем отвечает 504 в конверте сервиса. Это и есть смысл сценария — проверить, что ваш клиент не ждёт вечно, — но в наборе тестов такой вызов лучше держать отдельно от быстрых: тридцать секунд он стоит всегда.

X-Mock-Delay

Задержка ответа в миллисекундах, от 0 до 3000. Значение выше потолка обрезается до 3000, 0 отдаёт ответ немедленно.

curl -s -o /dev/null -w "%{time_total}\n" \
  localhost:8080/wb/api/v3/warehouses -H "X-Mock-Key: $KEY" -H "X-Mock-Delay: 1500"
# 1.504517

Приоритет источников задержки:

  1. 1

    Заголовок X-Mock-Delay

    Если он есть и разбирается как число — задержка равна ему.

  2. 2

    Настройка песочницы latencyMs и задержка метода

    Без заголовка берётся меньшее из двух. У методов каталога задержка сейчас одинаковая — 180 мс, — поэтому на песочнице с настройкой 250 мс ответ приходит примерно через 180 мс.

Доля случайных ошибок

У песочницы есть настройка errorRate — доля запросов, которым шлюз ответит ошибкой вместо успеха (в демо-данных это 5 %, потолок настройки — 50 %). Бросок кубика настоящий, а не выведенный из запроса: смысл настройки в том, чтобы один и тот же вызов иногда падал. Сработавшая ошибка приходит как сценарий server_error, и это видно в X-APIStend-Scenario.

Кубик бросается только там, где сценарий остался success: запрос с любым другим значением X-Mock-Scenario отдаёт заказанный сценарий, а не случайную ошибку.

Подводные камни

Из запроса читается страница, но не фильтры

Ответ зависит от метода каталога, объёма демо-данных песочницы, запрошенной страницы и сегодняшней даты. Всё остальное шлюз не читает: фильтры, поиск, диапазоны дат и признаки в теле на выдачу не влияют.

Два запроса, отличающиеся только фильтром, дают побайтово одинаковый ответ:

curl -s -X POST localhost:8080/wb/api/v3/stocks/1   -d '{"skus":["1"]}'          -H "X-Mock-Key: $KEY" | md5
curl -s -X POST localhost:8080/wb/api/v3/stocks/777 -d '{"skus":["999","888"]}' -H "X-Mock-Key: $KEY" | md5
# один и тот же хеш

А вот страница читается: limit, offset, номер страницы и курсор Wildberries (settings.cursor.nmID) двигают выдачу по каталогу, и обход заканчивается пустым списком. Фильтрации и записи данных в шлюзе нет — для ответов, зависящих от вашего запроса, заводите собственные моки по префиксу /custom/.

Даты живут относительно сегодня

Примеры в спецификациях датированы днём, когда их написали: заказы Wildberries — мартом 2022 года, воронка продаж — периодом с июня 2023 по март 2024. Клиент почти всегда считает витрину за последние 7, 30 или 90 дней и не нашёл бы в ней ничего.

Поэтому даты ответа сдвигаются так, чтобы самая свежая пришлась на сегодня, а расстояния между ними сохранились: заказы, стоявшие через двое суток, так и останутся через двое. Сроки действия — till, expiresAt, dtNextBox — уезжают в будущее, а не схлопываются в сегодняшний день.

Следствие для определённости: ответ повторяется побайтово в пределах суток, а назавтра даты в нём уезжают на сутки вперёд. В журнале запросов тело восстанавливается на момент самого запроса, поэтому там даты остаются теми, которые получил клиент.

  • Смена dataVolume песочницы меняет весь набор демо-данных: идентификаторы из прошлых ответов после этого не совпадут.
  • Задержка выдерживается после сборки ответа, лимит частоты считается до неё: на X-Mock-Delay: 3000 ведро расходуется в момент запроса, а не через три секунды.