fix(tests): isolate trading API from Playwright

This commit is contained in:
2026-08-20 16:51:24 +08:00
parent 3284e086ad
commit bba45d7f7c
+23 -7
View File
@@ -11,7 +11,8 @@ from fastapi.testclient import TestClient
from app.shared.config import get_settings
from app.shared.errors import CartOperationError, NotLoggedInError
from app.trading.main import create_app
from app.trading import main as trading_main
from app.trading.container import TradingContainer
from app.trading.services.auth_session import AuthStatus
TOKEN = get_settings().bearer_token
@@ -68,6 +69,9 @@ class StubAuthSession:
if not self.logged_in:
raise NotLoggedInError(site=site, detail="stub")
async def start(self) -> None:
"""模拟 lifespan 启动;桩不持有真实客户端。"""
async def close(self) -> None:
"""lifespan 收尾会调用;桩没有真实客户端要关"""
@@ -139,18 +143,30 @@ class StubSiteInteractor:
"detail": "连接正常" if self.browser_alive else "浏览器已掉线",
}
async def start(self) -> None:
"""模拟 lifespan 启动;桩不启动 Playwright。"""
async def close(self) -> None:
"""lifespan 收尾会调用;桩没有真实浏览器要关"""
@pytest.fixture
def client_and_stubs():
app = create_app()
def client_and_stubs(monkeypatch):
"""在 lifespan 之前注入桩,确保离线 API 测试不启动 Playwright。"""
stub = StubAuthSession()
stub_site = StubSiteInteractor()
settings = get_settings().model_copy(update={"auto_login_on_start": False})
def build_test_container() -> TradingContainer:
return TradingContainer(
settings=settings,
auth_session=stub, # type: ignore[arg-type]
site=stub_site,
)
monkeypatch.setattr(trading_main, "build_container", build_test_container)
app = trading_main.create_app()
with TestClient(app) as client:
stub = StubAuthSession()
stub_site = StubSiteInteractor()
app.state.container.auth_session = stub
app.state.container.site = stub_site
yield client, stub, stub_site