168 lines
6.4 KiB
Python
168 lines
6.4 KiB
Python
import logging
|
|
from typing import Dict, Any
|
|
from pathlib import Path
|
|
from config.environment import EnvironmentLoader
|
|
|
|
# Инициализация логгера
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class Settings:
|
|
"""Основные настройки приложения"""
|
|
|
|
# Загрузка переменных окружения
|
|
ENV = EnvironmentLoader.get_env_variable('ENV', 'development')
|
|
DEBUG = EnvironmentLoader.get_env_variable('DEBUG', False)
|
|
|
|
# Базовые URL
|
|
API_BASE_URL = EnvironmentLoader.get_env_variable('API_BASE_URL', 'http://localhost:8080/api/v1')
|
|
UI_BASE_URL = EnvironmentLoader.get_env_variable('UI_BASE_URL', 'http://localhost:5173')
|
|
|
|
# Настройки логирования
|
|
LOG_LEVEL = EnvironmentLoader.get_env_variable('LOG_LEVEL', 'INFO').upper()
|
|
LOG_FORMAT = EnvironmentLoader.get_env_variable(
|
|
'LOG_FORMAT',
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
LOG_FILE = EnvironmentLoader.get_env_variable('LOG_FILE', 'logs/tests.log')
|
|
|
|
# Настройки тестов
|
|
TEST_TIMEOUT = EnvironmentLoader.get_env_variable('TEST_TIMEOUT', 30) # секунды
|
|
TEST_RETRIES = EnvironmentLoader.get_env_variable('TEST_RETRIES', 3)
|
|
TEST_PARALLEL_WORKERS = EnvironmentLoader.get_env_variable('TEST_PARALLEL_WORKERS', 'auto')
|
|
|
|
# Настройки Allure
|
|
ALLURE_RESULTS_DIR = EnvironmentLoader.get_env_variable('ALLURE_RESULTS_DIR', 'allure-results')
|
|
ALLURE_REPORT_DIR = EnvironmentLoader.get_env_variable('ALLURE_REPORT_DIR', 'allure-report')
|
|
|
|
# Настройки ожиданий
|
|
IMPLICIT_WAIT = EnvironmentLoader.get_env_variable('IMPLICIT_WAIT', 10) # секунды
|
|
EXPLICIT_WAIT = EnvironmentLoader.get_env_variable('EXPLICIT_WAIT', 30) # секунды
|
|
POLL_FREQUENCY = EnvironmentLoader.get_env_variable('POLL_FREQUENCY', 0.5) # секунды
|
|
|
|
# Базовые пути
|
|
PROJECT_ROOT = Path(__file__).parent.parent
|
|
TESTS_DIR = PROJECT_ROOT / 'tests'
|
|
DATA_DIR = TESTS_DIR / 'data'
|
|
REPORTS_DIR = PROJECT_ROOT / 'reports'
|
|
|
|
# Создание необходимых директорий
|
|
@classmethod
|
|
def create_directories(cls):
|
|
"""Создание необходимых директорий"""
|
|
directories = [
|
|
cls.REPORTS_DIR,
|
|
cls.DATA_DIR,
|
|
Path(cls.LOG_FILE).parent if cls.LOG_FILE else None,
|
|
Path(cls.ALLURE_RESULTS_DIR).parent if cls.ALLURE_RESULTS_DIR else None,
|
|
]
|
|
|
|
for directory in directories:
|
|
if directory and not directory.exists():
|
|
directory.mkdir(parents=True, exist_ok=True)
|
|
logger.debug(f"Created directory: {directory}")
|
|
|
|
@classmethod
|
|
def get_logging_config(cls) -> Dict[str, Any]:
|
|
"""Конфигурация логирования"""
|
|
return {
|
|
'version': 1,
|
|
'disable_existing_loggers': False,
|
|
'formatters': {
|
|
'standard': {
|
|
'format': cls.LOG_FORMAT,
|
|
'datefmt': '%Y-%m-%d %H:%M:%S',
|
|
},
|
|
'detailed': {
|
|
'format': '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s',
|
|
'datefmt': '%Y-%m-%d %H:%M:%S',
|
|
},
|
|
},
|
|
'handlers': {
|
|
'console': {
|
|
'class': 'logging.StreamHandler',
|
|
'level': cls.LOG_LEVEL,
|
|
'formatter': 'standard',
|
|
'stream': 'ext://sys.stdout',
|
|
},
|
|
'file': {
|
|
'class': 'logging.FileHandler',
|
|
'level': cls.LOG_LEVEL,
|
|
'formatter': 'detailed',
|
|
'filename': cls.LOG_FILE,
|
|
'mode': 'a',
|
|
},
|
|
},
|
|
'loggers': {
|
|
'': { # root logger
|
|
'handlers': ['console', 'file'],
|
|
'level': cls.LOG_LEVEL,
|
|
'propagate': True,
|
|
},
|
|
'tests': {
|
|
'handlers': ['console', 'file'],
|
|
'level': cls.LOG_LEVEL,
|
|
'propagate': False,
|
|
},
|
|
'api': {
|
|
'handlers': ['console', 'file'],
|
|
'level': cls.LOG_LEVEL,
|
|
'propagate': False,
|
|
},
|
|
'ui': {
|
|
'handlers': ['console', 'file'],
|
|
'level': cls.LOG_LEVEL,
|
|
'propagate': False,
|
|
},
|
|
},
|
|
}
|
|
|
|
@classmethod
|
|
def setup_logging(cls):
|
|
"""Настройка логирования"""
|
|
import logging.config
|
|
logging.config.dictConfig(cls.get_logging_config())
|
|
logger.info(f"Logging configured with level: {cls.LOG_LEVEL}")
|
|
|
|
@classmethod
|
|
def validate(cls):
|
|
"""Валидация настроек"""
|
|
# Проверка обязательных переменных
|
|
EnvironmentLoader.validate_environment()
|
|
|
|
# Проверка URL
|
|
import validators
|
|
if not validators.url(cls.API_BASE_URL):
|
|
logger.warning(f"API_BASE_URL might be invalid: {cls.API_BASE_URL}")
|
|
|
|
if not validators.url(cls.UI_BASE_URL):
|
|
logger.warning(f"UI_BASE_URL might be invalid: {cls.UI_BASE_URL}")
|
|
|
|
# Создание директорий
|
|
cls.create_directories()
|
|
|
|
logger.info(f"Settings validated for environment: {cls.ENV}")
|
|
|
|
@classmethod
|
|
def print_summary(cls):
|
|
"""Вывод сводки настроек"""
|
|
summary = f"""
|
|
===== Environment Settings =====
|
|
Environment: {cls.ENV}
|
|
Debug Mode: {cls.DEBUG}
|
|
API Base URL: {cls.API_BASE_URL}
|
|
UI Base URL: {cls.UI_BASE_URL}
|
|
Log Level: {cls.LOG_LEVEL}
|
|
Test Timeout: {cls.TEST_TIMEOUT}s
|
|
Test Retries: {cls.TEST_RETRIES}
|
|
Parallel Workers: {cls.TEST_PARALLEL_WORKERS}
|
|
=================================
|
|
"""
|
|
logger.info(summary)
|
|
|
|
# Инициализация настроек при импорте
|
|
Settings.validate()
|
|
Settings.setup_logging()
|
|
Settings.print_summary()
|
|
|
|
# Экспорт настроек
|
|
settings = Settings
|