Skip to main content

Test de l'API d'expédition

Ce guide fournit des approches et des exemples de tests spécifiques pour l'API Equinix Shipments, en s'appuyant sur les principes généraux de API Testing.

Aperçu de l'API Expéditions

L'API Shipments vous permet de programmer et de gérer les expéditions entrantes et sortantes vers les centres de données IBX d'Equinix, notamment :

  • Planification des envois entrants (réception des colis)
  • Planification des expéditions sortantes (envoi de colis)
  • Mise à jour des détails de l'envoi
  • Gestion des informations de suivi des envois
  • Manipuler les informations sur le transporteur et les numéros de suivi

Note importante: Tous les envois entrants et sortants doivent être planifiés 24 heures à l'avance. L'API d'Equinix est un système de production qui crée des demandes d'expédition réelles. Respectez toujours ces meilleures pratiques de test pour vous assurer que vous ne créez pas de travail opérationnel involontaire.

Flux de travail des tests d'expédition

Avant de tester l'API Shipments, assurez-vous que vous avez :

  • Identifiants API valides avec autorisations de commande d'envois
  • Accès aux sites IBX d'Equinix où vous avez des cages
  • Cages d'identification valides pour vos lieux d'expédition
  • Compréhension des exigences des transporteurs et des formats des numéros de suivi

Création d'une demande d'expédition 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}")

Création d'une demande d'expédition sortante

# 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}")

Test des scénarios d'erreur

Testez toujours la gestion des erreurs pour votre mise en œuvre de l'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}"

Meilleures pratiques pour les tests API des expéditions

  1. Règle des 24 heures d'avance: Planifiez toujours vos envois au moins 24 heures à l'avance.
  2. Numéros de suivi valides: Utilisez des formats de numéros de suivi réalistes pour chaque transporteur
  3. Informations de contact appropriées: Veillez à ce que les contacts soient disponibles pendant les fenêtres de livraison.
  4. Accès aux cages: Vérifiez les identifiants des cages et les autorisations d'accès avant de procéder aux tests.
  5. Envois internationaux: Tenez compte des exigences douanières pour les livraisons internationales
  6. Instructions spéciales: Test avec diverses exigences de manipulation spéciale
  7. Pièces jointes: Testez les téléchargements de pièces jointes pour les listes d'emballage et les instructions spéciales.
  8. Fuseaux horaires: Traitez correctement les conversions de fuseaux horaires pour la planification.
  9. Bons de commande: Testez les différents types de bons de commande (NOUVEAU, EXISTANT, EXEMPTE).

Considérations sur l'automatisation

Lorsque vous construisez une automatisation autour de l'API Shipments :

  • Mise en œuvre de la validation de l'exigence de programmation 24 heures à l'avance
  • Intégrez la validation spécifique au transporteur pour les formats de numéros de suivi
  • Inclure un traitement approprié des erreurs pour les problèmes de disponibilité et de capacité des transporteurs.
  • Mettez en place des récepteurs webhook pour les mises à jour de l'état des envois
  • Créez des journaux d'audit pour toutes les transactions d'expédition
  • Validez l'accès à la cage et les autorisations avant de créer des demandes
  • Veillez à la bonne gestion des fuseaux horaires pour les sites internationaux

Ressources supplémentaires

Cette page vous a-t-elle été utile ?