xpeditis2.0/apps/backend/test-csv-offers-api.sh
2025-12-15 16:51:36 +01:00

283 lines
9.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "================================================"