Skip to content

Commit

Permalink
Implement unit testings for gitlab
Browse files Browse the repository at this point in the history
  • Loading branch information
wtiger9218 committed Jan 25, 2025
1 parent 1b7ae55 commit ce78f3e
Show file tree
Hide file tree
Showing 8 changed files with 4,233 additions and 2 deletions.
3 changes: 1 addition & 2 deletions openhands/resolver/gitlab.py
Original file line number Diff line number Diff line change
Expand Up @@ -421,8 +421,7 @@ def get_pr_comments(
comments = [
comment
for comment in comments
if not comment.get('resolvable', True)
and not comment.get('system', True)
if comment.get('resolvable', True) and not comment.get('system', True)
]

if not comments:
Expand Down
197 changes: 197 additions & 0 deletions tests/unit/resolver/gitlab/test_gitlab_guess_success.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
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.gitlab import GitlabIssueHandler, GitlabPRHandler
from openhands.resolver.issue import Issue
from openhands.resolver.issue_definitions import ServiceContext, 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 = ServiceContext(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'
Loading

0 comments on commit ce78f3e

Please sign in to comment.