0461c6c7ab
### Findings and Changes
#### Changes:
- **Added **: Included a standard Python to avoid tracking unnecessary files (e.g., , , ).
- **Added **: Prepared the project for better dependency management.
- **Enhanced Gitea Tools**:
- Implemented in .
- Implemented (via ) in .
#### Implementation Details:
- Used the Gitea API to programmatically create a new branch and commit files directly from a script.
- Verified that the NAME:
tea - command line tool to interact with Gitea
USAGE:
tea [global options] [command [command options]]
VERSION:
Version: [1m0.14.1[0m golang: 1.26.3 go-sdk: v0.25.1
DESCRIPTION:
tea is a productivity helper for Gitea. It can be used to manage most entities on
one or multiple Gitea instances & provides local helpers like 'tea pr checkout'.
tea tries to make use of context provided by the repository in $PWD if available.
tea works best in a upstream/fork workflow, when the local main branch tracks the
upstream repo. tea assumes that local git state is published on the remote before
doing operations with tea. Configuration is persisted in $XDG_CONFIG_HOME/tea.
COMMANDS:
help, h Shows a list of commands or help for one command
ENTITIES:
issues, issue, i List, create and update issues
pulls, pull, pr Manage and checkout pull requests
labels, label Manage issue labels
milestones, milestone, ms List and create milestones
releases, release, r Manage releases
times, time, t Operate on tracked times of a repository's issues & pulls
organizations, organization, org List, create, delete organizations
repos, repo Manage repositories
branches, branch, b Consult branches
actions, action Manage repository actions
webhooks, webhook, hooks, hook Manage webhooks
comment, c Add a comment to an issue / pr
HELPERS:
open, o Open something of the repository in web browser
notifications, notification, n Show notifications
clone, C Clone a repository locally
api Make an authenticated API request
MISCELLANEOUS:
whoami Show current logged in user
admin, a Operations requiring admin access on the Gitea instance
SETUP:
logins, login Log in to a Gitea server
logout Log out from a Gitea server
ssh-keys, ssh-key Manage SSH public keys
GLOBAL OPTIONS:
--debug, --vvv Enable debug mode
--help, -h show help
--version, -v print the version CLI can be used for automated PR creation.
- Successfully configured Git user identity and remote tracking in the environment.
---------
Co-authored-by: Michael <michael@example.com>
Reviewed-on: #1
214 lines
8.1 KiB
Python
214 lines
8.1 KiB
Python
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 test_get_issue_success() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
issue: IssueModel = IssueModel(number=1, title="Test Issue", state="open")
|
|
mock_client.get_issue.return_value = issue
|
|
|
|
issue_tools: IssueTools = IssueTools(mock_client)
|
|
res: str = issue_tools.get_issue("owner", "repo", 1)
|
|
|
|
data: dict[str, Any] = json.loads(res)
|
|
assert data["number"] == 1
|
|
assert data["title"] == "Test Issue"
|
|
mock_client.get_issue.assert_called_once_with("owner", "repo", 1)
|
|
|
|
|
|
def test_get_issue_failure() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.get_issue.side_effect = Exception("API Error")
|
|
|
|
issue_tools: IssueTools = IssueTools(mock_client)
|
|
res: str = issue_tools.get_issue("owner", "repo", 1)
|
|
assert "Error getting issue: API Error" in res
|
|
|
|
|
|
def test_close_issue_success() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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.close_issue.assert_called_once_with("owner", "repo", 1)
|
|
|
|
|
|
def test_close_issue_failure() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
comment: CommentModel = CommentModel(id=123, body="Comment body")
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
repo: RepositoryModel = RepositoryModel(name="repo1", owner="owner1")
|
|
issue: IssueModel = IssueModel(number=1, title="Test Issue")
|
|
mock_client.list_all_user_repos.return_value = [repo]
|
|
mock_client.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.list_all_user_repos.assert_called_once()
|
|
mock_client.list_assigned_issues.assert_called_once_with("owner1", "repo1")
|
|
|
|
|
|
def test_list_assigned_issues_failure() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
issue: IssueModel = IssueModel(number=1, title="Test Issue")
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
issue: IssueModel = IssueModel(number=2)
|
|
mock_client.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.create_issue.assert_called_once_with("owner", "repo", "Title", "Body", ["label1"], ["assignee1"])
|
|
|
|
|
|
def test_create_issue_failure() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.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
|
|
|
|
|
|
def test_add_comment_success() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.add_comment.return_value = CommentModel(id=1)
|
|
|
|
issue_tools: IssueTools = IssueTools(mock_client)
|
|
res: str = issue_tools.add_comment("owner", "repo", 1, "body")
|
|
assert res == "Comment added to #1."
|
|
|
|
|
|
def test_add_comment_failure() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.add_comment.side_effect = Exception("API Error")
|
|
|
|
issue_tools: IssueTools = IssueTools(mock_client)
|
|
res: str = issue_tools.add_comment("owner", "repo", 1, "body")
|
|
assert "Error adding comment: API Error" in res
|
|
|
|
|
|
def test_add_label_success() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.add_label.return_value = LabelModel(name="bug")
|
|
|
|
issue_tools: IssueTools = IssueTools(mock_client)
|
|
res: str = issue_tools.add_label("owner", "repo", 1, "bug")
|
|
assert res == "Label 'bug' added to #1."
|
|
|
|
|
|
def test_add_label_failure() -> None:
|
|
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
|
mock_client.add_label.side_effect = Exception("API Error")
|
|
|
|
issue_tools: IssueTools = IssueTools(mock_client)
|
|
res: str = issue_tools.add_label("owner", "repo", 1, "bug")
|
|
assert "Error adding label: API Error" in res
|