Initial upload: Devtoolbelt v1.0.0 - unified CLI toolkit for developers
This commit is contained in:
135
tests/test_config.py
Normal file
135
tests/test_config.py
Normal file
@@ -0,0 +1,135 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user