Песочница и фикстуры
Аудитория: интеграции, работающие с
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, …) | — |
scenario | snake_case | not_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_found | NOT_FOUND | 404 |
sb_prod_offline | PRODUCT_UNAVAILABLE | 422 |
sb_prod_no_stock | Detail ok, stock: 0 | 200 |
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_empty | items: [], total: 0 |
sb_search_not_found | Алиас пустого результата |
Parse / upload-image / search-by-image / freight / analytics
| Endpoint | Примечание для песочницы |
|---|---|
| Parse URL | URL query/path, содержащий sb_*, повторяет поведение detail. |
| Upload image | Всегда { "image_id": "img_sandbox_mock" } после успешной валидации. |
| Image search | Опциональный keyword: sb_search_empty даёт пустой список; сочетайте с upload-image для flow-тестов. |
| Advanced — freight estimate | Mock внутренней доставки по умолчанию 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_unpaid | wait_payment | — |
sb_ord_paid | wait_shipment | — |
sb_ord_shipped | wait_receive | — |
sb_ord_completed | completed | — |
sb_ord_cancelled | cancelled | — |
sb_ord_refunding | wait_shipment (refund_status in progress) | — |
sb_ord_not_found | — | 404 |
POST /v1/orders/pay
order_id | Результат | HTTP |
|---|---|---|
sb_ord_unpaid | Успешная оплата → логическое состояние paid | 200 |
sb_ord_pay_declined | PAYMENT_DECLINED | 402 |
sb_ord_pay_insufficient | PAYMENT_INSUFFICIENT_FUNDS | 402 |
sb_ord_paid | ORDER_ALREADY_PAID | 409 |
sb_ord_cancelled | ORDER_CANCELLED | 409 |
sb_ord_upstream_timeout | CHANNEL_UPSTREAM_ERROR | 502 |
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_trigger | HTTP | error.code |
|---|---|---|
sb_plat_quota_exceeded | 429 | QUOTA_EXCEEDED |
sb_plat_rate_limited | 429 | RATE_LIMIT_EXCEEDED |
sb_plat_upstream_error | 502 | CHANNEL_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».
Снимок статуса реализации
| Фаза | Покрытие | Примечания |
|---|---|---|
| Shipped | Product + 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.