"""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