Ir al contenido principal

Pruebas API de envío

Esta guía proporciona enfoques y ejemplos de pruebas específicas para la API de envíos de Equinix, basándose en los principios generales de Pruebas de API.

Visión general de la API de envíos

La API de envíos le permite programar y gestionar envíos entrantes y salientes a los centros de datos IBX de Equinix, incluyendo:

  • Programación de envíos entrantes (recepción de paquetes)
  • Programación de envíos de salida (envío de paquetes)
  • Actualización de los detalles del envío
  • Gestión de la información de seguimiento de envíos
  • Manejo de la información del transportista y números de seguimiento

Nota importante: Todos los envíos entrantes y salientes deben programarse con 24 horas de antelación. La API de Equinix es un sistema de producción que crea solicitudes de envío reales. Siga siempre estas prácticas recomendadas de prueba para asegurarse de no crear trabajo operativo no intencionado.

Flujo de trabajo de pruebas de envío

Antes de probar la API de envíos, asegúrese de que dispone de:

  • Credenciales API válidas con permisos de pedido de envíos
  • Acceso a las ubicaciones IBX de Equinix donde tiene jaulas
  • Identificaciones de jaula válidas para sus ubicaciones de envío
  • Conocimiento de los requisitos de los transportistas y los formatos de los números de seguimiento

Creación de una solicitud de envío entrante

import requests
import json
from datetime import datetime, timedelta

# Setup authentication
auth_url = "https://api.equinix.com/oauth2/v1/token"
auth_payload = {
"grant_type": "client_credentials",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}

auth_response = requests.post(auth_url, data=auth_payload)
token = auth_response.json()["access_token"]

# Test creating an inbound shipment request
base_url = "https://api.equinix.com/colocations/v2"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}

# Calculate delivery date (24+ hours in advance as required)
delivery_date = (datetime.utcnow() + timedelta(days=2)).isoformat() + "Z"

# Example: Create an inbound shipment request
inbound_payload = {
"type": "INBOUND",
"requestedDateTime": delivery_date,
"cageId": "SV1:01:001MC3",
"customerReferenceId": "SHIP-REF-12345",
"description": "Server hardware delivery for data center expansion project",
"details": {
"carrier": "DHL",
"carrierTrackingNumbers": [
"1234567890123",
"1234567890124"
],
"numberOfBoxes": 2,
"accountNumber": "12345"
},
"purchaseOrder": {
"type": "EXISTING",
"number": "PO-789456"
},
"attachments": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "packing_list.pdf"
}
],
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["tech.admin@example.com"],
"availability": "WORK_HOURS",
"timezone": "America/New_York"
},
{
"type": "NOTIFICATION",
"registeredUsers": ["notifications@example.com"]
}
]
}

create_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(inbound_payload)
)

# Verify response
assert create_response.status_code == 201, f"Failed to create shipment: {create_response.text}"

# Extract order ID from Location header
order_number = create_response.json()["OrderNumber"]

print(f"Successfully created inbound shipment with order ID: {order_number}")

Creación de una solicitud de envío saliente

# Example: Create an outbound shipment request
outbound_payload = {
"type": "OUTBOUND",
"requestedDateTime": delivery_date,
"cageId": "SV1:01:001MC3",
"customerReferenceId": "OUT-SHIP-67890",
"description": "Returning defective network equipment to vendor",
"details": {
"carrier": "FEDEX",
"carrierTrackingNumbers": [
"987654321098"
],
"numberOfBoxes": 1,
"pickupLocation": "Main cage entrance",
"specialInstructions": "Handle with care - contains sensitive electronic equipment"
},
"purchaseOrder": {
"type": "EXEMPTED"
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["shipping@example.com"],
"availability": "ANYTIME"
}
]
}

outbound_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(outbound_payload)
)

assert outbound_response.status_code == 201, f"Failed to create outbound shipment: {outbound_response.text}"
order_number = outbound_response.json()["OrderNumber"]
print("Successfully created outbound shipment request with order ID: {order_number}")

Pruebas de escenarios de error

Pruebe siempre la gestión de errores de su implementación de API:

# Test with invalid carrier
invalid_carrier_payload = {
"type": "INBOUND",
"requestedDateTime": delivery_date,
"cageId": "SV1:01:001MC3",
"details": {
"carrier": "INVALID_CARRIER", # Invalid carrier
"carrierTrackingNumbers": ["1234567890"],
"numberOfBoxes": 1
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["test@example.com"]
}
]
}

error_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(invalid_carrier_payload)
)

# Verify error response
assert error_response.status_code == 400, f"Expected error but got: {error_response.status_code}"
error_data = error_response.json()
assert any("carrier" in error["errorMessage"].lower() for error in error_data), "Expected carrier validation error"

# Test with insufficient advance notice (less than 24 hours)
insufficient_time_payload = {
"type": "INBOUND",
"requestedDateTime": (datetime.utcnow() + timedelta(hours=12)).isoformat() + "Z", # Only 12 hours advance
"cageId": "SV1:01:001MC3",
"details": {
"carrier": "DHL",
"carrierTrackingNumbers": ["1234567890"],
"numberOfBoxes": 1
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["test@example.com"]
}
]
}

time_error_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(insufficient_time_payload)
)

assert time_error_response.status_code == 400, f"Expected time validation error but got: {time_error_response.status_code}"

Mejores prácticas para las pruebas API de los envíos

  1. Regla de las 24 horas de antelación: Programe siempre los envíos con al menos 24 horas de antelación
  2. Números de seguimiento válidos: Utilice formatos de número de seguimiento realistas para cada transportista
  3. Información de contacto adecuada: Asegúrese de que los contactos estén disponibles durante las ventanas de entrega
  4. Acceso a jaulas: Verifique las identificaciones de las jaulas y los permisos de acceso antes de realizar las pruebas
  5. Envíos internacionales: Tenga en cuenta los requisitos aduaneros para los envíos internacionales
  6. Instrucciones especiales: Prueba con varios requisitos especiales de manipulación
  7. Archivos adjuntos: Prueba de carga de archivos adjuntos para listas de embalaje e instrucciones especiales
  8. Husos horarios: Maneje correctamente las conversiones de zonas horarias para la programación
  9. Pedidos de compra: Pruebe diferentes tipos de PO (NUEVOS, EXISTENTES, EXENTOS)

Consideraciones sobre automatización

Al construir la automatización en torno a la API de envíos

  • Implementar la validación para el requisito de programación con 24 horas de antelación
  • Incorpore la validación específica del transportista para los formatos de números de seguimiento
  • Incluya una gestión de errores adecuada para los problemas de disponibilidad y capacidad del operador
  • Implemente receptores webhook para actualizar el estado de los envíos
  • Construya un registro de auditoría para todas las transacciones de envío
  • Valide el acceso a la jaula y los permisos antes de crear solicitudes
  • Garantice el manejo adecuado de las zonas horarias para ubicaciones internacionales

Recursos adicionales

¿Fue útil esta página?