| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import os
- import subprocess
- import tempfile
- from openhands.resolver.github_issue import GithubIssue
- from openhands.resolver.send_pull_request import make_commit
- def test_commit_message_with_quotes():
- # Create a temporary directory and initialize git repo
- with tempfile.TemporaryDirectory() as temp_dir:
- subprocess.run(['git', 'init', temp_dir], check=True)
- # Create a test file and add it to git
- test_file = os.path.join(temp_dir, 'test.txt')
- with open(test_file, 'w') as f:
- f.write('test content')
- subprocess.run(['git', '-C', temp_dir, 'add', 'test.txt'], check=True)
- # Create a test issue with problematic title
- issue = GithubIssue(
- owner='test-owner',
- repo='test-repo',
- number=123,
- title="Issue with 'quotes' and \"double quotes\" and <class 'ValueError'>",
- body='Test body',
- labels=[],
- assignees=[],
- state='open',
- created_at='2024-01-01T00:00:00Z',
- updated_at='2024-01-01T00:00:00Z',
- closed_at=None,
- head_branch=None,
- thread_ids=None,
- )
- # Make the commit
- make_commit(temp_dir, issue, 'issue')
- # Get the commit message
- result = subprocess.run(
- ['git', '-C', temp_dir, 'log', '-1', '--pretty=%B'],
- capture_output=True,
- text=True,
- check=True,
- )
- commit_msg = result.stdout.strip()
- # The commit message should contain the quotes without excessive escaping
- expected = "Fix issue #123: Issue with 'quotes' and \"double quotes\" and <class 'ValueError'>"
- assert commit_msg == expected, f'Expected: {expected}\nGot: {commit_msg}'
- def test_pr_title_with_quotes(monkeypatch):
- # Mock requests.post to avoid actual API calls
- class MockResponse:
- def __init__(self, status_code=201):
- self.status_code = status_code
- self.text = ''
- def json(self):
- return {'html_url': 'https://github.com/test/test/pull/1'}
- def raise_for_status(self):
- pass
- def mock_post(*args, **kwargs):
- # Verify that the PR title is not over-escaped
- data = kwargs.get('json', {})
- title = data.get('title', '')
- expected = "Fix issue #123: Issue with 'quotes' and \"double quotes\" and <class 'ValueError'>"
- assert (
- title == expected
- ), f'PR title was incorrectly escaped.\nExpected: {expected}\nGot: {title}'
- return MockResponse()
- class MockGetResponse:
- def __init__(self, status_code=200):
- self.status_code = status_code
- self.text = ''
- def json(self):
- return {'default_branch': 'main'}
- def raise_for_status(self):
- pass
- monkeypatch.setattr('requests.post', mock_post)
- monkeypatch.setattr('requests.get', lambda *args, **kwargs: MockGetResponse())
- monkeypatch.setattr(
- 'openhands.resolver.send_pull_request.branch_exists',
- lambda *args, **kwargs: False,
- )
- # Mock subprocess.run to avoid actual git commands
- original_run = subprocess.run
- def mock_run(*args, **kwargs):
- print(f"Running command: {args[0] if args else kwargs.get('args', [])}")
- if isinstance(args[0], list) and args[0][0] == 'git':
- if 'push' in args[0]:
- return subprocess.CompletedProcess(
- args[0], returncode=0, stdout='', stderr=''
- )
- return original_run(*args, **kwargs)
- return original_run(*args, **kwargs)
- monkeypatch.setattr('subprocess.run', mock_run)
- # Create a temporary directory and initialize git repo
- with tempfile.TemporaryDirectory() as temp_dir:
- print('Initializing git repo...')
- subprocess.run(['git', 'init', temp_dir], check=True)
- # Add these lines to configure git
- subprocess.run(
- ['git', '-C', temp_dir, 'config', 'user.name', 'Test User'], check=True
- )
- subprocess.run(
- ['git', '-C', temp_dir, 'config', 'user.email', 'test@example.com'],
- check=True,
- )
- # Create a test file and add it to git
- test_file = os.path.join(temp_dir, 'test.txt')
- with open(test_file, 'w') as f:
- f.write('test content')
- print('Adding and committing test file...')
- subprocess.run(['git', '-C', temp_dir, 'add', 'test.txt'], check=True)
- subprocess.run(
- ['git', '-C', temp_dir, 'commit', '-m', 'Initial commit'], check=True
- )
- # Create a test issue with problematic title
- print('Creating test issue...')
- issue = GithubIssue(
- owner='test-owner',
- repo='test-repo',
- number=123,
- title="Issue with 'quotes' and \"double quotes\" and <class 'ValueError'>",
- body='Test body',
- labels=[],
- assignees=[],
- state='open',
- created_at='2024-01-01T00:00:00Z',
- updated_at='2024-01-01T00:00:00Z',
- closed_at=None,
- head_branch=None,
- thread_ids=None,
- )
- # Try to send a PR - this will fail if the title is incorrectly escaped
- print('Sending PR...')
- from openhands.core.config import LLMConfig
- from openhands.resolver.send_pull_request import send_pull_request
- send_pull_request(
- github_issue=issue,
- github_token='dummy-token',
- github_username='test-user',
- patch_dir=temp_dir,
- llm_config=LLMConfig(model='test-model', api_key='test-key'),
- pr_type='ready',
- )
|