264 lines
8.1 KiB
Python
264 lines
8.1 KiB
Python
"""Tests for converter modules."""
|
|
|
|
import pytest
|
|
import json
|
|
import tempfile
|
|
import os
|
|
from pathlib import Path
|
|
|
|
|
|
class TestJSONConverter:
|
|
"""Tests for JSON converter."""
|
|
|
|
def test_loads_valid_json(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
data = converter.loads('{"name": "test", "value": 123}')
|
|
assert data == {"name": "test", "value": 123}
|
|
|
|
def test_dumps_dict(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
result = converter.dumps({"name": "test"}, indent=2)
|
|
assert '"name": "test"' in result
|
|
|
|
def test_dumps_list(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
result = converter.dumps([1, 2, 3])
|
|
assert "1" in result and "2" in result and "3" in result
|
|
|
|
def test_convert_to_yaml(self):
|
|
from src.converters import JSONConverter, YAMLConverter
|
|
converter = JSONConverter()
|
|
yaml_converter = YAMLConverter()
|
|
|
|
content = '{"name": "test"}'
|
|
result = converter.convert(content, yaml_converter)
|
|
assert result.success
|
|
assert "name: test" in result.data
|
|
|
|
def test_roundtrip(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
original = {"key": "value", "number": 42, "list": [1, 2, 3]}
|
|
dumped = converter.dumps(original)
|
|
loaded = converter.loads(dumped)
|
|
assert loaded == original
|
|
|
|
def test_file_operations(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
|
|
f.write('{"test": true}')
|
|
temp_path = f.name
|
|
|
|
try:
|
|
content = converter.read_file(temp_path)
|
|
assert '{"test": true}' in content
|
|
|
|
converter.write_file(temp_path, '{"new": "data"}')
|
|
content = converter.read_file(temp_path)
|
|
assert '"new": "data"' in content
|
|
finally:
|
|
os.unlink(temp_path)
|
|
|
|
|
|
class TestYAMLConverter:
|
|
"""Tests for YAML converter."""
|
|
|
|
def test_loads_valid_yaml(self):
|
|
from src.converters import YAMLConverter
|
|
converter = YAMLConverter()
|
|
|
|
data = converter.loads('name: test\nvalue: 123')
|
|
assert data == {"name": "test", "value": 123}
|
|
|
|
def test_dumps_dict(self):
|
|
from src.converters import YAMLConverter
|
|
converter = YAMLConverter()
|
|
|
|
result = converter.dumps({"name": "test"})
|
|
assert "name: test" in result
|
|
|
|
def test_convert_to_json(self):
|
|
from src.converters import YAMLConverter, JSONConverter
|
|
converter = YAMLConverter()
|
|
json_converter = JSONConverter()
|
|
|
|
content = 'name: test'
|
|
result = converter.convert(content, json_converter)
|
|
assert result.success
|
|
assert '"name": "test"' in result.data
|
|
|
|
def test_nested_data(self):
|
|
from src.converters import YAMLConverter
|
|
converter = YAMLConverter()
|
|
|
|
data = {"outer": {"inner": "value"}, "list": [1, 2]}
|
|
result = converter.dumps(data)
|
|
assert "outer:" in result
|
|
assert "inner: value" in result
|
|
|
|
|
|
class TestTOMLConverter:
|
|
"""Tests for TOML converter."""
|
|
|
|
def test_loads_valid_toml(self):
|
|
from src.converters import TOMLConverter
|
|
converter = TOMLConverter()
|
|
|
|
data = converter.loads('name = "test"\nvalue = 123')
|
|
assert data["name"] == "test"
|
|
assert data["value"] == 123
|
|
|
|
def test_dumps_dict(self):
|
|
from src.converters import TOMLConverter
|
|
converter = TOMLConverter()
|
|
|
|
result = converter.dumps({"name": "test"})
|
|
assert 'name = "test"' in result
|
|
|
|
def test_convert_to_json(self):
|
|
from src.converters import TOMLConverter, JSONConverter
|
|
converter = TOMLConverter()
|
|
json_converter = JSONConverter()
|
|
|
|
content = 'name = "test"'
|
|
result = converter.convert(content, json_converter)
|
|
assert result.success
|
|
assert '"name": "test"' in result.data
|
|
|
|
|
|
class TestCSVConverter:
|
|
"""Tests for CSV converter."""
|
|
|
|
def test_loads_valid_csv(self):
|
|
from src.converters import CSVConverter
|
|
converter = CSVConverter()
|
|
|
|
data = converter.loads("name,age\nAlice,30\nBob,25")
|
|
assert len(data) == 2
|
|
assert data.iloc[0]["name"] == "Alice"
|
|
|
|
def test_dumps_list_of_dicts(self):
|
|
from src.converters import CSVConverter
|
|
converter = CSVConverter()
|
|
|
|
data = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]
|
|
result = converter.dumps(data)
|
|
assert "name,age" in result
|
|
assert "Alice" in result
|
|
|
|
def test_convert_to_json(self):
|
|
from src.converters import CSVConverter, JSONConverter
|
|
csv_converter = CSVConverter()
|
|
json_converter = JSONConverter()
|
|
|
|
content = "name,age\nAlice,30"
|
|
result = csv_converter.convert(content, json_converter)
|
|
assert result.success
|
|
assert '"name": "Alice"' in result.data
|
|
|
|
def test_roundtrip(self):
|
|
from src.converters import CSVConverter
|
|
converter = CSVConverter()
|
|
|
|
original = [{"name": "Alice", "age": 30}]
|
|
dumped = converter.dumps(original)
|
|
loaded = converter.loads(dumped)
|
|
assert loaded.iloc[0]["name"] == "Alice"
|
|
|
|
|
|
class TestConverterFactory:
|
|
"""Tests for converter factory function."""
|
|
|
|
def test_get_converter_json(self):
|
|
from src.converters import get_converter
|
|
|
|
converter = get_converter("json")
|
|
assert converter.format_name == "json"
|
|
|
|
def test_get_converter_yaml(self):
|
|
from src.converters import get_converter
|
|
|
|
converter = get_converter("yaml")
|
|
assert converter.format_name == "yaml"
|
|
|
|
def test_get_converter_toml(self):
|
|
from src.converters import get_converter
|
|
|
|
converter = get_converter("toml")
|
|
assert converter.format_name == "toml"
|
|
|
|
def test_get_converter_csv(self):
|
|
from src.converters import get_converter
|
|
|
|
converter = get_converter("csv")
|
|
assert converter.format_name == "csv"
|
|
|
|
def test_get_converter_invalid(self):
|
|
from src.converters import get_converter
|
|
|
|
with pytest.raises(ValueError):
|
|
get_converter("invalid")
|
|
|
|
def test_supported_formats(self):
|
|
from src.converters import SUPPORTED_FORMATS
|
|
|
|
assert "json" in SUPPORTED_FORMATS
|
|
assert "yaml" in SUPPORTED_FORMATS
|
|
assert "toml" in SUPPORTED_FORMATS
|
|
assert "csv" in SUPPORTED_FORMATS
|
|
|
|
|
|
class TestFormatDetection:
|
|
"""Tests for format detection."""
|
|
|
|
def test_detect_json(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
fmt = converter.detect_format("test.json")
|
|
assert fmt == "json"
|
|
|
|
def test_detect_yaml(self):
|
|
from src.converters import YAMLConverter
|
|
converter = YAMLConverter()
|
|
|
|
fmt = converter.detect_format("test.yaml")
|
|
assert fmt == "yaml"
|
|
|
|
def test_detect_yml(self):
|
|
from src.converters import YAMLConverter
|
|
converter = YAMLConverter()
|
|
|
|
fmt = converter.detect_format("test.yml")
|
|
assert fmt == "yaml"
|
|
|
|
def test_detect_toml(self):
|
|
from src.converters import TOMLConverter
|
|
converter = TOMLConverter()
|
|
|
|
fmt = converter.detect_format("test.toml")
|
|
assert fmt == "toml"
|
|
|
|
def test_detect_csv(self):
|
|
from src.converters import CSVConverter
|
|
converter = CSVConverter()
|
|
|
|
fmt = converter.detect_format("test.csv")
|
|
assert fmt == "csv"
|
|
|
|
def test_detect_unknown(self):
|
|
from src.converters import JSONConverter
|
|
converter = JSONConverter()
|
|
|
|
fmt = converter.detect_format("test.xyz")
|
|
assert fmt is None
|