Spaces:
Sleeping
Sleeping
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
""" | |
Unit tests for the AI Review Service | |
""" | |
import unittest | |
from unittest.mock import patch, MagicMock | |
import os | |
import sys | |
from pathlib import Path | |
# Add the project root directory to the Python path | |
project_root = Path(__file__).resolve().parent.parent | |
sys.path.insert(0, str(project_root)) | |
from src.mcp.ai_review import AIReviewService | |
class TestAIReviewService(unittest.TestCase): | |
"""Test cases for the AIReviewService class""" | |
def setUp(self): | |
"""Set up test fixtures""" | |
# Mock environment variables | |
self.env_patcher = patch.dict('os.environ', {'ANTHROPIC_API_KEY': 'test_api_key'}) | |
self.env_patcher.start() | |
# Create the service | |
self.service = AIReviewService() | |
def tearDown(self): | |
"""Tear down test fixtures""" | |
self.env_patcher.stop() | |
def test_init(self): | |
"""Test initialization of the service""" | |
self.assertIsNotNone(self.service) | |
self.assertEqual(self.service.api_key, 'test_api_key') | |
self.assertTrue(self.service.is_available()) | |
def test_is_available(self): | |
"""Test is_available method""" | |
# With API key | |
self.assertTrue(self.service.is_available()) | |
# Without API key | |
with patch.dict('os.environ', {}, clear=True): | |
service = AIReviewService() | |
self.assertFalse(service.is_available()) | |
def test_review_code(self, mock_anthropic): | |
"""Test review_code method""" | |
# Mock the Anthropic client | |
mock_client = MagicMock() | |
mock_anthropic.return_value = mock_client | |
# Mock the response | |
mock_response = MagicMock() | |
mock_content = MagicMock() | |
mock_content.text = "# Code Review\n\n## Code Quality\nThe code is well-structured.\n\n## Potential Issues\nLine 10: Variable 'x' is not used." | |
mock_response.content = [mock_content] | |
mock_client.messages.create.return_value = mock_response | |
# Test the method | |
result = self.service.review_code( | |
file_path="test.py", | |
file_content="def test():\n x = 1\n return 2", | |
language="Python" | |
) | |
# Verify the result | |
self.assertEqual(result['status'], 'success') | |
self.assertEqual(result['review_text'], mock_content.text) | |
self.assertIn('suggestions', result) | |
def test_review_code_error(self, mock_anthropic): | |
"""Test review_code method with error""" | |
# Mock the Anthropic client | |
mock_client = MagicMock() | |
mock_anthropic.return_value = mock_client | |
# Mock an error | |
mock_client.messages.create.side_effect = Exception("API error") | |
# Test the method | |
result = self.service.review_code( | |
file_path="test.py", | |
file_content="def test():\n return 1", | |
language="Python" | |
) | |
# Verify the result | |
self.assertEqual(result['status'], 'error') | |
self.assertEqual(result['error'], 'API error') | |
self.assertEqual(result['suggestions'], []) | |
def test_review_code_unavailable(self): | |
"""Test review_code method when service is unavailable""" | |
# Create a service without API key | |
with patch.dict('os.environ', {}, clear=True): | |
service = AIReviewService() | |
# Test the method | |
result = service.review_code( | |
file_path="test.py", | |
file_content="def test():\n return 1", | |
language="Python" | |
) | |
# Verify the result | |
self.assertEqual(result['status'], 'error') | |
self.assertIn('AI review service is not available', result['error']) | |
self.assertEqual(result['suggestions'], []) | |
def test_review_repository(self, mock_open, mock_anthropic): | |
"""Test review_repository method""" | |
# Mock the Anthropic client | |
mock_client = MagicMock() | |
mock_anthropic.return_value = mock_client | |
# Mock the response for file review | |
mock_file_response = MagicMock() | |
mock_file_content = MagicMock() | |
mock_file_content.text = "# Code Review\n\n## Code Quality\nThe code is well-structured." | |
mock_file_response.content = [mock_file_content] | |
# Mock the response for repository summary | |
mock_summary_response = MagicMock() | |
mock_summary_content = MagicMock() | |
mock_summary_content.text = "# Repository Review\n\nOverall, the code quality is good." | |
mock_summary_response.content = [mock_summary_content] | |
# Set up the mock to return different responses | |
mock_client.messages.create.side_effect = [mock_file_response, mock_summary_response] | |
# Test the method | |
result = self.service.review_repository( | |
repo_path="/test/repo", | |
files=["test.py"], | |
languages=["Python"] | |
) | |
# Verify the result | |
self.assertEqual(result['status'], 'success') | |
self.assertIn('reviews', result) | |
self.assertIn('test.py', result['reviews']) | |
self.assertEqual(result['summary'], mock_summary_content.text) | |
def test_get_language_from_extension(self): | |
"""Test _get_language_from_extension method""" | |
self.assertEqual(self.service._get_language_from_extension(".py"), "Python") | |
self.assertEqual(self.service._get_language_from_extension(".js"), "JavaScript") | |
self.assertEqual(self.service._get_language_from_extension(".ts"), "TypeScript") | |
self.assertEqual(self.service._get_language_from_extension(".java"), "Java") | |
self.assertEqual(self.service._get_language_from_extension(".go"), "Go") | |
self.assertEqual(self.service._get_language_from_extension(".rs"), "Rust") | |
self.assertIsNone(self.service._get_language_from_extension(".unknown")) | |
if __name__ == "__main__": | |
unittest.main() |