"""Tests for branch and tag management tools."""
from unittest.mock import patch, MagicMock
from bitbucket_mcp.tools import branches as _mod
list_branches = _mod.list_branches.fn
create_branch = _mod.create_branch.fn
delete_branch = _mod.delete_branch.fn
list_tags = _mod.list_tags.fn
create_tag = _mod.create_tag.fn
delete_tag = _mod.delete_tag.fn
get_branching_model = _mod.get_branching_model.fn
from tests.conftest import make_mock_response, make_paginated_response
class TestListBranches:
@patch("bitbucket_mcp.tools.branches.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": [
{
"name": "main",
"target": {
"hash": "abc123def456",
"message": "Initial commit\nMore details",
"date": "2025-01-01",
"author": {"user": {"display_name": "Dev"}}
}
}
],
"size": 1, "page": 1, "pagelen": 25,
})
result = list_branches("repo")
assert result["success"] is True
assert len(result["branches"]) == 1
assert result["branches"][0]["name"] == "main"
assert result["branches"][0]["commit_hash"] == "abc123def456"
assert result["branches"][0]["commit_message"] == "Initial commit"
@patch("bitbucket_mcp.tools.branches.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_branches("nonexistent")
assert result["success"] is False
assert "not found" in result["error"]
class TestCreateBranch:
@patch("bitbucket_mcp.tools.branches.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, {
"name": "feature-x",
"target": {
"hash": "abc123",
"message": "Base commit"
}
})
result = create_branch("repo", "feature-x", "abc123")
assert result["success"] is True
assert result["name"] == "feature-x"
assert result["commit_hash"] == "abc123"
@patch("bitbucket_mcp.tools.branches.httpx.Client")
def test_bad_request(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(400, {
"error": {"message": "Branch already exists"}
})
result = create_branch("repo", "main", "abc123")
assert result["success"] is False
assert "Branch already exists" in result["error"]
class TestDeleteBranch:
@patch("bitbucket_mcp.tools.branches.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.delete.return_value = make_mock_response(204)
result = delete_branch("repo", "feature-x")
assert result["success"] is True
assert "deleted" in result["message"]
@patch("bitbucket_mcp.tools.branches.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.delete.return_value = make_mock_response(403)
result = delete_branch("repo", "main")
assert result["success"] is False
assert "Permission denied" in result["error"]
class TestListTags:
@patch("bitbucket_mcp.tools.branches.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": [
{
"name": "v1.0.0",
"target": {
"hash": "abc123",
"message": "Release 1.0",
"date": "2025-01-01",
"author": {"user": {"display_name": "Dev"}}
}
}
],
"size": 1, "page": 1, "pagelen": 25,
})
result = list_tags("repo")
assert result["success"] is True
assert len(result["tags"]) == 1
assert result["tags"][0]["name"] == "v1.0.0"
class TestCreateTag:
@patch("bitbucket_mcp.tools.branches.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, {
"name": "v2.0.0",
"target": {
"hash": "def456",
"message": "Release 2.0"
}
})
result = create_tag("repo", "v2.0.0", "def456")
assert result["success"] is True
assert result["name"] == "v2.0.0"
class TestDeleteTag:
@patch("bitbucket_mcp.tools.branches.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.delete.return_value = make_mock_response(204)
result = delete_tag("repo", "v1.0.0")
assert result["success"] is True
assert "deleted" in result["message"]
@patch("bitbucket_mcp.tools.branches.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.delete.return_value = make_mock_response(404)
result = delete_tag("repo", "nonexistent")
assert result["success"] is False
assert "not found" in result["error"]
class TestGetBranchingModel:
@patch("bitbucket_mcp.tools.branches.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, {
"branch_types": [
{"kind": "feature", "prefix": "feature/", "enabled": True},
{"kind": "bugfix", "prefix": "bugfix/", "enabled": True},
],
"development": {
"branch": {"name": "develop"},
"use_mainbranch": False,
},
"production": {
"branch": {"name": "main"},
}
})
result = get_branching_model("repo")
assert result["success"] is True
assert len(result["branch_types"]) == 2
assert result["development_branch"] == "develop"
assert result["production_branch"] == "main"