Visite de travail Test API
Ce guide fournit des approches et des exemples de test spécifiques pour l'API Equinix Work Visits, en s'appuyant sur les principes généraux de API Testing.
Aperçu de l'API Visites de travail
L'API Work Visits vous permet de programmer et de gérer des visites de travail dans les datacenters IBX d'Equinix, notamment :
- Programmer des visites de travail jusqu'à 14 jours
- Gestion des informations sur les visiteurs et des autorisations d'accès
- Mise à jour des détails de la visite de travail et des contacts
- Exigences en matière d'accès aux cages et aux armoires de manutention
- Gestion des listes de visiteurs avec des utilisateurs enregistrés et non enregistrés
Note importante: Les visites de travail ne sont applicables que pour des visites d'une durée maximale de 14 jours. Les visites de travail de plus de 14 jours nécessitent l'approbation de l'accès de sécurité. Ce service ne peut être programmé que par un utilisateur disposant d'une autorisation de commande IBX Access Services.
WorkVisit Testing Workflow
Avant de tester l'API Visites de travail, assurez-vous que vous avez :
- Identifiants API valides avec autorisations de commande de visites de travail
- Accès aux sites IBX d'Equinix où vous avez des cages
- Des cartes d'identité valides pour les lieux où vous vous rendez au travail
- Compréhension des exigences des visiteurs et des processus d'identification
Créer une demande de visite de travail
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 a work visit request
base_url = "https://api.equinix.com/colocations/v2"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Calculate visit dates (future dates)
visit_start = (datetime.utcnow() + timedelta(days=3)).isoformat() + "Z"
visit_end = (datetime.utcnow() + timedelta(days=3, hours=8)).isoformat() + "Z"
# Example: Create a work visit request
work_visit_payload = {
"description": "Monthly routine maintenance and equipment inspection",
"customerReferenceId": "WV-REF-12345",
"purchaseOrder": {
"type": "EXISTING",
"number": "PO-789456"
},
"attachments": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "maintenance_checklist.pdf"
}
],
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["tech.admin@example.com"],
"availability": "WORK_HOURS",
"timezone": "America/New_York"
},
{
"type": "NOTIFICATION",
"registeredUsers": ["notifications@example.com"]
}
],
"details": {
"cages": [
{
"id": "SV1:01:001MC3",
"accountNumber": "12345",
"cabinetId": "SV1:01:001MC3:0101"
}
],
"visitStartDateTime": visit_start,
"visitEndDateTime": visit_end,
"openCabinet": True,
"visitors": [
{
"registeredUsers": ["john.doe@example.com"]
},
{
"firstName": "Jane",
"lastName": "Smith",
"companyName": "Acme Corporation",
"details": [
{
"type": "EMAIL",
"value": "jane.smith@acme.com"
},
{
"type": "MOBILE",
"value": "+1-555-123-4567"
}
]
}
]
}
}
create_response = requests.post(
f"{base_url}/orders/workVisits",
headers=headers,
data=json.dumps(work_visit_payload)
)
# Verify response
assert create_response.status_code == 201, f"Failed to create work visit: {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éer une visite de travail de plusieurs jours
# Example: Create a multi-day work visit (up to 14 days)
multi_day_start = (datetime.utcnow() + timedelta(days=5)).isoformat() + "Z"
multi_day_end = (datetime.utcnow() + timedelta(days=12)).isoformat() + "Z"
multi_day_payload = {
"description": "Data center migration project - Phase 1",
"customerReferenceId": "MIGRATION-PHASE1-2025",
"purchaseOrder": {
"type": "NEW",
"number": "PO-MIGRATION-001",
"amount": 5000,
"startDate": "2025-08-01",
"endDate": "2025-12-31"
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["migration.lead@example.com"],
"availability": "ANYTIME",
"timezone": "America/Los_Angeles"
}
],
"details": {
"cages": [
{
"id": "LA1:01:002MC5",
"accountNumber": "67890"
},
{
"id": "LA1:01:003MC1",
"accountNumber": "67890"
}
],
"visitStartDateTime": multi_day_start,
"visitEndDateTime": multi_day_end,
"openCabinet": False,
"visitors": [
{
"firstName": "Michael",
"lastName": "Johnson",
"companyName": "Migration Experts Inc",
"details": [
{
"type": "EMAIL",
"value": "mjohnson@migrationexperts.com"
},
{
"type": "MOBILE",
"value": "+1-310-555-9876"
}
]
},
{
"firstName": "Sarah",
"lastName": "Wilson",
"companyName": "Migration Experts Inc",
"details": [
{
"type": "EMAIL",
"value": "swilson@migrationexperts.com"
}
]
}
]
}
}
multi_day_response = requests.post(
f"{base_url}/orders/workVisits",
headers=headers,
data=json.dumps(multi_day_payload)
)
assert multi_day_response.status_code == 201, f"Failed to create multi-day work visit: {multi_day_response.text}"
print("Successfully created multi-day work visit request")
Mise à jour d'une demande de visite de travail
# Test updating work visit details
if order_id:
# Update work visit with new contact information
update_payload = {
"contacts": [
{
"type": "NOTIFICATION",
"registeredUsers": ["updated.notifications@example.com", "backup.contact@example.com"]
}
],
"details": {
"visitStartDateTime": (datetime.utcnow() + timedelta(days=4)).isoformat() + "Z",
"visitEndDateTime": (datetime.utcnow() + timedelta(days=4, hours=6)).isoformat() + "Z",
"openCabinet": False
}
}
update_response = requests.patch(
f"{base_url}/orders/workVisits/{order_id}",
headers=headers,
data=json.dumps(update_payload)
)
# Verify update response
assert update_response.status_code in [202, 204], f"Failed to update work visit: {update_response.text}"
print(f"Successfully updated work visit {order_id}")
Test des scénarios d'erreur
Testez toujours la gestion des erreurs pour votre mise en œuvre de l'API :
# Test with missing required fields
invalid_payload = {
"description": "Invalid request test",
"details": {
"visitStartDateTime": visit_start,
"visitEndDateTime": visit_end
# Missing required 'cages' and 'visitors' fields
}
}
error_response = requests.post(
f"{base_url}/orders/workVisits",
headers=headers,
data=json.dumps(invalid_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("cages" in error.get("additionalInfo", {}).get("property", "") for error in error_data), "Expected cages validation error"
# Test with invalid visit duration (over 14 days)
long_visit_payload = {
"description": "Invalid long visit test",
"details": {
"cages": [{"id": "SV1:01:001MC3"}],
"visitStartDateTime": visit_start,
"visitEndDateTime": (datetime.utcnow() + timedelta(days=20)).isoformat() + "Z", # Over 14 days
"visitors": [{"registeredUsers": ["test@example.com"]}]
}
}
long_visit_response = requests.post(
f"{base_url}/orders/workVisits",
headers=headers,
data=json.dumps(long_visit_payload)
)
assert long_visit_response.status_code == 400, f"Expected duration validation error but got: {long_visit_response.status_code}"
# Test with invalid cage ID
invalid_cage_payload = {
"description": "Invalid cage test",
"details": {
"cages": [{"id": "INVALID:CAGE:ID"}],
"visitStartDateTime": visit_start,
"visitEndDateTime": visit_end,
"visitors": [{"registeredUsers": ["test@example.com"]}]
}
}
cage_error_response = requests.post(
f"{base_url}/orders/workVisits",
headers=headers,
data=json.dumps(invalid_cage_payload)
)
assert cage_error_response.status_code in [400, 403], f"Expected cage validation error but got: {cage_error_response.status_code}"
Meilleures pratiques pour les tests API des visites de travail
- Limites de durée des visites: Veillez toujours à ce que les visites professionnelles ne dépassent pas 14 jours.
- Accès valide à la cage: Vérifiez les identifiants des cages et les autorisations des comptes avant de procéder aux tests.
- Informations sur les visiteurs: Test avec des visiteurs enregistrés et non enregistrés
- Validation des contacts: Assurez-vous que les informations de contact et les paramètres de disponibilité sont corrects.
- Gestion des fuseaux horaires: Test avec différents fuseaux horaires pour les sites internationaux
- Accès aux armoires: Test avec et sans demande d'ouverture de l'armoire
- Types de bons de commande: Testez les trois types de bons de commande (NOUVEAU, EXISTANT, EXEMPTE).
- Pièces jointes: Testez les téléchargements de pièces jointes pour la documentation
- Permission Validation: Assurez-vous que les autorisations de commande d'IBX Access Services sont correctes.
Considérations sur l'automatisation
Lorsque vous construisez l'automatisation autour de l'API Visites de travail :
- Mise en œuvre de la validation de la durée maximale de visite de 14 jours
- Intégrer la validation de la limite de visiteurs (50 visiteurs non-enregistrés maximum)
- Incluez une gestion appropriée des erreurs pour les problèmes d'accès aux cages et d'autorisation.
- Mettre en place des récepteurs webhook pour les mises à jour de l'état des visites de travail
- Créez des journaux d'audit pour toutes les transactions de visites de travail
- Validez l'exhaustivité des informations sur les visiteurs avant de créer des demandes
- Veillez à la bonne gestion des fuseaux horaires pour les sites internationaux
- Mettez en œuvre une validation correcte des contacts pour les utilisateurs enregistrés et non enregistrés.