Teste da API de Envio
Este guia fornece abordagens e exemplos de testes específicos para a API de Envios da Equinix, com base nos princípios gerais de Teste de API.
Visão geral da API de remessas
A API de Remessas permite agendar e gerenciar programaticamente remessas de entrada e saída para data centers Equinix IBX, incluindo:
- Agendamento de remessas de entrada (recebimento de encomendas)
- Agendamento de envios de saída (envio de encomendas)
- Atualizando detalhes do envio
- Gerenciando informações de rastreamento de remessas
- Gerenciamento de informações da transportadora e números de rastreamento
Nota importante: Todas as remessas de entrada e saída devem ser agendadas com 24 horas de antecedência. A API da Equinix é um sistema de produção que cria solicitações de remessa reais. Siga sempre estas boas práticas de teste para garantir que você não crie trabalho operacional não planejado.
Fluxo de trabalho de teste de remessa
Antes de testar a API de Remessas, certifique-se de ter:
- Credenciais de API válidas com permissões para pedidos de remessas.
- Acesso às instalações Equinix IBX onde você tem gaiolas.
- Identificações de gaiola válidas para os locais de sua remessa.
- Compreensão dos requisitos das transportadoras e formatos de números de rastreamento.
Criando uma solicitação de remessa de entrada
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}")
Criando uma solicitação de envio de saída
# 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}")
Testando cenários de erro
Sempre teste o tratamento de erros na implementação da sua 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}"
Melhores práticas para testes de API de remessas
- Regra de 24 horas de antecedência: Sempre agende os envios com pelo menos 24 horas de antecedência.
- Números de rastreamento válidos: Utilize formatos de número de rastreamento realistas para cada transportadora.
- Informações de contato corretas: Certifique-se de que os contatos estejam disponíveis durante os períodos de entrega.
- Acesso à gaiola: Verifique os IDs da gaiola e as permissões de acesso antes de realizar os testes.
- Envios internacionais: Considere os requisitos alfandegários para entregas internacionais.
- Instruções Especiais: Teste com diversos requisitos especiais de manuseio.
- Anexos de Arquivos: Teste o envio de anexos para listas de embalagem e instruções especiais.
- Fusos Horários: Gerencie corretamente as conversões de fuso horário para o agendamento.
- Pedidos de Compra: Teste diferentes tipos de pedidos de compra (NOVOS, EXISTENTES, ISENTOS)
Considerações sobre automação
Ao criar automações em torno da API de Remessas:
- Implementar a validação para o requisito de agendamento com 24 horas de antecedência.
- Inclua validação específica da operadora para formatos de números de rastreamento.
- Inclua um tratamento de erros adequado para problemas de disponibilidade e capacidade da operadora.
- Implemente receptores de webhook para atualizações de status de envio.
- Criar um sistema de registro de auditoria para todas as transações de envio.
- Valide o acesso e as permissões da gaiola antes de criar solicitações.
- Garantir o correto tratamento dos fusos horários para localidades internacionais.