283 lines
9.3 KiB
Bash
283 lines
9.3 KiB
Bash
#!/bin/bash
|
||
|
||
# Script de test pour l'API de génération d'offres CSV
|
||
# Usage: ./test-csv-offers-api.sh
|
||
|
||
set -e
|
||
|
||
echo "================================================"
|
||
echo "🧪 Test de l'API - Génération d'Offres CSV"
|
||
echo "================================================"
|
||
echo ""
|
||
|
||
# Configuration
|
||
API_URL="http://localhost:4000/api/v1"
|
||
JWT_TOKEN=""
|
||
|
||
# Couleurs pour l'output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Fonction pour afficher les résultats
|
||
print_step() {
|
||
echo -e "${BLUE}➜${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${YELLOW}ℹ${NC} $1"
|
||
}
|
||
|
||
# Étape 1: Login
|
||
print_step "Étape 1: Authentification"
|
||
echo ""
|
||
|
||
LOGIN_RESPONSE=$(curl -s -X POST "${API_URL}/auth/login" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"email": "admin@xpeditis.com",
|
||
"password": "Admin123!"
|
||
}')
|
||
|
||
JWT_TOKEN=$(echo $LOGIN_RESPONSE | jq -r '.accessToken')
|
||
|
||
if [ "$JWT_TOKEN" != "null" ] && [ ! -z "$JWT_TOKEN" ]; then
|
||
print_success "Authentification réussie"
|
||
print_info "Token: ${JWT_TOKEN:0:20}..."
|
||
else
|
||
print_error "Échec de l'authentification"
|
||
echo "Réponse: $LOGIN_RESPONSE"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "================================================"
|
||
echo ""
|
||
|
||
# Étape 2: Recherche standard (sans offres)
|
||
print_step "Étape 2: Recherche CSV standard (sans offres)"
|
||
echo ""
|
||
|
||
STANDARD_RESPONSE=$(curl -s -X POST "${API_URL}/rates/search-csv" \
|
||
-H "Authorization: Bearer ${JWT_TOKEN}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"origin": "FRPAR",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 5.0,
|
||
"weightKG": 1000,
|
||
"palletCount": 2
|
||
}')
|
||
|
||
STANDARD_RESULTS=$(echo $STANDARD_RESPONSE | jq -r '.totalResults // 0')
|
||
print_info "Résultats trouvés (standard): $STANDARD_RESULTS"
|
||
|
||
if [ "$STANDARD_RESULTS" -gt "0" ]; then
|
||
print_success "Recherche standard réussie"
|
||
|
||
# Afficher le premier résultat
|
||
echo ""
|
||
print_info "Premier résultat (standard):"
|
||
echo $STANDARD_RESPONSE | jq '.results[0] | {
|
||
companyName: .rate.companyName,
|
||
priceUSD: .calculatedPrice.usd,
|
||
transitDays: .rate.transitDays,
|
||
serviceLevel: .serviceLevel
|
||
}' | sed 's/^/ /'
|
||
else
|
||
print_error "Aucun résultat trouvé (vérifiez que des tarifs CSV sont chargés)"
|
||
fi
|
||
|
||
echo ""
|
||
echo "================================================"
|
||
echo ""
|
||
|
||
# Étape 3: Recherche avec génération d'offres
|
||
print_step "Étape 3: Recherche CSV avec génération d'offres (RAPID, STANDARD, ECONOMIC)"
|
||
echo ""
|
||
|
||
OFFERS_RESPONSE=$(curl -s -X POST "${API_URL}/rates/search-csv-offers" \
|
||
-H "Authorization: Bearer ${JWT_TOKEN}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"origin": "FRPAR",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 5.0,
|
||
"weightKG": 1000,
|
||
"palletCount": 2
|
||
}')
|
||
|
||
OFFERS_RESULTS=$(echo $OFFERS_RESPONSE | jq -r '.totalResults // 0')
|
||
print_info "Résultats trouvés (avec offres): $OFFERS_RESULTS"
|
||
|
||
if [ "$OFFERS_RESULTS" -gt "0" ]; then
|
||
print_success "Recherche avec offres réussie"
|
||
|
||
# Vérifier qu'on a bien 3x plus d'offres qu'en standard
|
||
EXPECTED_OFFERS=$((STANDARD_RESULTS * 3))
|
||
if [ "$OFFERS_RESULTS" -eq "$EXPECTED_OFFERS" ]; then
|
||
print_success "Nombre d'offres correct: $OFFERS_RESULTS (= $STANDARD_RESULTS tarifs × 3 offres)"
|
||
else
|
||
print_info "Offres générées: $OFFERS_RESULTS (attendu: $EXPECTED_OFFERS)"
|
||
fi
|
||
|
||
echo ""
|
||
print_info "Première offre de chaque type:"
|
||
echo ""
|
||
|
||
# Afficher une offre ECONOMIC
|
||
print_info "📦 Offre ECONOMIC (moins chère + plus lente):"
|
||
echo $OFFERS_RESPONSE | jq '.results[] | select(.serviceLevel == "ECONOMIC") | {
|
||
companyName: .rate.companyName,
|
||
serviceLevel: .serviceLevel,
|
||
priceUSD: .calculatedPrice.usd,
|
||
originalPriceUSD: .originalPrice.usd,
|
||
transitDays: .rate.transitDays,
|
||
originalTransitDays: .originalTransitDays,
|
||
priceAdjustment: "-15%",
|
||
transitAdjustment: "+50%"
|
||
}' | head -n 12 | sed 's/^/ /'
|
||
|
||
echo ""
|
||
|
||
# Afficher une offre STANDARD
|
||
print_info "📦 Offre STANDARD (prix et transit de base):"
|
||
echo $OFFERS_RESPONSE | jq '.results[] | select(.serviceLevel == "STANDARD") | {
|
||
companyName: .rate.companyName,
|
||
serviceLevel: .serviceLevel,
|
||
priceUSD: .calculatedPrice.usd,
|
||
originalPriceUSD: .originalPrice.usd,
|
||
transitDays: .rate.transitDays,
|
||
originalTransitDays: .originalTransitDays,
|
||
priceAdjustment: "Aucun",
|
||
transitAdjustment: "Aucun"
|
||
}' | head -n 12 | sed 's/^/ /'
|
||
|
||
echo ""
|
||
|
||
# Afficher une offre RAPID
|
||
print_info "📦 Offre RAPID (plus chère + plus rapide):"
|
||
echo $OFFERS_RESPONSE | jq '.results[] | select(.serviceLevel == "RAPID") | {
|
||
companyName: .rate.companyName,
|
||
serviceLevel: .serviceLevel,
|
||
priceUSD: .calculatedPrice.usd,
|
||
originalPriceUSD: .originalPrice.usd,
|
||
transitDays: .rate.transitDays,
|
||
originalTransitDays: .originalTransitDays,
|
||
priceAdjustment: "+20%",
|
||
transitAdjustment: "-30%"
|
||
}' | head -n 12 | sed 's/^/ /'
|
||
|
||
echo ""
|
||
echo "================================================"
|
||
echo ""
|
||
|
||
# Validation de la logique métier
|
||
print_step "Validation de la logique métier"
|
||
echo ""
|
||
|
||
# Extraire les prix et transit pour validation
|
||
ECONOMIC_PRICE=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "ECONOMIC") | .calculatedPrice.usd' | head -1)
|
||
STANDARD_PRICE=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "STANDARD") | .calculatedPrice.usd' | head -1)
|
||
RAPID_PRICE=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "RAPID") | .calculatedPrice.usd' | head -1)
|
||
|
||
ECONOMIC_TRANSIT=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "ECONOMIC") | .rate.transitDays' | head -1)
|
||
STANDARD_TRANSIT=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "STANDARD") | .rate.transitDays' | head -1)
|
||
RAPID_TRANSIT=$(echo $OFFERS_RESPONSE | jq -r '.results[] | select(.serviceLevel == "RAPID") | .rate.transitDays' | head -1)
|
||
|
||
# Validation: RAPID plus cher que STANDARD
|
||
if (( $(echo "$RAPID_PRICE > $STANDARD_PRICE" | bc -l) )); then
|
||
print_success "RAPID plus cher que STANDARD ($RAPID_PRICE > $STANDARD_PRICE) ✓"
|
||
else
|
||
print_error "RAPID devrait être plus cher que STANDARD"
|
||
fi
|
||
|
||
# Validation: ECONOMIC moins cher que STANDARD
|
||
if (( $(echo "$ECONOMIC_PRICE < $STANDARD_PRICE" | bc -l) )); then
|
||
print_success "ECONOMIC moins cher que STANDARD ($ECONOMIC_PRICE < $STANDARD_PRICE) ✓"
|
||
else
|
||
print_error "ECONOMIC devrait être moins cher que STANDARD"
|
||
fi
|
||
|
||
# Validation: RAPID plus rapide que STANDARD
|
||
if (( $(echo "$RAPID_TRANSIT < $STANDARD_TRANSIT" | bc -l) )); then
|
||
print_success "RAPID plus rapide que STANDARD ($RAPID_TRANSIT < $STANDARD_TRANSIT jours) ✓"
|
||
else
|
||
print_error "RAPID devrait être plus rapide que STANDARD"
|
||
fi
|
||
|
||
# Validation: ECONOMIC plus lent que STANDARD
|
||
if (( $(echo "$ECONOMIC_TRANSIT > $STANDARD_TRANSIT" | bc -l) )); then
|
||
print_success "ECONOMIC plus lent que STANDARD ($ECONOMIC_TRANSIT > $STANDARD_TRANSIT jours) ✓"
|
||
else
|
||
print_error "ECONOMIC devrait être plus lent que STANDARD"
|
||
fi
|
||
|
||
else
|
||
print_error "Aucune offre générée"
|
||
echo "Réponse: $OFFERS_RESPONSE" | jq '.'
|
||
fi
|
||
|
||
echo ""
|
||
echo "================================================"
|
||
echo ""
|
||
|
||
# Étape 4: Test avec filtre de niveau de service
|
||
print_step "Étape 4: Test avec filtre de niveau de service (RAPID uniquement)"
|
||
echo ""
|
||
|
||
FILTERED_RESPONSE=$(curl -s -X POST "${API_URL}/rates/search-csv-offers" \
|
||
-H "Authorization: Bearer ${JWT_TOKEN}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"origin": "FRPAR",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 5.0,
|
||
"weightKG": 1000,
|
||
"palletCount": 2,
|
||
"filters": {
|
||
"serviceLevels": ["RAPID"]
|
||
}
|
||
}')
|
||
|
||
FILTERED_RESULTS=$(echo $FILTERED_RESPONSE | jq -r '.totalResults // 0')
|
||
print_info "Résultats filtrés (RAPID uniquement): $FILTERED_RESULTS"
|
||
|
||
if [ "$FILTERED_RESULTS" -gt "0" ]; then
|
||
print_success "Filtre de niveau de service fonctionne"
|
||
|
||
# Vérifier que toutes les offres sont RAPID
|
||
NON_RAPID=$(echo $FILTERED_RESPONSE | jq -r '.results[] | select(.serviceLevel != "RAPID") | .serviceLevel' | wc -l)
|
||
if [ "$NON_RAPID" -eq "0" ]; then
|
||
print_success "Toutes les offres sont de niveau RAPID ✓"
|
||
else
|
||
print_error "Certaines offres ne sont pas de niveau RAPID"
|
||
fi
|
||
else
|
||
print_error "Aucun résultat avec filtre RAPID"
|
||
fi
|
||
|
||
echo ""
|
||
echo "================================================"
|
||
echo ""
|
||
print_success "Tests terminés avec succès!"
|
||
echo ""
|
||
print_info "Pour tester dans Swagger UI:"
|
||
print_info " → http://localhost:4000/api/docs"
|
||
print_info " → Endpoint: POST /api/v1/rates/search-csv-offers"
|
||
echo ""
|
||
print_info "Documentation complète:"
|
||
print_info " → ALGO_BOOKING_CSV_IMPLEMENTATION.md"
|
||
echo ""
|
||
echo "================================================"
|