diff --git a/pr_agent/tools/pr_similar_issue.py b/pr_agent/tools/pr_similar_issue.py index 7a97d85ba7..f337ebd246 100644 --- a/pr_agent/tools/pr_similar_issue.py +++ b/pr_agent/tools/pr_similar_issue.py @@ -17,12 +17,13 @@ class PRSimilarIssue: def __init__(self, issue_url: str, ai_handler, args: list = None): - if get_settings().config.git_provider != "github": - raise Exception("Only github is supported for similar issue tool") + self.issue_url = issue_url + self.supported = get_settings().config.git_provider == "github" + if not self.supported: + return self.cli_mode = get_settings().CONFIG.CLI_MODE self.max_issues_to_scan = get_settings().pr_similar_issue.max_issues_to_scan - self.issue_url = issue_url self.git_provider = get_git_provider()() repo_name, issue_number = self.git_provider._parse_issue_url(issue_url.split('=')[-1]) self.git_provider.repo = repo_name @@ -257,6 +258,20 @@ def __init__(self, issue_url: str, ai_handler, args: list = None): async def run(self): + if not self.supported: + message = "The /similar_issue tool is currently supported only for GitHub." + if get_settings().config.publish_output: + try: + from pr_agent.git_providers import get_git_provider_with_context + + provider = get_git_provider_with_context(self.issue_url) + provider.publish_comment(message) + except Exception as e: + get_logger().warning( + "Failed to publish /similar_issue unsupported message", + artifact={"error": str(e)}, + ) + return "" get_logger().info('Getting issue...') repo_name, original_issue_number = self.git_provider._parse_issue_url(self.issue_url.split('=')[-1]) issue_main = self.git_provider.repo_obj.get_issue(original_issue_number) diff --git a/tests/unittest/test_similar_issue_non_github.py b/tests/unittest/test_similar_issue_non_github.py new file mode 100644 index 0000000000..6581448692 --- /dev/null +++ b/tests/unittest/test_similar_issue_non_github.py @@ -0,0 +1,49 @@ +import pytest + +from pr_agent.tools.pr_similar_issue import PRSimilarIssue + + +@pytest.mark.asyncio +async def test_similar_issue_non_github_publishes_message(monkeypatch): + class FakeProvider: + def __init__(self): + self.comments = [] + + def publish_comment(self, body): + self.comments.append(body) + + fake_provider = FakeProvider() + + class FakeSettings: + class config: + git_provider = "gitlab" + publish_output = True + + monkeypatch.setattr("pr_agent.tools.pr_similar_issue.get_settings", lambda: FakeSettings) + monkeypatch.setattr( + "pr_agent.git_providers.get_git_provider_with_context", + lambda _: fake_provider, + ) + + tool = PRSimilarIssue("https://gitlab.example.com/group/repo/-/merge_requests/1", None) + result = await tool.run() + + assert result == "" + assert fake_provider.comments == [ + "The /similar_issue tool is currently supported only for GitHub." + ] + + +@pytest.mark.asyncio +async def test_similar_issue_non_github_no_publish(monkeypatch): + class FakeSettings: + class config: + git_provider = "gitlab" + publish_output = False + + monkeypatch.setattr("pr_agent.tools.pr_similar_issue.get_settings", lambda: FakeSettings) + + tool = PRSimilarIssue("https://gitlab.example.com/group/repo/-/merge_requests/1", None) + result = await tool.run() + + assert result == ""