40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""生产配置校验:固定验证码必须显式开关,否则启动即失败。
|
|
|
|
这两条是「部署纪律」的守门员:生产一旦误用 dev 验证码,等于任意手机号可登录。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from app.config import Settings
|
|
|
|
_STRONG_SECRET = "x" * 48
|
|
_PROD_DB = "postgresql+asyncpg://dadao_prod_app:pw@192.168.8.160:8432/dadaotask_prod"
|
|
|
|
|
|
def _prod(**overrides: object) -> Settings:
|
|
values: dict[str, object] = {
|
|
"env": "prod",
|
|
"jwt_secret": _STRONG_SECRET,
|
|
"database_url": _PROD_DB,
|
|
"sms_provider": "aliyun",
|
|
}
|
|
values.update(overrides)
|
|
return Settings(**values)
|
|
|
|
|
|
def test_prod_rejects_dev_sms_without_switch() -> None:
|
|
with pytest.raises(RuntimeError, match="SMS_PROVIDER=dev"):
|
|
_prod(sms_provider="dev").validate_runtime()
|
|
|
|
|
|
def test_prod_allows_dev_sms_with_internal_test_login() -> None:
|
|
# 内测模式:显式开关后放行,启动时 main.lifespan 会打 WARNING
|
|
_prod(sms_provider="dev", internal_test_login=True).validate_runtime()
|
|
|
|
|
|
def test_prod_still_rejects_weak_jwt_secret() -> None:
|
|
with pytest.raises(RuntimeError, match="JWT_SECRET"):
|
|
_prod(jwt_secret="short").validate_runtime()
|