Entorno sandbox y fixtures

Audiencia: integraciones desplegadas contra https://api.hiobuy.com (gateway Workers) — misma URL base que en producción.

Auth: las fixtures deterministas aplican solo a claves API con prefijo hio_test_* (key_type: test). Las claves de producción hio_live_* nunca usan las reglas de esta página — siempre acceden a los marketplaces upstream con normalidad.

Documentación relacionada: Authentication · Response format · Errors · Rate limits · Products · Orders · Webhooks

Cobertura Public API (resumen)

ÁreaSandbox
Globalresponse_format: upstream rechazado (solo standard). Campo currency en el body rechazado como en prod. sandbox_trigger permitido para claves test (fixtures de plataforma). OAuth de canal tratado como autorizado para hio_test_*. Cuotas y rate limits omitidos para claves test.
/v1/products/*Search, detail, parse, upload-image, search-by-image, freight estimate, batch-check, analytics 1688 mockeados como se documenta abajo. Extensiones solo OpenAPI fuera del conjunto handoff de este sitio no mockeadas.
/v1/orders/*Preview, create, detail, pay, cancel, logistics trace, list, purchase query mockeados con magic / dynamic ids.
/v1/fulfillment/*No mockeados en el gateway hoy — trátelos como no disponibles en sandbox.
WebhooksLos pedidos sandbox no emiten webhooks.

Objetivos de diseño

ObjetivoSignificado
RepetibleMisma petición → misma respuesta (sin aleatoriedad en resultados).
DocumentadoCada escenario tiene un id o keyword estable para buscar en esta página.
Alineado al contratoJSON coincide con campos del esquema standard de producción; valores distintos.
Happy path por defectoIds desconocidos caen en mocks genéricos de éxito.
Fallo explícitoUse ids sb_* o sandbox_trigger para forzar errores / estados límite.

Nomenclatura: sb_{domain}_{scenario}

SegmentoReglaEjemplos
PrefijoSiempre sb_sb_prod_not_found
domainSustantivo en minúsculas (prod, search, ord, plat, auth, …)
scenariosnake_casenot_found, pay_declined

Caracteres: [a-z0-9_], longitud ≤ ~48. No prefije ids upstream reales con sb_ salvo que quiera la fixture.

Dos capas de fallo

Distinga errores de transporte/API de estados de negocio con HTTP 200:

  • Fallo API → HTTP 4xx/5xx + error.code (p. ej. NOT_FOUND, PAYMENT_DECLINED).
  • HTTP 200 con estado → p. ej. variants[].stock = 0, status: wait_payment.

Fixtures de productos (resumen)

POST /v1/products/detail

Vea Product detail. El formato upstream no está soportado en sandbox.

Se activa cuando product_id, url parseada, mi_id o tao_password se resuelve en un id sb_*.

Fixture idResultadoHTTP
(cualquier id no-sb_)Producto mock estándar200
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

Aplican channel, keyword, page, page_size, language. Filtros 1688 filter / sort / precio aceptados pero ignorados para filas mock.

keyword (exacto)Resultado
texto ordinarioLista mock con resultados
sb_search_emptyitems: [], total: 0
sb_search_not_foundAlias de vacío

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

EndpointNota sandbox
Parse URLQuery/path URL con sb_* replica el comportamiento detail.
Upload imageSiempre { "image_id": "img_sandbox_mock" } tras validaciones exitosas.
Image searchkeyword: sb_search_empty opcional produce lista vacía; combínelo con upload-image para pruebas de flujo.
Advanced — freight estimateMock de flete doméstico por defecto 800 minor units alineado con preview.
Advanced — batch-checkDevuelve sobre de estilo upstream con mock mpProducts; use sb_prod_not_found en mi_id/item_id para listas de exclusión.
Advanced — top keywords/list / daily-sales-trendUse sb_search_empty en category_id / rank_id donde se documente para listas vacías o casos 404 detail.

Fixtures de pedidos y pago (magic ids)

POST /v1/orders/detail

order_idstatus típicoNotas
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_idResultadoHTTP
sb_ord_unpaidPago exitoso → estado lógico 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 devuelve totales ilustrativos fijos (línea ejemplo ~4500 + flete ~800 en minor units). Create emite order_id dinámicos con prefijo sbo_* persistidos en sandbox storage — líneas con offer_id: sb_prod_offline / sb_prod_no_stock devuelven 422 como en producción.

Cancel / logistics / list / purchase query

Según cancel, trace, detail list: sb_ord_* impagados y sbo_* dinámicos impagados se cancelan; fixtures paid/shipped/etc. devuelven ORDER_NOT_CANCELLABLE. Logistics devuelve packages para mocks sb_ord_shipped / completed; unpaid/paid-await-shipment devuelven packages: []. La lista del comprador respeta product_name: sb_ord_list_empty para mocks vacíos. Purchase query devuelve sobres upstream; omita los pseudo ids not-found según corresponda.

Triggers de plataforma: sandbox_trigger

Permitido solo en hio_test_*; las claves de producción ignoran el campo silenciosamente.

sandbox_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_UPSTREAM_ERROR

Combine con ids benignos para que cuerpos realistas pasen validación:

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

La fixture auth especial sb_auth_channel_required combinada con triggers puede producir CHANNEL_AUTH_REQUIRED (403) para regresiones UI pese a la regla «authorized by default».

Instantánea del estado de implementación

FaseCoberturaNotas
ShippedProduct + procurement APIs arribaRefleja el subconjunto Public API publicado en este sitio.
Not yet/v1/fulfillment/* completo, webhooks, rutas OpenAPI-only no publicadasNo confíe en ellos en CI sandbox hasta que se anuncien.

Hoja de referencia rápida

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

Al añadir fixtures internamente, refleje este esquema de numeración en pruebas de regresión — nunca mute las formas JSON standard dentro de los mocks.