test_server.py•8.53 kB
"""
Tests for the main server functionality.
"""
from unittest.mock import AsyncMock, Mock, patch
import pytest
from src.mcp_server_jira.server import JiraProjectResult, JiraServer
class TestJiraServer:
    """Test suite for JiraServer class"""
    def test_init_with_credentials(self):
        """Test JiraServer initialization with credentials"""
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="token",
            username="testuser",
            token="testtoken",
        )
        assert server.server_url == "https://test.atlassian.net"
        assert server.auth_method == "token"
        assert server.username == "testuser"
        assert server.token == "testtoken"
    @patch.object(JiraServer, "_get_v3_api_client")
    def test_get_jira_projects(self, mock_get_v3_api_client):
        """Test getting Jira projects using v3 API"""
        # Setup mock v3 client
        mock_v3_client = Mock()
        mock_v3_client.get_projects.return_value = {
            "startAt": 0,
            "maxResults": 50,
            "total": 1,
            "isLast": True,
            "values": [
                {
                    "id": "123",
                    "key": "TEST",
                    "name": "Test Project",
                    "lead": {
                        "displayName": "John Doe"
                    }
                }
            ]
        }
        mock_get_v3_api_client.return_value = mock_v3_client
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="token",
            username="testuser",
            token="testtoken",
        )
        # Call the method
        projects = server.get_jira_projects()
        # Verify results
        assert len(projects) == 1
        assert isinstance(projects[0], JiraProjectResult)
        assert projects[0].key == "TEST"
        assert projects[0].name == "Test Project"
        assert projects[0].id == "123"
        assert projects[0].lead == "John Doe"
        # Verify v3 client was called correctly
        mock_v3_client.get_projects.assert_called_with(
            start_at=0,
            max_results=50
        )
    @patch.object(JiraServer, "_get_v3_api_client")
    def test_get_jira_projects_pagination(self, mock_get_v3_api_client):
        """Test getting Jira projects with pagination"""
        # Setup mock v3 client with pagination
        mock_v3_client = Mock()
        
        # First page response
        page1_response = {
            "startAt": 0,
            "maxResults": 2,
            "total": 3,
            "isLast": False,
            "values": [
                {"id": "10000", "key": "TEST1", "name": "Test Project 1"},
                {"id": "10001", "key": "TEST2", "name": "Test Project 2"}
            ]
        }
        
        # Second page response  
        page2_response = {
            "startAt": 2,
            "maxResults": 2,
            "total": 3,
            "isLast": True,
            "values": [
                {"id": "10002", "key": "TEST3", "name": "Test Project 3"}
            ]
        }
        
        # Configure mock to return different responses for each call
        mock_v3_client.get_projects.side_effect = [page1_response, page2_response]
        mock_get_v3_api_client.return_value = mock_v3_client
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="token",
            username="testuser",
            token="testtoken",
        )
        # Call the method
        projects = server.get_jira_projects()
        # Should have called get_projects twice due to pagination
        assert mock_v3_client.get_projects.call_count == 2
        
        # Should have collected all 3 projects
        assert len(projects) == 3
        assert projects[0].key == "TEST1"
        assert projects[1].key == "TEST2"
        assert projects[2].key == "TEST3"
        
        # Verify correct pagination parameters
        calls = mock_v3_client.get_projects.call_args_list
        assert calls[0][1]["start_at"] == 0
        assert calls[1][1]["start_at"] == 2
    @patch.object(JiraServer, "_get_v3_api_client")
    def test_create_jira_project_v3_api(self, mock_get_v3_api_client):
        """Test project creation using v3 API"""
        # Setup mock v3 client
        mock_v3_client = Mock()
        mock_v3_client.create_project.return_value = {
            "self": "https://test.atlassian.net/rest/api/3/project/10000",
            "id": "10000",
            "key": "TEST",
            "name": "Test Project",
        }
        mock_get_v3_api_client.return_value = mock_v3_client
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="token",
            username="testuser",
            token="testtoken",
        )
        # Call the method
        result = server.create_jira_project(
            key="TEST", name="Test Project", ptype="software"
        )
        # Verify results
        assert isinstance(result, JiraProjectResult)
        assert result.key == "TEST"
        assert result.name == "Test Project"
        # Verify v3 client was called correctly
        mock_v3_client.create_project.assert_called_once_with(
            key="TEST",
            name="Test Project",
            assignee=None,
            ptype="software",
            template_name=None,
            avatarId=None,
            issueSecurityScheme=None,
            permissionScheme=None,
            projectCategory=None,
            notificationScheme=None,
            categoryId=None,
            url="",
        )
    @patch.object(JiraServer, "_get_v3_api_client")
    def test_create_jira_project_with_template(self, mock_get_v3_api_client):
        """Test project creation with template using v3 API"""
        # Setup mock v3 client
        mock_v3_client = Mock()
        mock_v3_client.create_project.return_value = {
            "self": "https://test.atlassian.net/rest/api/3/project/10000",
            "id": "10000",
            "key": "TEMP",
            "name": "Template Project",
        }
        mock_get_v3_api_client.return_value = mock_v3_client
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="token",
            username="testuser",
            token="testtoken",
        )
        # Call the method with template
        result = server.create_jira_project(
            key="TEMP",
            name="Template Project",
            ptype="business",
            template_name="com.atlassian.jira-core-project-templates:jira-core-project-management",
            assignee="user123",
        )
        # Verify results
        assert isinstance(result, JiraProjectResult)
        assert result.key == "TEMP"
        assert result.name == "Template Project"
        # Verify v3 client was called with template parameters
        mock_v3_client.create_project.assert_called_once_with(
            key="TEMP",
            name="Template Project",
            assignee="user123",
            ptype="business",
            template_name="com.atlassian.jira-core-project-templates:jira-core-project-management",
            avatarId=None,
            issueSecurityScheme=None,
            permissionScheme=None,
            projectCategory=None,
            notificationScheme=None,
            categoryId=None,
            url="",
        )
    def test_get_v3_api_client(self):
        """Test v3 client creation"""
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="token",
            username="testuser",
            token="testtoken",
        )
        client = server._get_v3_api_client()
        assert client.server_url == "https://test.atlassian.net"
        assert client.username == "testuser"
        assert client.token == "testtoken"
        assert client.password is None
    def test_get_v3_api_client_with_password(self):
        """Test v3 client creation with password"""
        server = JiraServer(
            server_url="https://test.atlassian.net",
            auth_method="basic",
            username="testuser",
            password="testpass",
        )
        client = server._get_v3_api_client()
        assert client.server_url == "https://test.atlassian.net"
        assert client.username == "testuser"
        assert client.password == "testpass"
        assert client.token is None