#!/usr/bin/env bash # Smoke test mínimo: end-to-end del flujo principal. # # Sirve como: # - Validación post-deploy # - Health check nightly (cron en CI) # - Reproducible bug report # # Pasos: # 1. Healthcheck del backend público # 2. Llamar al endpoint principal con un input válido # 3. Pollear hasta done # 4. Assert sobre el estado final set -euo pipefail PUBLIC_HOST="${PUBLIC_HOST:-mi-cliente.fitlabs.dev}" BASE="https://${PUBLIC_HOST}" echo "→ [1/4] Healthcheck" curl -sf "${BASE}/health" > /dev/null && echo " ✓ 200 OK" || { echo " ✗ FAIL"; exit 1; } echo "→ [2/4] Create case (smoke input)" # REPLACE: ajustar al endpoint y payload de tu solución RESULT=$(curl -sf -X POST "${BASE}/api/v1/cases/run" \ -H "Content-Type: application/json" \ -H "X-Orchestrate-Token: ${WXO_BACKEND_TOKEN:-smoke-test-token}" \ -d '{"case_id":"smoke-001","target_id":1}' \ 2>&1) || { echo " ✗ FAIL: $RESULT"; exit 1; } echo " ✓ accepted: $RESULT" echo "→ [3/4] Poll until done (max 60s)" for i in $(seq 1 60); do STATUS=$(curl -sf "${BASE}/api/v1/cases/smoke-001" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null || echo "?") [ "$STATUS" = "done" ] && { echo " ✓ done after ${i}s"; break; } [ "$STATUS" = "failed" ] && { echo " ✗ failed"; exit 1; } sleep 1 done [ "$STATUS" = "done" ] || { echo " ✗ timeout (last status: $STATUS)"; exit 1; } echo "→ [4/4] Assert final state" # REPLACE: ajustar al assert de tu solución RESULT=$(curl -sf "${BASE}/api/v1/cases/smoke-001") echo "$RESULT" | python3 -c " import sys, json data = json.load(sys.stdin) assert data['status'] == 'done', f'status={data[\"status\"]}' assert data.get('package_url'), 'no package_url' print(' ✓ assertions OK') " echo "" echo "════════════════════════════════════════" echo " ✓ Smoke test passed" echo "════════════════════════════════════════"