diff --git a/tests/test_conversion.py b/tests/test_conversion.py new file mode 100644 index 0000000..0095f07 --- /dev/null +++ b/tests/test_conversion.py @@ -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