Files
devtoolbelt/tests/test_config.py
7000pctAUTO 7a69c86f2a
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
Initial upload: Devtoolbelt v1.0.0 - unified CLI toolkit for developers
2026-02-01 21:45:53 +00:00

136 lines
4.3 KiB
Python

"""Tests for configuration module."""
import os
import tempfile
from pathlib import Path
import pytest
import yaml
from devtoolbelt.config import Config, get_config
class TestConfig:
"""Tests for Config class."""
@pytest.fixture
def temp_config_file(self):
"""Create a temporary config file."""
with tempfile.NamedTemporaryFile(mode='w', suffix='.yml', delete=False) as f:
config_data = {
'databases': {
'testdb': {
'type': 'postgresql',
'host': 'localhost',
'port': 5432,
'database': 'test'
}
},
'api_endpoints': {
'testapi': 'https://api.example.com'
},
'default_database': 'testdb'
}
yaml.dump(config_data, f)
temp_path = f.name
yield temp_path
if os.path.exists(temp_path):
os.unlink(temp_path)
def test_load_config(self, temp_config_file):
"""Test loading configuration from file."""
config = Config(Path(temp_config_file))
loaded = config.load()
assert 'databases' in loaded
assert 'testdb' in loaded['databases']
assert loaded['databases']['testdb']['type'] == 'postgresql'
def test_get_value(self, temp_config_file):
"""Test getting configuration values."""
config = Config(Path(temp_config_file))
config.load()
assert config.get('databases.testdb.type') == 'postgresql'
assert config.get('databases.testdb.host') == 'localhost'
assert config.get('databases.nonexistent', 'default') == 'default'
def test_set_value(self, temp_config_file):
"""Test setting configuration values."""
config = Config(Path(temp_config_file))
config.load()
config.set('databases.newdb.type', 'mysql')
config.set('new_key.nested.value', 'test')
assert config.get('databases.newdb.type') == 'mysql'
assert config.get('new_key.nested.value') == 'test'
def test_get_database_configs(self, temp_config_file):
"""Test getting database configurations."""
config = Config(Path(temp_config_file))
config.load()
databases = config.get_database_configs()
assert 'testdb' in databases
assert databases['testdb']['type'] == 'postgresql'
def test_get_api_endpoints(self, temp_config_file):
"""Test getting API endpoints."""
config = Config(Path(temp_config_file))
config.load()
endpoints = config.get_api_endpoints()
assert 'testapi' in endpoints
assert endpoints['testapi'] == 'https://api.example.com'
def test_get_default_db(self, temp_config_file):
"""Test getting default database."""
config = Config(Path(temp_config_file))
config.load()
assert config.get_default_db() == 'testdb'
def test_save_config(self, temp_config_file):
"""Test saving configuration."""
config = Config(Path(temp_config_file))
config.load()
config.set('databases.another.type', 'sqlite')
config.save()
config2 = Config(Path(temp_config_file))
config2.load()
assert config2.get('databases.another.type') == 'sqlite'
def test_nonexistent_file(self):
"""Test handling of nonexistent config file."""
config = Config(Path('/nonexistent/path/config.yml'))
loaded = config.load()
assert loaded == {}
def test_get_config_helper(self, temp_config_file):
"""Test get_config helper function."""
config = get_config(temp_config_file)
assert config.get('databases.testdb.type') == 'postgresql'
class TestConfigCreation:
"""Tests for config file creation."""
@pytest.fixture
def new_config_path(self):
"""Path for a new config file."""
with tempfile.TemporaryDirectory() as tmpdir:
yield Path(tmpdir) / 'new_config.yml'
def test_save_creates_directory(self, new_config_path):
"""Test that save creates parent directory."""
config = Config(new_config_path)
config.set('test.key', 'value')
config.save()
assert new_config_path.exists()