Files
ResourceTranslate/tests/test_config.py
2026-02-14 18:12:28 +01:00

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()