diff --git a/app/tests/test_parsers.py b/app/tests/test_parsers.py new file mode 100644 index 0000000..3678155 --- /dev/null +++ b/app/tests/test_parsers.py @@ -0,0 +1,208 @@ +"""Tests for config parsers.""" + +import pytest +import json +import tempfile +from pathlib import Path + +from src.confgen.parsers import ConfigParser + + +class TestConfigParser: + """Tests for ConfigParser.""" + + def setup_method(self): + """Set up test fixtures.""" + self.parser = ConfigParser() + + def test_parse_json(self): + """Test parsing JSON content.""" + content = '{"name": "myapp", "port": 8080}' + result = self.parser.parse_json(content) + + assert result["name"] == "myapp" + assert result["port"] == 8080 + + def test_parse_yaml(self): + """Test parsing YAML content.""" + content = """ +name: myapp +port: 8080 +features: + - feature1 + - feature2 +""" + result = self.parser.parse_yaml(content) + + assert result["name"] == "myapp" + assert result["port"] == 8080 + assert "feature1" in result["features"] + + def test_parse_toml(self): + """Test parsing TOML content.""" + content = """ +name = "myapp" +port = 8080 + +[features] +feature1 = true +""" + result = self.parser.parse_toml(content) + + assert result["name"] == "myapp" + assert result["port"] == 8080 + assert result["features"]["feature1"] is True + + def test_parse_auto_detect_json(self): + """Test auto-detecting JSON format.""" + content = '{"name": "myapp"}' + result = self.parser.parse(content) + + assert isinstance(result, dict) + assert result["name"] == "myapp" + + def test_parse_auto_detect_yaml(self): + """Test auto-detecting YAML format.""" + content = "name: myapp" + result = self.parser.parse(content) + + assert isinstance(result, dict) + assert result["name"] == "myapp" + + def test_to_json(self): + """Test converting to JSON.""" + data = {"name": "myapp", "port": 8080} + result = self.parser.to_json(data) + + assert "myapp" in result + assert "8080" in result + + def test_to_yaml(self): + """Test converting to YAML.""" + data = {"name": "myapp", "port": 8080} + result = self.parser.to_yaml(data) + + assert "myapp" in result + assert "8080" in result + + def test_to_toml(self): + """Test converting to TOML.""" + data = {"name": "myapp", "port": 8080} + result = self.parser.to_toml(data) + + assert "myapp" in result + assert "8080" in result + + def test_detect_format_from_path_json(self): + """Test detecting format from JSON file path.""" + result = self.parser.detect_format_from_path("config.json") + assert result == "json" + + def test_detect_format_from_path_yaml(self): + """Test detecting format from YAML file path.""" + result = self.parser.detect_format_from_path("config.yaml") + assert result == "yaml" + + def test_detect_format_from_path_yml(self): + """Test detecting format from YML file path.""" + result = self.parser.detect_format_from_path("config.yml") + assert result == "yaml" + + def test_detect_format_from_path_toml(self): + """Test detecting format from TOML file path.""" + result = self.parser.detect_format_from_path("config.toml") + assert result == "toml" + + def test_load_file_json(self): + """Test loading a JSON file.""" + with tempfile.NamedTemporaryFile( + mode="w", suffix=".json", delete=False + ) as f: + json.dump({"name": "myapp", "port": 8080}, f) + temp_path = f.name + + try: + result = self.parser.load_file(temp_path) + + assert result["name"] == "myapp" + assert result["port"] == 8080 + finally: + Path(temp_path).unlink() + + def test_load_file_yaml(self): + """Test loading a YAML file.""" + with tempfile.NamedTemporaryFile( + mode="w", suffix=".yaml", delete=False + ) as f: + f.write("name: myapp\nport: 8080") + temp_path = f.name + + try: + result = self.parser.load_file(temp_path) + + assert result["name"] == "myapp" + assert result["port"] == 8080 + finally: + Path(temp_path).unlink() + + def test_save_file(self): + """Test saving a config file.""" + with tempfile.TemporaryDirectory() as tmpdir: + data = {"name": "myapp", "port": 8080} + self.parser.save_file(f"{tmpdir}/config.yaml", data) + + assert Path(f"{tmpdir}/config.yaml").exists() + + with open(f"{tmpdir}/config.yaml") as f: + content = f.read() + + assert "myapp" in content + assert "8080" in content + + def test_parse_invalid_json(self): + """Test that invalid JSON raises an error.""" + content = '{"name": "myapp",' + + with pytest.raises(ValueError, match="Invalid JSON"): + self.parser.parse_json(content) + + def test_parse_invalid_yaml(self): + """Test that invalid YAML raises an error.""" + content = "name: [invalid yaml" + + with pytest.raises(ValueError, match="Invalid YAML"): + self.parser.parse_yaml(content) + + def test_parse_nested_dict(self): + """Test parsing nested dictionaries.""" + content = """ +database: + host: localhost + port: 5432 + settings: + ssl: true + timeout: 30 +""" + result = self.parser.parse_yaml(content) + + assert result["database"]["host"] == "localhost" + assert result["database"]["port"] == 5432 + assert result["database"]["settings"]["ssl"] is True + + def test_parse_with_list(self): + """Test parsing configurations with lists.""" + content = """ +services: + - name: web + port: 80 + - name: api + port: 8080 +features: + - feature1 + - feature2 +""" + result = self.parser.parse_yaml(content) + + assert len(result["services"]) == 2 + assert result["services"][0]["name"] == "web" + assert len(result["features"]) == 2