Песочница и фикстуры

Аудитория: интеграции, работающие с https://api.hiobuy.com (шлюз Workers) — тот же базовый URL, что и в production.

Аутентификация: детерминированные фикстуры применяются только к API-ключам с префиксом hio_test_* (key_type: test). Production-ключи hio_live_* никогда не используют правила этой страницы — они всегда обращаются к upstream-маркетплейсам в обычном режиме.

Связанные документы: Authentication · Response format · Errors · Rate limits · Products · Orders · Webhooks

Покрытие Public API (кратко)

ОбластьПесочница
Глобальноresponse_format: upstream отклоняется (только standard). Поле currency в теле отклоняется, как в prod. sandbox_trigger разрешён для test-ключей (фикстуры платформы). Channel OAuth считается авторизованным для hio_test_*. Квоты и rate limits пропускаются для test-ключей.
/v1/products/*Search, detail, parse, upload-image, search-by-image, freight estimate, batch-check, аналитика 1688 замокированы, как описано ниже. Расширения только в OpenAPI, не входящие в набор handoff этого сайта, не замокированы.
/v1/orders/*Preview, create, detail, pay, cancel, logistics trace, list, purchase query замокированы с magic / dynamic id.
/v1/fulfillment/*Не замокированы в шлюзе на данный момент — считайте недоступными в песочнице.
WebhooksЗаказы в песочнице не отправляют webhooks.

Цели проектирования

ЦельЗначение
ПовторяемостьОдин и тот же запрос → один и тот же ответ (без случайности в результатах).
ДокументированностьУ каждого сценария есть стабильный id или keyword для поиска на этой странице.
Соответствие контрактуJSON соответствует полям схемы standard из production; значения отличаются.
Happy path по умолчаниюНеизвестные id возвращают generic success mocks.
Явный сбойИспользуйте id sb_* или sandbox_trigger для принудительных ошибок / пограничных состояний.

Именование: sb_{domain}_{scenario}

СегментПравилоПримеры
ПрефиксВсегда sb_sb_prod_not_found
domainСуществительное в нижнем регистре (prod, search, ord, plat, auth, …)
scenariosnake_casenot_found, pay_declined

Символы: [a-z0-9_], длина ≤ ~48. Не добавляйте префикс sb_ к реальным upstream id, если не хотите сработать фикстуру.

Два уровня сбоев

Различайте транспортные/API-ошибки и бизнес-состояния при HTTP 200:

  • Сбой API → HTTP 4xx/5xx + error.code (напр. NOT_FOUND, PAYMENT_DECLINED).
  • HTTP 200 со состоянием → напр. variants[].stock = 0, status: wait_payment.

Фикстуры товаров (кратко)

POST /v1/products/detail

См. Product detail. Формат upstream в песочнице не поддерживается.

Срабатывает, когда product_id, разобранный url, mi_id или tao_password разрешается в id sb_*.

Fixture idРезультатHTTP
(любой id без sb_)Стандартный mock-товар200
sb_prod_not_foundNOT_FOUND404
sb_prod_offlinePRODUCT_UNAVAILABLE422
sb_prod_no_stockDetail ok, stock: 0200
curl https://api.hiobuy.com/v1/products/detail \
  -H "Authorization: Bearer hio_test_..." \
  -H "Content-Type: application/json" \
  -d '{"channel":"1688","product_id":"sb_prod_not_found","language":"en"}'

POST /v1/products/search

Применяются channel, keyword, page, page_size, language. Фильтры 1688 filter / sort / price принимаются, но игнорируются для mock-строк.

keyword (точное)Результат
обычный текстMock-список с результатами
sb_search_emptyitems: [], total: 0
sb_search_not_foundАлиас пустого результата

Parse / upload-image / search-by-image / freight / analytics

EndpointПримечание для песочницы
Parse URLURL query/path, содержащий sb_*, повторяет поведение detail.
Upload imageВсегда { "image_id": "img_sandbox_mock" } после успешной валидации.
Image searchОпциональный keyword: sb_search_empty даёт пустой список; сочетайте с upload-image для flow-тестов.
Advanced — freight estimateMock внутренней доставки по умолчанию 800 minor units, согласовано с preview.
Advanced — batch-checkВозвращает upstream-style envelope с mock mpProducts; используйте sb_prod_not_found в mi_id/item_id для списков исключений.
Advanced — top keywords/list / daily-sales-trendИспользуйте sb_search_empty на category_id / rank_id, где описано, для пустых списков или 404 detail.

Фикстуры заказов и оплаты (magic id)

POST /v1/orders/detail

order_idТипичный statusПримечания
sb_ord_unpaidwait_payment
sb_ord_paidwait_shipment
sb_ord_shippedwait_receive
sb_ord_completedcompleted
sb_ord_cancelledcancelled
sb_ord_refundingwait_shipment (refund_status in progress)
sb_ord_not_found404

POST /v1/orders/pay

order_idРезультатHTTP
sb_ord_unpaidУспешная оплата → логическое состояние paid200
sb_ord_pay_declinedPAYMENT_DECLINED402
sb_ord_pay_insufficientPAYMENT_INSUFFICIENT_FUNDS402
sb_ord_paidORDER_ALREADY_PAID409
sb_ord_cancelledORDER_CANCELLED409
sb_ord_upstream_timeoutCHANNEL_UPSTREAM_ERROR502

Preview / create

Preview возвращает фиксированные иллюстративные итоги (пример строки ~4500 + freight ~800 в minor units). Create выдаёт динамические order_id с префиксом sbo_*, сохраняемые в sandbox storage — строки с offer_id: sb_prod_offline / sb_prod_no_stock возвращают 422, как в production.

Cancel / logistics / list / purchase query

По cancel, trace, detail list: неоплаченные sb_ord_* и динамические неоплаченные sbo_* отменяются; фикстуры paid/shipped и т.д. возвращают ORDER_NOT_CANCELLABLE. Logistics возвращает packages для mock sb_ord_shipped / completed; unpaid/paid-await-shipment возвращают packages: []. Список покупателя учитывает product_name: sb_ord_list_empty для пустых mock. Purchase query возвращает upstream envelopes; соответственно не используйте pseudo id для not-found.

Триггеры платформы: sandbox_trigger

Разрешён только на hio_test_*; production-ключи тихо игнорируют поле.

sandbox_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_UPSTREAM_ERROR

Комбинируйте с безопасными id, чтобы реалистичные тела проходили валидацию:

{
  "channel": "1688",
  "product_id": "123456",
  "language": "en",
  "sandbox_trigger": "sb_plat_quota_exceeded"
}

Специальная auth-фикстура sb_auth_channel_required, сочетаемая с триггерами, может давать CHANNEL_AUTH_REQUIRED (403) для UI-регрессий, несмотря на правило «authorized by default».

Снимок статуса реализации

ФазаПокрытиеПримечания
ShippedProduct + procurement APIs вышеОтражает подмножество Public API, опубликованное на этом сайте.
Not yetПолный /v1/fulfillment/*, webhooks, неопубликованные маршруты только в OpenAPIНе полагайтесь на них в sandbox CI, пока не объявлено.

Краткая шпаргалка

sb_prod_not_found          → 404 product missing
sb_prod_offline            → 422 unavailable
sb_prod_no_stock           → 200 detail with zero stock

sb_search_empty            → empty search/items
sb_ord_list_empty          → empty buyer order list filter
img_sandbox_mock           → stable upload-image id

sb_ord_unpaid              → detail wait_payment • pay succeeds • cancel ok
sb_ord_pay_declined        → pay 402 PAYMENT_DECLINED
sb_ord_paid                → pay 409 ALREADY_PAID • trace maybe empty until shipped fixtures
sb_ord_shipped             → detail wait_receive • trace populated
sb_ord_cancelled           → cancelled state • pay conflicts

sb_plat_quota_exceeded     → sandbox_trigger → 429 QUOTA_EXCEEDED

При добавлении фикстур внутри команды отражайте эту схему нумерации в регрессионных тестах — никогда не меняйте формы JSON standard внутри mock.