| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- import json
- from unittest.mock import MagicMock, patch
- from openhands.core.config import LLMConfig
- from openhands.events.action.message import MessageAction
- from openhands.llm import LLM
- from openhands.resolver.github_issue import GithubIssue
- from openhands.resolver.issue_definitions import IssueHandler, PRHandler
- def test_guess_success_multiline_explanation():
- # Mock data
- issue = GithubIssue(
- owner='test',
- repo='test',
- number=1,
- title='Test Issue',
- body='Test body',
- thread_comments=None,
- review_comments=None,
- )
- history = [MessageAction(content='Test message')]
- llm_config = LLMConfig(model='test', api_key='test')
- # Create a mock response with multi-line explanation
- mock_response = MagicMock()
- mock_response.choices = [
- MagicMock(
- message=MagicMock(
- content="""--- success
- true
- --- explanation
- The PR successfully addressed the issue by:
- - Fixed bug A
- - Added test B
- - Updated documentation C
- Automatic fix generated by OpenHands 🙌"""
- )
- )
- ]
- # Use patch to mock the LLM completion call
- with patch.object(LLM, 'completion', return_value=mock_response) as mock_completion:
- # Create a handler instance
- handler = IssueHandler('test', 'test', 'test', llm_config)
- # Call guess_success
- success, _, explanation = handler.guess_success(issue, history)
- # Verify the results
- assert success is True
- assert 'The PR successfully addressed the issue by:' in explanation
- assert 'Fixed bug A' in explanation
- assert 'Added test B' in explanation
- assert 'Updated documentation C' in explanation
- assert 'Automatic fix generated by OpenHands' in explanation
- # Verify that LLM completion was called exactly once
- mock_completion.assert_called_once()
- def test_pr_handler_guess_success_with_thread_comments():
- # Create a PR handler instance
- llm_config = LLMConfig(model='test', api_key='test')
- handler = PRHandler('test-owner', 'test-repo', 'test-token', llm_config)
- # Create a mock issue with thread comments but no review comments
- issue = GithubIssue(
- owner='test-owner',
- repo='test-repo',
- number=1,
- title='Test PR',
- body='Test Body',
- thread_comments=['First comment', 'Second comment'],
- closing_issues=['Issue description'],
- review_comments=None,
- thread_ids=None,
- head_branch='test-branch',
- )
- # Create mock history
- history = [MessageAction(content='Fixed the issue by implementing X and Y')]
- # Create mock LLM config
- llm_config = LLMConfig(model='test-model', api_key='test-key')
- # Mock the LLM response
- mock_response = MagicMock()
- mock_response.choices = [
- MagicMock(
- message=MagicMock(
- content="""--- success
- true
- --- explanation
- The changes successfully address the feedback."""
- )
- )
- ]
- # Test the guess_success method
- with patch.object(LLM, 'completion', return_value=mock_response):
- success, success_list, explanation = handler.guess_success(issue, history)
- # Verify the results
- assert success is True
- assert success_list == [True]
- assert 'successfully address' in explanation
- assert len(json.loads(explanation)) == 1
- def test_pr_handler_guess_success_only_review_comments():
- # Create a PR handler instance
- llm_config = LLMConfig(model='test', api_key='test')
- handler = PRHandler('test-owner', 'test-repo', 'test-token', llm_config)
- # Create a mock issue with only review comments
- issue = GithubIssue(
- owner='test-owner',
- repo='test-repo',
- number=1,
- title='Test PR',
- body='Test Body',
- thread_comments=None,
- closing_issues=['Issue description'],
- review_comments=['Please fix the formatting', 'Add more tests'],
- thread_ids=None,
- head_branch='test-branch',
- )
- # Create mock history
- history = [MessageAction(content='Fixed the formatting and added more tests')]
- # Create mock LLM config
- llm_config = LLMConfig(model='test-model', api_key='test-key')
- # Mock the LLM response
- mock_response = MagicMock()
- mock_response.choices = [
- MagicMock(
- message=MagicMock(
- content="""--- success
- true
- --- explanation
- The changes successfully address the review comments."""
- )
- )
- ]
- # Test the guess_success method
- with patch.object(LLM, 'completion', return_value=mock_response):
- success, success_list, explanation = handler.guess_success(issue, history)
- # Verify the results
- assert success is True
- assert success_list == [True]
- assert (
- '["The changes successfully address the review comments."]' in explanation
- )
- def test_pr_handler_guess_success_no_comments():
- # Create a PR handler instance
- llm_config = LLMConfig(model='test', api_key='test')
- handler = PRHandler('test-owner', 'test-repo', 'test-token', llm_config)
- # Create a mock issue with no comments
- issue = GithubIssue(
- owner='test-owner',
- repo='test-repo',
- number=1,
- title='Test PR',
- body='Test Body',
- thread_comments=None,
- closing_issues=['Issue description'],
- review_comments=None,
- thread_ids=None,
- head_branch='test-branch',
- )
- # Create mock history
- history = [MessageAction(content='Fixed the issue')]
- # Create mock LLM config
- llm_config = LLMConfig(model='test-model', api_key='test-key')
- # Test that it returns appropriate message when no comments are present
- success, success_list, explanation = handler.guess_success(issue, history)
- assert success is False
- assert success_list is None
- assert explanation == 'No feedback was found to process'
|