"""生产配置校验:固定验证码必须显式开关,否则启动即失败。 这两条是「部署纪律」的守门员:生产一旦误用 dev 验证码,等于任意手机号可登录。 现在的规则更简单——**短信验证码登录默认关着**,关着时 SMS_PROVIDER 是 dev 也无所谓, 因为那条路根本不通;只有在 SMS_LOGIN_ENABLED=true 时才要求真通道。 """ 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_when_login_enabled() -> None: with pytest.raises(RuntimeError, match="SMS_LOGIN_ENABLED"): _prod(sms_provider="dev", sms_login_enabled=True).validate_runtime() def test_prod_is_fine_with_sms_login_closed() -> None: # 默认就是这条:短信登录关着,provider 配成 dev 也不会有人能用它进来 _prod(sms_provider="dev", sms_login_enabled=False).validate_runtime() def test_prod_allows_real_sms_provider_when_enabled() -> None: _prod(sms_provider="aliyun", sms_login_enabled=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()