""" Tests for configuration loading and validation. """ import os import sys import pytest from pathlib import Path # Add project root to path for imports project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) class TestDatabaseConfig: """Test database configuration loading.""" def test_config_loads_from_env(self): """Test that config loads successfully from .env file.""" # Import config (should load .env automatically) from src import config # Verify database config is loaded assert config.DATABASE is not None assert 'host' in config.DATABASE assert 'port' in config.DATABASE assert 'database' in config.DATABASE assert 'user' in config.DATABASE assert 'password' in config.DATABASE def test_database_password_loaded(self): """Test that database password is loaded from environment.""" from src import config # Password should be loaded from .env assert config.DATABASE['password'] is not None assert config.DATABASE['password'] != '' def test_database_connection_string(self): """Test database connection string generation.""" from src import config conn_str = config.get_db_connection_string() # Should contain all required parts assert 'postgresql://' in conn_str assert config.DATABASE['user'] in conn_str assert config.DATABASE['host'] in conn_str assert str(config.DATABASE['port']) in conn_str assert config.DATABASE['database'] in conn_str def test_config_raises_without_password(self, tmp_path, monkeypatch): """Test that config raises error if DB_PASSWORD is not set.""" # Create a temporary .env file without password temp_env = tmp_path / ".env" temp_env.write_text("DB_HOST=localhost\nDB_PORT=5432\n") # Point to temp .env file monkeypatch.setenv('DOTENV_PATH', str(temp_env)) monkeypatch.delenv('DB_PASSWORD', raising=False) # Try to import a fresh module (simulated) # In real scenario, this would fail at module load time # For testing, we verify the validation logic works password = os.getenv('DB_PASSWORD') assert password is None, "DB_PASSWORD should not be set" class TestPathsConfig: """Test paths configuration.""" def test_paths_config_exists(self): """Test that PATHS configuration exists.""" from src import config assert config.PATHS is not None assert 'csv_dir' in config.PATHS assert 'pdf_dir' in config.PATHS assert 'output_dir' in config.PATHS assert 'reports_dir' in config.PATHS class TestAutolabelConfig: """Test autolabel configuration.""" def test_autolabel_config_exists(self): """Test that AUTOLABEL configuration exists.""" from src import config assert config.AUTOLABEL is not None assert 'workers' in config.AUTOLABEL assert 'dpi' in config.AUTOLABEL assert 'min_confidence' in config.AUTOLABEL assert 'train_ratio' in config.AUTOLABEL def test_autolabel_ratios_sum_to_one(self): """Test that train/val/test ratios sum to 1.0.""" from src import config total = ( config.AUTOLABEL['train_ratio'] + config.AUTOLABEL['val_ratio'] + config.AUTOLABEL['test_ratio'] ) assert abs(total - 1.0) < 0.001 # Allow small floating point error