math-solver / scripts /run_real_integration.sh
Cuong2004
Deploy API from GitHub Actions
395651c
#!/usr/bin/env bash
# Run backend integration tests. Usage:
# ./scripts/run_real_integration.sh # profile ci (default)
# ./scripts/run_real_integration.sh ci
# ./scripts/run_real_integration.sh real # heavy: workers, manim, OCR, full API suite
set -euo pipefail
PROFILE="${1:-ci}"
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
PY="${ROOT}/venv/bin/python"
if [[ ! -x "$PY" ]]; then
PY="python3"
fi
export PYTHONPATH="$ROOT"
LOG_FILE="${LOG_FILE:-integration_run.log}"
JUNIT="${JUNIT:-pytest_integration.xml}"
REPORT_MD="${REPORT_MD:-integration_report.md}"
JSON_RESULTS="${JSON_RESULTS:-temp_suite_results.json}"
log() { echo "[$(date '+%H:%M:%S')] $*" | tee -a "$LOG_FILE"; }
log "Profile=$PROFILE working_dir=$ROOT"
if [[ "$PROFILE" == "ci" ]]; then
export ALLOW_TEST_BYPASS="${ALLOW_TEST_BYPASS:-true}"
export LOG_LEVEL="${LOG_LEVEL:-info}"
export CELERY_TASK_ALWAYS_EAGER="${CELERY_TASK_ALWAYS_EAGER:-true}"
export CELERY_RESULT_BACKEND="${CELERY_RESULT_BACKEND:-rpc://}"
export MOCK_VIDEO="${MOCK_VIDEO:-true}"
set +e
log "Phase A: default pytest (unit / mocked; excludes real_* markers per pytest.ini)"
"$PY" -m pytest tests/ -q --tb=short -p no:cacheprovider 2>&1 | tee -a "$LOG_FILE"
P1=${PIPESTATUS[0]}
set -e
log "Starting uvicorn for API phase..."
"$PY" -m uvicorn app.main:app --port 8000 >>uvicorn_integration.log 2>&1 &
SERVER_PID=$!
trap 'kill "$SERVER_PID" 2>/dev/null || true' EXIT
for i in $(seq 1 25); do
if curl -sf "http://localhost:8000/" >/dev/null; then
log "API ready"
break
fi
sleep 2
if [[ "$i" -eq 25 ]]; then
log "ERROR: API did not start"
exit 1
fi
done
PREP="$("$PY" scripts/prepare_api_test.py)"
echo "$PREP" | tee -a "$LOG_FILE"
export TEST_USER_ID="$(echo "$PREP" | grep "RESULT:USER_ID=" | cut -d'=' -f2)"
export TEST_SESSION_ID="$(echo "$PREP" | grep "RESULT:SESSION_ID=" | cut -d'=' -f2)"
if [[ -z "${TEST_USER_ID:-}" || -z "${TEST_SESSION_ID:-}" ]]; then
log "ERROR: prepare_api_test did not emit USER_ID / SESSION_ID"
exit 1
fi
set +e
log "Phase B: API smoke + full suite (real_api)"
"$PY" -m pytest tests/test_api_real_e2e.py tests/test_api_full_suite.py \
-m "real_api" -s --tb=short --junitxml="$JUNIT" -p no:cacheprovider 2>&1 | tee -a "$LOG_FILE"
P2=${PIPESTATUS[0]}
set -e
if [[ -f "$JSON_RESULTS" ]]; then
log "Generating Markdown report"
"$PY" scripts/generate_report.py "$JSON_RESULTS" "$REPORT_MD" "$JUNIT"
else
log "WARN: $JSON_RESULTS missing (suite may have failed before write)"
fi
if [[ "$P1" -ne 0 || "$P2" -ne 0 ]]; then
log "FAIL: phase A exit=$P1 phase B exit=$P2"
exit 1
fi
log "Done CI profile. See $REPORT_MD and $LOG_FILE"
exit 0
fi
if [[ "$PROFILE" == "real" ]]; then
unset CELERY_TASK_ALWAYS_EAGER || true
export CELERY_TASK_ALWAYS_EAGER="${CELERY_TASK_ALWAYS_EAGER:-false}"
export MOCK_VIDEO="${MOCK_VIDEO:-false}"
export RUN_REAL_WORKER_OCR="${RUN_REAL_WORKER_OCR:-0}"
export RUN_REAL_WORKER_MANIM="${RUN_REAL_WORKER_MANIM:-0}"
log "Phase A: default pytest (fast)"
"$PY" -m pytest tests/ -q --tb=short -p no:cacheprovider 2>&1 | tee -a "$LOG_FILE"
log "Phase B: real agents + orchestrator smoke (requires OpenRouter keys)"
"$PY" -m pytest tests/integration/test_agents_real.py tests/integration/test_orchestrator_smoke.py \
-m "real_agents" -q --tb=short --junitxml="$JUNIT" -p no:cacheprovider 2>&1 | tee -a "$LOG_FILE" || true
if [[ "${RUN_REAL_WORKER_OCR:-0}" == "1" ]] || [[ "${RUN_REAL_WORKER_OCR:-0}" =~ ^(true|yes)$ ]]; then
log "Phase C: OCR worker task (RUN_REAL_WORKER_OCR enabled)"
"$PY" -m pytest tests/integration/test_worker_ocr_real.py \
-m "real_worker_ocr" -q --tb=short -p no:cacheprovider 2>&1 | tee -a "$LOG_FILE" || true
else
log "Skipping OCR worker (set RUN_REAL_WORKER_OCR=1 to enable)"
fi
if [[ "${RUN_REAL_WORKER_MANIM:-0}" == "1" ]]; then
log "Phase D: Manim + storage (RUN_REAL_WORKER_MANIM=1, MOCK_VIDEO=false)"
"$PY" -m pytest tests/integration/test_worker_manim_real.py -m "real_worker_manim" -s --tb=short \
-p no:cacheprovider 2>&1 | tee -a "$LOG_FILE" || true
else
log "Skipping Manim integration (set RUN_REAL_WORKER_MANIM=1 to enable)"
fi
log "Phase E: API real (expects TEST_BASE_URL or localhost:8000 with server already up)"
if curl -sf "http://localhost:8000/" >/dev/null 2>&1; then
PREP="$("$PY" scripts/prepare_api_test.py)"
export TEST_USER_ID="$(echo "$PREP" | grep "RESULT:USER_ID=" | cut -d'=' -f2)"
export TEST_SESSION_ID="$(echo "$PREP" | grep "RESULT:SESSION_ID=" | cut -d'=' -f2)"
"$PY" -m pytest tests/test_api_real_e2e.py tests/test_api_full_suite.py tests/test_api_metadata_real.py \
-m "real_api" -q --tb=short -p no:cacheprovider 2>&1 | tee -a "$LOG_FILE" || true
else
log "WARN: No server on :8000 — skip API real phase (start backend first)"
fi
log "Done REAL profile. Review $LOG_FILE"
exit 0
fi
echo "Unknown profile: $PROFILE (use ci or real)"
exit 1