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