system-prompts-and-models-o.../salesflow-saas/backend/scripts/launch_gate_runner.py
2026-04-04 18:04:21 +03:00

96 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""
بوابة إطلاق موحّدة: pytest كامل ثم (اختياري) فحوص HTTP ضد خادم حي.
1) دائماً: تشغيل كل اختبارات backend/tests (واقعية عبر ASGI، بدون خادم).
2) اختياري --live-http: يتصل بـ DEALIX_BASE_URL (يشغّل uvicorn أولاً).
أمثلة:
py scripts/launch_gate_runner.py
py scripts/launch_gate_runner.py -- -m launch -q
py scripts/launch_gate_runner.py --live-http --soft-ready
$env:DEALIX_BASE_URL="http://127.0.0.1:8000"; py scripts/launch_gate_runner.py --live-http --quick-http
أخطاء شائعة (PowerShell):
- أنت بالفعل داخل ...\\salesflow-saas\\backend فلا تستخدم cd salesflow-saas\\backend.
- npm و Playwright من مجلد frontend: cd ..\\frontend ثم npm run test:e2e
- لا تدمج أمرين: py -m pytest ... --tb=line ثم سطر جديد py scripts/...
(بدون مسافة تصبح --tb=linepy وتفشل pytest)
- --live-http يفشل إن لم يكن uvicorn شغّال على DEALIX_BASE_URL (افتراضي :8000).
"""
from __future__ import annotations
import argparse
import subprocess
import sys
from pathlib import Path
BACKEND = Path(__file__).resolve().parent.parent
def _pytest(extra_args: list[str]) -> int:
cmd = [sys.executable, "-m", "pytest", str(BACKEND / "tests"), "--tb=short", *extra_args]
print("Running:", " ".join(cmd), flush=True)
return subprocess.call(cmd, cwd=str(BACKEND))
def _live_http(soft_ready: bool, quick: bool) -> int:
script = BACKEND / "scripts" / "full_stack_launch_test.py"
cmd = [sys.executable, str(script), "--http-only"]
if soft_ready:
cmd.append("--soft-ready")
if quick:
cmd.append("--quick")
print("Running live HTTP:", " ".join(cmd), flush=True)
return subprocess.call(cmd, cwd=str(BACKEND))
def main() -> int:
argv = sys.argv[1:]
pytest_extra: list[str] = []
if "--" in argv:
sep = argv.index("--")
pytest_extra = [x for x in argv[sep + 1 :] if x != "--"]
argv = argv[:sep]
p = argparse.ArgumentParser(description="Dealix launch gate: pytest + optional live HTTP smoke")
p.add_argument(
"--live-http",
action="store_true",
help="After pytest, run full_stack_launch_test against DEALIX_BASE_URL (start uvicorn first)",
)
p.add_argument(
"--soft-ready",
action="store_true",
help="Pass --soft-ready to HTTP script (/ready DB may fail locally)",
)
p.add_argument(
"--quick-http",
action="store_true",
help="Pass --quick to HTTP script (skip slow LangGraph POST)",
)
args = p.parse_args(argv)
extra = pytest_extra if pytest_extra else ["-q"]
rc = _pytest(extra)
if rc != 0:
print("pytest FAILED — fix tests before launch.", flush=True)
return rc
print("pytest OK.", flush=True)
if not args.live_http:
print(
"Live HTTP skipped. Start API then run:\n"
f" py scripts/full_stack_launch_test.py --http-only\n"
f"Or: py scripts/launch_gate_runner.py --live-http --soft-ready",
flush=True,
)
return 0
return _live_http(args.soft_ready, args.quick_http)
if __name__ == "__main__":
sys.exit(main())