"""Tests for issue tracker tools."""
from unittest.mock import patch, MagicMock
from bitbucket_mcp.tools import issues as _mod
list_issues = _mod.list_issues.fn
create_issue = _mod.create_issue.fn
get_issue = _mod.get_issue.fn
update_issue = _mod.update_issue.fn
list_issue_comments = _mod.list_issue_comments.fn
add_issue_comment = _mod.add_issue_comment.fn
from tests.conftest import make_mock_response
class TestListIssues:
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_success(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.get.return_value = make_mock_response(200, {
"values": [
{
"id": 1,
"title": "Bug report",
"state": "new",
"priority": "major",
"kind": "bug",
"assignee": {"display_name": "Dev"},
"reporter": {"display_name": "User"},
"created_on": "2025-01-01",
"updated_on": "2025-01-02",
"votes": 3,
"links": {"html": {"href": "https://bb.org/issue/1"}},
}
],
"size": 1, "page": 1, "pagelen": 25,
})
result = list_issues("repo")
assert result["success"] is True
assert len(result["issues"]) == 1
assert result["issues"][0]["title"] == "Bug report"
assert result["issues"][0]["assignee"] == "Dev"
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_not_found(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.get.return_value = make_mock_response(404)
result = list_issues("nonexistent")
assert result["success"] is False
assert "not found" in result["error"]
class TestCreateIssue:
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_success(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.post.return_value = make_mock_response(201, {
"id": 2,
"title": "New bug",
"state": "new",
"priority": "major",
"kind": "bug",
"links": {"html": {"href": "https://bb.org/issue/2"}},
})
result = create_issue("repo", "New bug", content="Details here")
assert result["success"] is True
assert result["id"] == 2
assert result["title"] == "New bug"
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_permission_denied(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.post.return_value = make_mock_response(403)
result = create_issue("repo", "New bug")
assert result["success"] is False
assert "Permission denied" in result["error"]
class TestGetIssue:
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_success(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.get.return_value = make_mock_response(200, {
"id": 1,
"title": "Bug report",
"content": {"raw": "Detailed description"},
"state": "open",
"priority": "major",
"kind": "bug",
"assignee": {"display_name": "Dev"},
"reporter": {"display_name": "User"},
"created_on": "2025-01-01",
"updated_on": "2025-01-02",
"votes": 3,
"component": None,
"milestone": None,
"version": None,
"links": {"html": {"href": "https://bb.org/issue/1"}},
})
result = get_issue("repo", 1)
assert result["success"] is True
assert result["content"] == "Detailed description"
assert result["assignee"] == "Dev"
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_not_found(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.get.return_value = make_mock_response(404)
result = get_issue("repo", 999)
assert result["success"] is False
assert "not found" in result["error"]
class TestUpdateIssue:
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_success(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.put.return_value = make_mock_response(200, {
"id": 1,
"title": "Updated title",
"state": "resolved",
"priority": "major",
"kind": "bug",
"assignee": None,
"links": {"html": {"href": "https://bb.org/issue/1"}},
})
result = update_issue("repo", 1, title="Updated title", state="resolved")
assert result["success"] is True
assert result["title"] == "Updated title"
assert result["state"] == "resolved"
def test_no_fields(self, saved_config):
result = update_issue("repo", 1)
assert result["success"] is False
assert "No update fields" in result["error"]
class TestListIssueComments:
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_success(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.get.return_value = make_mock_response(200, {
"values": [
{
"id": 1,
"content": {"raw": "Working on it"},
"user": {"display_name": "Dev"},
"created_on": "2025-01-01",
"updated_on": "2025-01-01",
}
],
"size": 1, "page": 1, "pagelen": 25,
})
result = list_issue_comments("repo", 1)
assert result["success"] is True
assert len(result["comments"]) == 1
assert result["comments"][0]["content"] == "Working on it"
class TestAddIssueComment:
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_success(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.post.return_value = make_mock_response(201, {
"id": 2,
"content": {"raw": "Fixed in latest commit"},
"user": {"display_name": "Dev"},
"created_on": "2025-01-01",
})
result = add_issue_comment("repo", 1, "Fixed in latest commit")
assert result["success"] is True
assert result["id"] == 2
assert "Comment added" in result["message"]
@patch("bitbucket_mcp.tools.issues.httpx.Client")
def test_issue_not_found(self, MockClient, saved_config):
client = MagicMock()
MockClient.return_value.__enter__ = MagicMock(return_value=client)
MockClient.return_value.__exit__ = MagicMock(return_value=False)
client.post.return_value = make_mock_response(404)
result = add_issue_comment("repo", 999, "Comment")
assert result["success"] is False
assert "not found" in result["error"]