""" Unit Tests - Configuration - ServiceManagerWeb Tests para app.core.config: carga de settings, valores por defecto y propiedades derivadas. No requieren base de datos ni red. """ import pytest class TestSettings: """Tests para la configuración centralizada de la aplicación.""" def test_settings_loads_without_error(self): """get_settings() debe cargar sin lanzar excepciones.""" from app.core.config import get_settings settings = get_settings() assert settings is not None def test_settings_is_singleton(self): """get_settings() debe retornar la misma instancia (lru_cache).""" from app.core.config import get_settings s1 = get_settings() s2 = get_settings() assert s1 is s2 def test_environment_is_valid(self): """ENVIRONMENT debe ser uno de los valores válidos del sistema.""" from app.core.config import get_settings settings = get_settings() valid_envs = {"development", "staging", "production", "testing"} assert settings.ENVIRONMENT in valid_envs, ( f"ENVIRONMENT='{settings.ENVIRONMENT}' no es un valor válido. " f"Debe ser uno de: {valid_envs}" ) def test_app_version_is_set(self): """APP_VERSION debe estar definido.""" from app.core.config import get_settings settings = get_settings() assert settings.APP_VERSION is not None assert len(settings.APP_VERSION) > 0 def test_app_version_is_1_9_0(self): """APP_VERSION debe ser 1.9.0 en esta versión del proyecto.""" from app.core.config import get_settings settings = get_settings() assert settings.APP_VERSION == "1.9.0" def test_api_version_default(self): """API_VERSION debe ser v1 por defecto.""" from app.core.config import get_settings settings = get_settings() assert settings.API_VERSION == "v1" def test_jwt_algorithm_default(self): """JWT_ALGORITHM debe ser HS256 por defecto.""" from app.core.config import get_settings settings = get_settings() assert settings.JWT_ALGORITHM == "HS256" def test_access_token_expire_minutes(self): """ACCESS_TOKEN_EXPIRE_MINUTES debe ser un entero positivo.""" from app.core.config import get_settings settings = get_settings() assert isinstance(settings.ACCESS_TOKEN_EXPIRE_MINUTES, int) assert settings.ACCESS_TOKEN_EXPIRE_MINUTES > 0 def test_refresh_token_expire_days(self): """REFRESH_TOKEN_EXPIRE_DAYS debe ser un entero positivo.""" from app.core.config import get_settings settings = get_settings() assert isinstance(settings.REFRESH_TOKEN_EXPIRE_DAYS, int) assert settings.REFRESH_TOKEN_EXPIRE_DAYS > 0 def test_secret_key_is_set(self): """SECRET_KEY debe estar definido y no vacío.""" from app.core.config import get_settings settings = get_settings() assert settings.SECRET_KEY assert len(settings.SECRET_KEY) > 0 def test_allowed_file_extensions_is_list(self): """ALLOWED_FILE_EXTENSIONS debe retornar una lista.""" from app.core.config import get_settings settings = get_settings() extensions = settings.ALLOWED_FILE_EXTENSIONS assert isinstance(extensions, list) assert len(extensions) > 0 def test_allowed_file_extensions_lowercase(self): """Las extensiones de archivo deben estar en minúsculas.""" from app.core.config import get_settings settings = get_settings() for ext in settings.ALLOWED_FILE_EXTENSIONS: assert ext == ext.lower(), f"Extensión '{ext}' no está en minúsculas" def test_is_development_consistent(self): """is_development() debe ser consistente con el valor de ENVIRONMENT.""" from app.core.config import get_settings settings = get_settings() expected = settings.ENVIRONMENT == "development" assert settings.is_development() is expected def test_is_testing_consistent(self): """is_testing() debe ser consistente con el valor de ENVIRONMENT.""" from app.core.config import get_settings settings = get_settings() expected = settings.ENVIRONMENT == "testing" assert settings.is_testing() is expected def test_is_production_returns_false_in_testing(self): """is_production() debe retornar False en entorno de test.""" from app.core.config import get_settings settings = get_settings() assert settings.is_production() is False def test_argon2_settings_positive(self): """Los parámetros de Argon2 deben ser enteros positivos.""" from app.core.config import get_settings settings = get_settings() assert settings.ARGON2_TIME_COST > 0 assert settings.ARGON2_MEMORY_COST > 0 assert settings.ARGON2_PARALLELISM > 0 def test_max_upload_size_positive(self): """MAX_UPLOAD_SIZE_MB debe ser positivo.""" from app.core.config import get_settings settings = get_settings() assert settings.MAX_UPLOAD_SIZE_MB > 0 def test_password_min_length(self): """PASSWORD_MIN_LENGTH debe ser al menos 8.""" from app.core.config import get_settings settings = get_settings() assert settings.PASSWORD_MIN_LENGTH >= 8