Add test suite (68 tests)
This commit is contained in:
157
tests/test_conversion.py
Normal file
157
tests/test_conversion.py
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
"""Tests for conversion service module."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
|
from codexchange.models import Language, ConversionRequest, ConversionResult
|
||||||
|
from codexchange.services.conversion_service import ConversionService
|
||||||
|
|
||||||
|
|
||||||
|
class TestConversionService:
|
||||||
|
"""Tests for ConversionService."""
|
||||||
|
|
||||||
|
def test_build_conversion_prompt(
|
||||||
|
self,
|
||||||
|
mock_ollama_service,
|
||||||
|
sample_python_code
|
||||||
|
):
|
||||||
|
"""Test building conversion prompt."""
|
||||||
|
service = ConversionService(ollama_service=mock_ollama_service)
|
||||||
|
|
||||||
|
prompt = service.build_conversion_prompt(
|
||||||
|
sample_python_code,
|
||||||
|
Language.PYTHON,
|
||||||
|
Language.JAVASCRIPT
|
||||||
|
)
|
||||||
|
|
||||||
|
assert "python" in prompt
|
||||||
|
assert "javascript" in prompt
|
||||||
|
assert "IMPORTANT REQUIREMENTS" in prompt
|
||||||
|
assert "Preserve ALL comments" in prompt
|
||||||
|
assert sample_python_code in prompt
|
||||||
|
|
||||||
|
def test_convert_success(
|
||||||
|
self,
|
||||||
|
mock_ollama_service,
|
||||||
|
conversion_request
|
||||||
|
):
|
||||||
|
"""Test successful conversion."""
|
||||||
|
mock_ollama_service.generate.return_value = "converted code"
|
||||||
|
|
||||||
|
service = ConversionService(ollama_service=mock_ollama_service)
|
||||||
|
result = service.convert(conversion_request)
|
||||||
|
|
||||||
|
assert result.success is True
|
||||||
|
assert result.converted_code == "converted code"
|
||||||
|
assert result.error_message is None
|
||||||
|
|
||||||
|
def test_convert_failure(
|
||||||
|
self,
|
||||||
|
mock_ollama_service,
|
||||||
|
conversion_request
|
||||||
|
):
|
||||||
|
"""Test failed conversion."""
|
||||||
|
mock_ollama_service.generate.side_effect = Exception("Connection failed")
|
||||||
|
|
||||||
|
service = ConversionService(ollama_service=mock_ollama_service)
|
||||||
|
result = service.convert(conversion_request)
|
||||||
|
|
||||||
|
assert result.success is False
|
||||||
|
assert result.error_message is not None
|
||||||
|
|
||||||
|
def test_convert_with_retry(
|
||||||
|
self,
|
||||||
|
mock_ollama_service,
|
||||||
|
conversion_request
|
||||||
|
):
|
||||||
|
"""Test conversion with retry on failure."""
|
||||||
|
mock_ollama_service.generate.side_effect = [
|
||||||
|
Exception("fail 1"),
|
||||||
|
Exception("fail 2"),
|
||||||
|
"success on third try"
|
||||||
|
]
|
||||||
|
|
||||||
|
service = ConversionService(ollama_service=mock_ollama_service)
|
||||||
|
result = service.convert(conversion_request)
|
||||||
|
|
||||||
|
assert result.success is True
|
||||||
|
assert result.converted_code == "success on third try"
|
||||||
|
|
||||||
|
def test_clean_conversion_output_with_code_blocks(self):
|
||||||
|
"""Test cleaning conversion output with code blocks."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
output = """Here is the converted code:
|
||||||
|
```javascript
|
||||||
|
console.log("Hello");
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
cleaned = service._clean_conversion_output(output)
|
||||||
|
assert cleaned == 'console.log("Hello");'
|
||||||
|
|
||||||
|
def test_clean_conversion_output_without_code_blocks(self):
|
||||||
|
"""Test cleaning conversion output without code blocks."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
output = "console.log('Hello');"
|
||||||
|
cleaned = service._clean_conversion_output(output)
|
||||||
|
assert cleaned == "console.log('Hello');"
|
||||||
|
|
||||||
|
def test_count_comments_python(self):
|
||||||
|
"""Test counting Python comments."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
code = "# This is a comment\nprint('hello')"
|
||||||
|
count = service.count_comments(code)
|
||||||
|
assert count == 1
|
||||||
|
|
||||||
|
def test_count_comments_javascript(self):
|
||||||
|
"""Test counting JavaScript comments."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
code = """
|
||||||
|
// This is a comment
|
||||||
|
function hello() {
|
||||||
|
/* Block comment */
|
||||||
|
return 1; // inline comment
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
count = service.count_comments(code)
|
||||||
|
assert count == 3
|
||||||
|
|
||||||
|
def test_verify_comment_preservation(self):
|
||||||
|
"""Test comment preservation verification."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
original = "# Comment\nprint('hello')"
|
||||||
|
converted = "// Comment\nconsole.log('hello')"
|
||||||
|
|
||||||
|
result = service.verify_comment_preservation(original, converted)
|
||||||
|
assert result is True
|
||||||
|
|
||||||
|
def test_verify_comment_preservation_no_comments(self):
|
||||||
|
"""Test comment preservation with no comments."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
original = "print('hello')"
|
||||||
|
converted = "console.log('hello')"
|
||||||
|
|
||||||
|
result = service.verify_comment_preservation(original, converted)
|
||||||
|
assert result is True
|
||||||
|
|
||||||
|
def test_verify_comment_preservation_missing_comments(self):
|
||||||
|
"""Test comment preservation when comments are missing."""
|
||||||
|
mock_service = MagicMock()
|
||||||
|
service = ConversionService(ollama_service=mock_service)
|
||||||
|
|
||||||
|
original = "# Comment\nprint('hello')"
|
||||||
|
converted = "console.log('hello')"
|
||||||
|
|
||||||
|
result = service.verify_comment_preservation(original, converted)
|
||||||
|
assert result is False
|
||||||
Reference in New Issue
Block a user