142 lines
5.0 KiB
Python
142 lines
5.0 KiB
Python
"""
|
|
Tests for configuration module
|
|
"""
|
|
|
|
import unittest
|
|
import tempfile
|
|
import os
|
|
import yaml
|
|
from unittest.mock import patch
|
|
from config import Config
|
|
|
|
|
|
class TestConfig(unittest.TestCase):
|
|
"""Test cases for Config class"""
|
|
|
|
def setUp(self):
|
|
"""Set up test fixtures"""
|
|
self.test_config_data = {
|
|
'llm': {
|
|
'base_url': 'http://localhost:1234',
|
|
'api_key': 'test-key',
|
|
'model': 'test-model'
|
|
},
|
|
'android': {
|
|
'input_folder': 'app/src/main/res',
|
|
'base_values_folder': 'values',
|
|
'target_folders': ['values-de-rDE'],
|
|
'files_to_translate': ['strings.xml']
|
|
},
|
|
'translation': {
|
|
'batch_size': 5,
|
|
'interactive_approval': True
|
|
}
|
|
}
|
|
|
|
def test_load_valid_config(self):
|
|
"""Test loading a valid configuration file"""
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
yaml.dump(self.test_config_data, f)
|
|
temp_path = f.name
|
|
|
|
try:
|
|
config = Config(temp_path)
|
|
self.assertEqual(config.llm_config['base_url'], 'http://localhost:1234')
|
|
self.assertEqual(config.android_config['input_folder'], 'app/src/main/res')
|
|
self.assertEqual(config.translation_config['batch_size'], 5)
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
def test_missing_file_error(self):
|
|
"""Test error handling for missing configuration file"""
|
|
with patch('sys.exit') as mock_exit:
|
|
Config('nonexistent.yaml')
|
|
mock_exit.assert_called_once_with(1)
|
|
|
|
def test_missing_required_section(self):
|
|
"""Test error handling for missing required sections"""
|
|
incomplete_data = {'llm': self.test_config_data['llm']} # Missing android and translation
|
|
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
yaml.dump(incomplete_data, f)
|
|
temp_path = f.name
|
|
|
|
try:
|
|
with patch('sys.exit') as mock_exit:
|
|
Config(temp_path)
|
|
mock_exit.assert_called_with(1) # Remove assert_called_once
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
def test_output_config_default(self):
|
|
"""Test default output configuration"""
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
yaml.dump(self.test_config_data, f)
|
|
temp_path = f.name
|
|
|
|
try:
|
|
config = Config(temp_path)
|
|
output_config = config.output_config
|
|
self.assertEqual(output_config, {}) # Should be empty dict when not specified
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
def test_examples_config_missing(self):
|
|
"""Test examples config when not specified"""
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
yaml.dump(self.test_config_data, f)
|
|
temp_path = f.name
|
|
|
|
try:
|
|
config = Config(temp_path)
|
|
self.assertFalse(config.has_examples_config())
|
|
self.assertEqual(config.examples_config, {})
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
def test_examples_config_present(self):
|
|
"""Test examples config when specified"""
|
|
config_with_examples = self.test_config_data.copy()
|
|
config_with_examples['examples'] = {
|
|
'input_folder': 'examples',
|
|
'base_folder': 'assets/hints',
|
|
'target_folders': ['assets/hints-de-rDE'],
|
|
'file_extension': '.md'
|
|
}
|
|
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
yaml.dump(config_with_examples, f)
|
|
temp_path = f.name
|
|
|
|
try:
|
|
config = Config(temp_path)
|
|
self.assertTrue(config.has_examples_config())
|
|
self.assertEqual(config.examples_config['input_folder'], 'examples')
|
|
self.assertEqual(config.examples_config['base_folder'], 'assets/hints')
|
|
self.assertEqual(config.examples_config['target_folders'], ['assets/hints-de-rDE'])
|
|
self.assertEqual(config.examples_config['file_extension'], '.md')
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
def test_examples_config_incomplete(self):
|
|
"""Test has_examples_config returns False for incomplete config"""
|
|
config_with_examples = self.test_config_data.copy()
|
|
config_with_examples['examples'] = {
|
|
'input_folder': 'examples',
|
|
# Missing base_folder and target_folders
|
|
}
|
|
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
yaml.dump(config_with_examples, f)
|
|
temp_path = f.name
|
|
|
|
try:
|
|
config = Config(temp_path)
|
|
self.assertFalse(config.has_examples_config())
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|