2c59fe5ee2
- App 启动时初始化 RedisService,关闭时释放连接 - Celery worker 通过 worker_process_init 钩子初始化 Redis - Agent 端点改用 RedisService 替代直接创建连接 - Celery task 改为 async def,使用统一连接 - 删除无用的 infra 模块和 core/http/models - 日志脱敏,不记录 Redis 密码 - 初始化失败时 fail-fast - 异常发布添加二级保护
58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
import socket
|
|
import threading
|
|
import time
|
|
|
|
from playwright.sync_api import sync_playwright
|
|
import uvicorn
|
|
|
|
from app import app
|
|
|
|
|
|
def _find_free_port() -> int:
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
sock.bind(("127.0.0.1", 0))
|
|
return sock.getsockname()[1]
|
|
|
|
|
|
def _wait_for_port(host: str, port: int, timeout: float = 5.0) -> None:
|
|
deadline = time.time() + timeout
|
|
while time.time() < deadline:
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
if sock.connect_ex((host, port)) == 0:
|
|
return
|
|
time.sleep(0.05)
|
|
raise RuntimeError("Server did not start in time")
|
|
|
|
|
|
def _start_server(host: str, port: int):
|
|
config = uvicorn.Config(app, host=host, port=port, log_level="info")
|
|
server = uvicorn.Server(config)
|
|
thread = threading.Thread(target=server.run, daemon=True)
|
|
thread.start()
|
|
_wait_for_port(host, port)
|
|
return server, thread
|
|
|
|
|
|
def test_mobile_health_e2e() -> None:
|
|
host = "127.0.0.1"
|
|
port = _find_free_port()
|
|
server, thread = _start_server(host, port)
|
|
|
|
try:
|
|
with sync_playwright() as playwright:
|
|
request_context = playwright.request.new_context(
|
|
base_url=f"http://{host}:{port}"
|
|
)
|
|
try:
|
|
response = request_context.get("/health")
|
|
assert response.status == 200
|
|
body = response.json()
|
|
assert body["status"] == "ok"
|
|
finally:
|
|
request_context.dispose()
|
|
finally:
|
|
server.should_exit = True
|
|
thread.join(timeout=5)
|