"""Tests for core server helpers and tool registration."""
import json
import os
import pytest
from bitbucket_mcp.server import load_config, save_config, get_auth, get_workspace, mcp
class TestLoadConfig:
def test_returns_empty_when_no_file(self):
assert load_config() == {}
def test_loads_existing_config(self, saved_config):
config = load_config()
assert config["workspace"] == "test-workspace"
assert config["username"] == "test@example.com"
assert config["token"] == "test-token-123"
class TestSaveConfig:
def test_creates_file_with_secure_permissions(self, mock_config):
config_dir, config_file = mock_config
save_config({"workspace": "ws", "username": "u", "token": "t"})
assert config_file.exists()
data = json.loads(config_file.read_text())
assert data["workspace"] == "ws"
# Check permissions (600)
mode = oct(config_file.stat().st_mode)[-3:]
assert mode == "600"
class TestGetAuth:
def test_raises_when_no_credentials(self):
with pytest.raises(ValueError, match="No Bitbucket credentials"):
get_auth()
def test_uses_config_file(self, saved_config):
auth = get_auth()
assert auth._auth_header is not None
def test_uses_env_vars(self, monkeypatch):
monkeypatch.setenv("BITBUCKET_API_TOKEN", "env-token")
monkeypatch.setenv("BITBUCKET_USERNAME", "env-user")
auth = get_auth()
assert auth._auth_header is not None
def test_parameter_overrides(self, saved_config):
auth = get_auth(token="override-token", username="override-user")
assert auth._auth_header is not None
class TestGetWorkspace:
def test_raises_when_no_workspace(self):
with pytest.raises(ValueError, match="No workspace specified"):
get_workspace()
def test_uses_config_file(self, saved_config):
assert get_workspace() == "test-workspace"
def test_uses_env_var(self, monkeypatch):
monkeypatch.setenv("BITBUCKET_WORKSPACE", "env-ws")
assert get_workspace() == "env-ws"
def test_parameter_overrides(self, saved_config):
assert get_workspace("override-ws") == "override-ws"
class TestToolRegistration:
def test_all_tools_registered(self):
tools = mcp._tool_manager._tools
assert len(tools) >= 79
def test_key_tools_present(self):
tools = mcp._tool_manager._tools
expected = [
"setup_bitbucket", "get_config_status",
"create_pull_request", "list_pull_requests", "get_pull_request",
"list_repositories", "get_repository", "create_repository",
"list_branches", "create_branch", "list_tags",
"list_commits", "get_commit",
"list_pipelines", "trigger_pipeline",
"list_workspaces", "search_code",
"get_current_user",
"list_issues", "create_issue",
"list_webhooks", "create_webhook",
"list_snippets", "create_snippet",
]
for name in expected:
assert name in tools, f"Tool '{name}' not registered"