117 lines
3.9 KiB
Python
117 lines
3.9 KiB
Python
"""Tests for diff generation."""
|
|
|
|
|
|
from i18n_guardian.diff.diff_generator import DiffGenerator, DiffChange, DiffResult
|
|
|
|
|
|
class TestDiffGenerator:
|
|
"""Tests for DiffGenerator."""
|
|
|
|
def test_generate_diff_basic(self, temp_dir):
|
|
"""Test basic diff generation."""
|
|
file_path = temp_dir / "test.py"
|
|
old_content = 'message = "Hello"'
|
|
new_content = 'message = t("Hello")'
|
|
|
|
generator = DiffGenerator()
|
|
diff = generator.generate_diff(file_path, old_content, new_content)
|
|
|
|
assert isinstance(diff, str)
|
|
assert len(diff) > 0
|
|
assert "---" in diff
|
|
assert "+++" in diff
|
|
assert "-" in diff
|
|
assert "+" in diff
|
|
|
|
def test_generate_diff_multiple_lines(self, temp_dir):
|
|
"""Test diff generation for multiple lines."""
|
|
file_path = temp_dir / "test.py"
|
|
old_content = '''def greet():
|
|
return "Hello"
|
|
'''
|
|
new_content = '''def greet():
|
|
return t("Hello")
|
|
'''
|
|
|
|
generator = DiffGenerator()
|
|
diff = generator.generate_diff(file_path, old_content, new_content)
|
|
|
|
assert "Hello" in diff
|
|
|
|
def test_create_replacement(self):
|
|
"""Test creating replacement string with i18n function."""
|
|
generator = DiffGenerator()
|
|
replacement = generator.create_replacement("Hello World", "t")
|
|
|
|
assert 't("Hello World")' in replacement
|
|
assert "\\n" not in replacement or replacement.count('\\n') == 0
|
|
|
|
def test_create_replacement_escaping(self):
|
|
"""Test that special characters are escaped."""
|
|
generator = DiffGenerator()
|
|
replacement = generator.create_replacement('Hello "World"', "t")
|
|
|
|
assert '\\"' in replacement
|
|
|
|
def test_diff_result_structure(self):
|
|
"""Test DiffResult has correct structure."""
|
|
result = DiffResult()
|
|
assert hasattr(result, "changes")
|
|
assert hasattr(result, "files_modified")
|
|
assert hasattr(result, "total_changes")
|
|
assert result.changes == []
|
|
|
|
def test_diff_change_structure(self, temp_dir):
|
|
"""Test DiffChange has correct structure."""
|
|
change = DiffChange(
|
|
file_path=temp_dir / "test.py",
|
|
original_line=1,
|
|
original_text='"Hello"',
|
|
new_text='t("Hello")',
|
|
)
|
|
|
|
assert hasattr(change, "file_path")
|
|
assert hasattr(change, "original_line")
|
|
assert hasattr(change, "original_text")
|
|
assert hasattr(change, "new_text")
|
|
|
|
def test_empty_diff(self, temp_dir):
|
|
"""Test diff with no changes."""
|
|
file_path = temp_dir / "test.py"
|
|
content = 'message = "Hello"'
|
|
|
|
generator = DiffGenerator()
|
|
diff = generator.generate_diff(file_path, content, content)
|
|
|
|
assert isinstance(diff, str)
|
|
|
|
def test_apply_diff_creates_backup(self, temp_dir):
|
|
"""Test that applying diff creates backup."""
|
|
file_path = temp_dir / "test.py"
|
|
file_path.write_text('message = "Hello"', encoding="utf-8")
|
|
|
|
old_content = file_path.read_text(encoding="utf-8")
|
|
new_content = 'message = t("Hello")'
|
|
|
|
generator = DiffGenerator()
|
|
diff = generator.generate_diff(file_path, old_content, new_content)
|
|
result = generator.apply_diff(file_path, diff, backup=True)
|
|
|
|
assert result
|
|
assert file_path.with_suffix(".bak").exists()
|
|
|
|
def test_apply_diff_modifies_file(self, temp_dir):
|
|
"""Test that applying diff modifies file."""
|
|
file_path = temp_dir / "test.py"
|
|
file_path.write_text('message = "Hello"', encoding="utf-8")
|
|
|
|
old_content = file_path.read_text(encoding="utf-8")
|
|
new_content = 'message = t("Hello")'
|
|
|
|
generator = DiffGenerator()
|
|
diff = generator.generate_diff(file_path, old_content, new_content)
|
|
generator.apply_diff(file_path, diff, backup=False)
|
|
|
|
content = file_path.read_text(encoding="utf-8")
|
|
assert 't("Hello")' in content
|