209 lines
5.8 KiB
Python
209 lines
5.8 KiB
Python
"""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
|