c6309f0f74
conftest 在 import app 前设 test DATABASE_URL、调 ensure()+ensure_test_db() 引导 PG,fixture 改 drop_all→create_all(防持久卷残留)。ensure_pg 把 _ensure_test_db 提为公开 ensure_test_db(短路路径不建库,测试侧需显式补)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
67 lines
2.9 KiB
Python
67 lines
2.9 KiB
Python
"""测试用 fixtures。
|
|
|
|
测试库用 Docker PostgreSQL 的 shaguabijia_test(与 dev 业务库 shaguabijia 隔离)。
|
|
顺序(必须):设 test DATABASE_URL(在 import app.* 之前)→ ensure PG 就绪 + 测试库存在 →
|
|
import app → 建表。持久卷可能残留上次的表 → session 开头先 drop 再 create。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from collections.abc import Iterator
|
|
|
|
# 1) 测试库连接串——必须在 import app.* 之前设好(app.db.session 在 import 期就建 engine)
|
|
_TEST_DB_URL = (
|
|
"postgresql+psycopg://shaguabijia_app:shaguabijia_dev_pw@localhost:5432/shaguabijia_test"
|
|
)
|
|
os.environ["DATABASE_URL"] = _TEST_DB_URL
|
|
os.environ.setdefault("JWT_SECRET_KEY", "test-secret-please-ignore-this-is-only-for-pytest-not-real")
|
|
os.environ.setdefault("ADMIN_JWT_SECRET", "test-admin-secret-please-ignore-only-for-pytest-not-real")
|
|
os.environ.setdefault("JG_APP_KEY", "test-key")
|
|
os.environ.setdefault("JG_MASTER_SECRET", "test-secret")
|
|
os.environ.setdefault("SMS_MOCK", "true")
|
|
os.environ.setdefault("APP_ENV", "dev")
|
|
os.environ.setdefault("APP_DEBUG", "false") # 测试不打 SQL 日志
|
|
# 微信支付:填 dummy 让 wxpay_configured 为真(测试里 wxpay 的网络调用全 monkeypatch,不会真发)
|
|
os.environ.setdefault("WECHAT_APP_ID", "wxtest0000000000")
|
|
os.environ.setdefault("WECHAT_APP_SECRET", "test-secret")
|
|
os.environ.setdefault("WXPAY_MCH_ID", "test-mch")
|
|
os.environ.setdefault("WXPAY_MCH_SERIAL_NO", "test-serial")
|
|
os.environ.setdefault("WXPAY_PUBLIC_KEY_ID", "test-pubkey-id")
|
|
os.environ.setdefault("RATE_LIMIT_ENABLED", "false") # 限流内存计数会跨用例累加,测试关掉
|
|
# 穿山甲发奖回调:测试里开启 + 给个 mock 验签密钥,test 内自签自验闭环
|
|
os.environ.setdefault("PANGLE_CALLBACK_ENABLED", "true")
|
|
os.environ.setdefault("PANGLE_REWARD_SECRET", "test-pangle-secret-only-for-pytest")
|
|
|
|
# 2) 保证 Docker PG 就绪(必须在 import app.db.session 建 engine 之前)。
|
|
# ensure() 在「端口已通」时会短路、不建测试库,故随后再显式补一刀 ensure_test_db()。
|
|
from scripts.ensure_pg import ensure, ensure_test_db
|
|
|
|
if not ensure(_TEST_DB_URL):
|
|
raise RuntimeError(
|
|
"测试需要 Docker PostgreSQL 就绪。请确认已装 Docker Desktop;"
|
|
"或先跑一次 run.bat/run.sh 把 PG 拉起,再重试 pytest。"
|
|
)
|
|
# best-effort 兜底建测试库(PG 已在跑但测试库缺失=老卷)。真缺库时下面 create_all 会明确报错。
|
|
ensure_test_db()
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.db.base import Base
|
|
from app.db.session import engine
|
|
from app.main import app
|
|
|
|
|
|
@pytest.fixture(scope="session", autouse=True)
|
|
def _setup_db() -> Iterator[None]:
|
|
# 持久卷可能残留上次跑崩后的表/数据 → 先 drop 再 create,保证干净起点
|
|
Base.metadata.drop_all(engine)
|
|
Base.metadata.create_all(engine)
|
|
yield
|
|
Base.metadata.drop_all(engine)
|
|
|
|
|
|
@pytest.fixture()
|
|
def client() -> TestClient:
|
|
return TestClient(app)
|