"""Tests for webhook management tools."""
from unittest.mock import patch, MagicMock
from bitbucket_mcp.tools import webhooks as _mod
list_webhooks = _mod.list_webhooks.fn
create_webhook = _mod.create_webhook.fn
delete_webhook = _mod.delete_webhook.fn
list_workspace_webhooks = _mod.list_workspace_webhooks.fn
from tests.conftest import make_mock_response
class TestListWebhooks:
@patch("bitbucket_mcp.tools.webhooks.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": [
{
"uuid": "{hook-uuid}",
"url": "https://example.com/webhook",
"description": "CI hook",
"active": True,
"events": ["repo:push", "pullrequest:created"],
"created_at": "2025-01-01",
}
],
"size": 1, "page": 1, "pagelen": 25,
})
result = list_webhooks("repo")
assert result["success"] is True
assert len(result["webhooks"]) == 1
assert result["webhooks"][0]["url"] == "https://example.com/webhook"
assert "repo:push" in result["webhooks"][0]["events"]
@patch("bitbucket_mcp.tools.webhooks.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_webhooks("nonexistent")
assert result["success"] is False
assert "not found" in result["error"]
class TestCreateWebhook:
@patch("bitbucket_mcp.tools.webhooks.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, {
"uuid": "{new-hook}",
"url": "https://example.com/hook",
"description": "New hook",
"active": True,
"events": ["repo:push"],
})
result = create_webhook("repo", "https://example.com/hook", ["repo:push"], description="New hook")
assert result["success"] is True
assert result["url"] == "https://example.com/hook"
assert "Webhook created" in result["message"]
@patch("bitbucket_mcp.tools.webhooks.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_webhook("repo", "https://example.com/hook", ["repo:push"])
assert result["success"] is False
assert "Permission denied" in result["error"]
class TestDeleteWebhook:
@patch("bitbucket_mcp.tools.webhooks.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_webhook("repo", "hook-uuid")
assert result["success"] is True
assert "deleted" in result["message"]
@patch("bitbucket_mcp.tools.webhooks.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_webhook("repo", "nonexistent")
assert result["success"] is False
assert "not found" in result["error"]
@patch("bitbucket_mcp.tools.webhooks.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_webhook("repo", "hook-uuid")
assert result["success"] is False
assert "Permission denied" in result["error"]
class TestListWorkspaceWebhooks:
@patch("bitbucket_mcp.tools.webhooks.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": [
{
"uuid": "{ws-hook}",
"url": "https://example.com/ws-hook",
"description": "Workspace hook",
"active": True,
"events": ["repo:push"],
"created_at": "2025-01-01",
}
],
"size": 1, "page": 1, "pagelen": 25,
})
result = list_workspace_webhooks()
assert result["success"] is True
assert len(result["webhooks"]) == 1
assert result["webhooks"][0]["description"] == "Workspace hook"