80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
"""Fail-fast конфигурации: production не стартует с дефолтными секретами (#59, F4)."""
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
from pydantic import ValidationError
|
|
|
|
from app.core import config
|
|
|
|
_STRONG_SECRET = "k" * 40
|
|
_STRONG_ADMIN_PW = "a-strong-admin-password"
|
|
|
|
|
|
def test_production_rejects_default_secret_key():
|
|
with pytest.raises(ValidationError):
|
|
config.Settings(
|
|
app_env="production",
|
|
secret_key=config._DEFAULT_SECRET_KEY,
|
|
admin_password=_STRONG_ADMIN_PW,
|
|
)
|
|
|
|
|
|
def test_production_rejects_short_secret_key():
|
|
with pytest.raises(ValidationError):
|
|
config.Settings(
|
|
app_env="production",
|
|
secret_key="too-short",
|
|
admin_password=_STRONG_ADMIN_PW,
|
|
)
|
|
|
|
|
|
def test_production_rejects_default_admin_password():
|
|
with pytest.raises(ValidationError):
|
|
config.Settings(
|
|
app_env="production",
|
|
secret_key=_STRONG_SECRET,
|
|
admin_bootstrap_enabled=True,
|
|
admin_password=config._DEFAULT_ADMIN_PASSWORD,
|
|
)
|
|
|
|
|
|
def test_production_accepts_strong_secrets():
|
|
s = config.Settings(
|
|
app_env="production",
|
|
secret_key=_STRONG_SECRET,
|
|
admin_password=_STRONG_ADMIN_PW,
|
|
)
|
|
assert s.is_production
|
|
|
|
|
|
def test_production_skips_admin_check_when_bootstrap_disabled():
|
|
# Админ управляется вручную (bootstrap off) — дефолтный ADMIN_PASSWORD не блокирует старт.
|
|
s = config.Settings(
|
|
app_env="production",
|
|
secret_key=_STRONG_SECRET,
|
|
admin_bootstrap_enabled=False,
|
|
admin_password=config._DEFAULT_ADMIN_PASSWORD,
|
|
)
|
|
assert s.is_production
|
|
|
|
|
|
def test_development_allows_defaults():
|
|
s = config.Settings(
|
|
app_env="development",
|
|
secret_key=config._DEFAULT_SECRET_KEY,
|
|
admin_password=config._DEFAULT_ADMIN_PASSWORD,
|
|
)
|
|
assert s.is_development
|
|
|
|
|
|
@pytest.mark.parametrize("app_env", ["test", "staging", ""])
|
|
def test_unknown_app_env_rejected(app_env):
|
|
# Отдельного test-контура больше нет: такое значение не должно молча включать прод-пути.
|
|
with pytest.raises(ValidationError):
|
|
config.Settings(app_env=app_env)
|
|
|
|
|
|
def test_app_env_case_insensitive():
|
|
s = config.Settings(app_env="Development")
|
|
assert s.is_development
|