import json from typing import Any from unittest.mock import MagicMock from gitea.client import GiteaClient from gitea.models import IssueModel, CommentModel, LabelModel, RepositoryModel from gitea.tools.issue_tools import IssueTools def _create_mock_client() -> MagicMock: """Create a mock GiteaClient with sub-client attributes.""" mock_client: MagicMock = MagicMock(spec=GiteaClient) mock_client.issues = MagicMock() mock_client.repos = MagicMock() return mock_client def test_get_issue_success() -> None: mock_client = _create_mock_client() issue: IssueModel = IssueModel(number=1, title="Test Issue", state="open") mock_client.issues.get_issue.return_value = issue issue_tools: IssueTools = IssueTools(mock_client) res: IssueModel = issue_tools.get_issue("owner", "repo", 1) assert isinstance(res, IssueModel) assert res.number == 1 assert res.title == "Test Issue" mock_client.issues.get_issue.assert_called_once_with("owner", "repo", 1) def test_get_issue_failure() -> None: mock_client = _create_mock_client() mock_client.issues.get_issue.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) try: issue_tools.get_issue("owner", "repo", 1) assert False, "Expected Exception" except Exception as e: assert str(e) == "API Error" def test_close_issue_success() -> None: mock_client = _create_mock_client() mock_client.issues.close_issue.return_value = IssueModel(number=1, state="closed") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.close_issue("owner", "repo", 1) assert res == "Issue #1 closed successfully." mock_client.issues.close_issue.assert_called_once_with("owner", "repo", 1) def test_close_issue_failure() -> None: mock_client = _create_mock_client() mock_client.issues.close_issue.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.close_issue("owner", "repo", 1) assert "Error closing issue: API Error" in res def test_get_issue_comments_success() -> None: mock_client = _create_mock_client() comment: CommentModel = CommentModel(id=123, body="Comment body") mock_client.issues.get_issue_comments.return_value = [comment] issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.get_issue_comments("owner", "repo", 1) data: list[dict[str, Any]] = json.loads(res) assert len(data) == 1 assert data[0]["body"] == "Comment body" def test_get_issue_comments_failure() -> None: mock_client = _create_mock_client() mock_client.issues.get_issue_comments.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.get_issue_comments("owner", "repo", 1) assert "Error getting issue comments: API Error" in res def test_list_assigned_issues_success() -> None: mock_client = _create_mock_client() repo: RepositoryModel = RepositoryModel(name="repo1", owner="owner1") issue: IssueModel = IssueModel(number=1, title="Test Issue") mock_client.repos.list_all_user_repos.return_value = [repo] mock_client.issues.list_assigned_issues.return_value = [issue] issue_tools: IssueTools = IssueTools(mock_client) res: list[dict[str, Any]] = issue_tools.list_assigned_issues() assert len(res) == 1 assert res[0]["number"] == 1 mock_client.repos.list_all_user_repos.assert_called_once() mock_client.issues.list_assigned_issues.assert_called_once_with("owner1", "repo1") def test_list_assigned_issues_failure() -> None: mock_client = _create_mock_client() mock_client.repos.list_all_user_repos.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: list[dict[str, Any]] = issue_tools.list_assigned_issues() assert res == [] def test_list_issues_success() -> None: mock_client = _create_mock_client() issue: IssueModel = IssueModel(number=1, title="Test Issue") mock_client.issues.list_repo_issues.return_value = [issue] issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.list_issues("owner", "repo") assert "#1: Test Issue" in res def test_list_issues_empty() -> None: mock_client = _create_mock_client() mock_client.issues.list_repo_issues.return_value = [] issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.list_issues("owner", "repo") assert res == "No issues in owner/repo." def test_list_issues_failure() -> None: mock_client = _create_mock_client() mock_client.issues.list_repo_issues.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.list_issues("owner", "repo") assert "Error listing issues: API Error" in res def test_create_issue_success() -> None: mock_client = _create_mock_client() issue: IssueModel = IssueModel(number=2) mock_client.issues.create_issue.return_value = issue issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.create_issue( "owner", "repo", "Title", "Body", ["label1"], ["assignee1"] ) assert res == "Issue #2 created successfully in owner/repo." mock_client.issues.create_issue.assert_called_once_with( "owner", "repo", "Title", "Body", ["label1"], ["assignee1"] ) def test_create_issue_failure() -> None: mock_client = _create_mock_client() mock_client.issues.create_issue.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.create_issue("owner", "repo", "Title", "Body") assert "Error creating issue: API Error" in res def test_add_label_to_issue_success() -> None: mock_client = _create_mock_client() mock_client.issues.add_label.return_value = LabelModel(name="bug") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.add_label_to_issue("owner", "repo", 1, "bug") assert res == "Label 'bug' added to issue #1." def test_add_label_to_issue_failure() -> None: mock_client = _create_mock_client() mock_client.issues.add_label.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.add_label_to_issue("owner", "repo", 1, "bug") assert "Error adding label to issue #1: API Error" in res def test_add_comment_to_issue_success() -> None: mock_client = _create_mock_client() mock_client.issues.add_comment.return_value = CommentModel(id=1) issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.add_comment_to_issue("owner", "repo", 1, "body") assert res == "Comment added to issue #1." def test_add_comment_to_issue_failure() -> None: mock_client = _create_mock_client() mock_client.issues.add_comment.side_effect = Exception("API Error") issue_tools: IssueTools = IssueTools(mock_client) res: str = issue_tools.add_comment_to_issue("owner", "repo", 1, "body") assert "Error adding comment to issue #1: API Error" in res