Spaces:
Build error
Build error
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.interfaces.gitlab import GitlabIssueHandler, GitlabPRHandler | |
from openhands.resolver.interfaces.issue import Issue | |
from openhands.resolver.interfaces.issue_definitions import ( | |
ServiceContextIssue, | |
ServiceContextPR, | |
) | |
def test_guess_success_multiline_explanation(): | |
# Mock data | |
issue = Issue( | |
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 = ServiceContextIssue( | |
GitlabIssueHandler('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 = ServiceContextPR(GitlabPRHandler('test', 'test', 'test'), llm_config) | |
# Create a mock issue with thread comments but no review comments | |
issue = Issue( | |
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 = ServiceContextPR( | |
GitlabPRHandler('test-owner', 'test-repo', 'test-token'), llm_config | |
) | |
# Create a mock issue with only review comments | |
issue = Issue( | |
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 = ServiceContextPR(GitlabPRHandler('test', 'test', 'test'), llm_config) | |
# Create a mock issue with no comments | |
issue = Issue( | |
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' | |