JIRA MCP Tools
by NZenitram
Verified
- mcp-jira
- tests
#!/usr/bin/env python3
"""Test the JIRA issue details retrieval tool with mocking."""
import unittest
from unittest.mock import patch, MagicMock
import logging
from src.tools.issues import get_issue_details
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(message)s')
logger = logging.getLogger(__name__)
class TestGetIssueDetails(unittest.TestCase):
"""Test cases for get_issue_details using mocks."""
def setUp(self):
"""Set up test fixtures before each test method."""
self.issue_key = "TEST-123"
# Mock issue fields
self.mock_fields = MagicMock()
self.mock_fields.summary = "Test Issue"
self.mock_fields.description = "Test Description"
self.mock_fields.created = "2024-03-21T10:00:00.000+0000"
self.mock_fields.updated = "2024-03-21T11:00:00.000+0000"
self.mock_fields.labels = ["bug", "high-priority"]
# Mock nested objects
self.mock_fields.status = MagicMock()
self.mock_fields.status.name = "In Progress"
self.mock_fields.issuetype = MagicMock()
self.mock_fields.issuetype.name = "Bug"
self.mock_fields.project = MagicMock()
self.mock_fields.project.key = "TEST"
self.mock_fields.project.name = "Test Project"
self.mock_fields.creator = MagicMock()
self.mock_fields.creator.displayName = "John Creator"
self.mock_fields.reporter = MagicMock()
self.mock_fields.reporter.displayName = "Jane Reporter"
self.mock_fields.assignee = MagicMock()
self.mock_fields.assignee.displayName = "Bob Assignee"
self.mock_fields.priority = MagicMock()
self.mock_fields.priority.name = "High"
# Mock comments
mock_comment = MagicMock()
mock_comment.id = "12345"
mock_comment.body = "Test comment"
mock_comment.author.displayName = "Comment Author"
mock_comment.created = "2024-03-21T12:00:00.000+0000"
mock_comment.updated = "2024-03-21T12:00:00.000+0000"
self.mock_fields.comment = MagicMock()
self.mock_fields.comment.comments = [mock_comment]
# Mock issue object
self.mock_issue = MagicMock()
self.mock_issue.key = self.issue_key
self.mock_issue.fields = self.mock_fields
# Mock JIRA client
self.mock_jira = MagicMock()
self.mock_jira._options = {'server': 'https://test-jira.atlassian.net'}
self.mock_jira.issue.return_value = self.mock_issue
# Mock transitions
self.mock_transitions = [
{'id': '2', 'name': 'In Progress'},
{'id': '3', 'name': 'Done'}
]
self.mock_jira.transitions.return_value = self.mock_transitions
@patch('src.tools.issues.initialize_jira')
def test_get_issue_details_success(self, mock_init_jira):
"""Test successful retrieval of issue details."""
# Set up mock
mock_init_jira.return_value = self.mock_jira
# Call the function
result = get_issue_details(self.issue_key)
# Verify JIRA client calls
mock_init_jira.assert_called_once()
self.mock_jira.issue.assert_called_once_with(self.issue_key)
self.mock_jira.transitions.assert_called_once_with(self.mock_issue)
# Verify response structure
self.assertEqual(result['status'], 'success')
self.assertEqual(result['message'], f'Retrieved details for issue {self.issue_key}')
details = result['details']
self.assertEqual(details['key'], self.issue_key)
self.assertEqual(details['summary'], "Test Issue")
self.assertEqual(details['description'], "Test Description")
self.assertEqual(details['status'], "In Progress")
self.assertEqual(details['issue_type'], "Bug")
self.assertEqual(details['project']['key'], "TEST")
self.assertEqual(details['project']['name'], "Test Project")
self.assertEqual(details['creator'], "John Creator")
self.assertEqual(details['reporter'], "Jane Reporter")
self.assertEqual(details['assignee'], "Bob Assignee")
self.assertEqual(details['priority'], "High")
self.assertEqual(details['labels'], ["bug", "high-priority"])
self.assertEqual(details['available_transitions'], ["In Progress", "Done"])
self.assertEqual(
details['url'],
f"https://test-jira.atlassian.net/browse/{self.issue_key}"
)
# Verify comments are not included by default
self.assertNotIn('comments', details)
logger.info(f"Successfully retrieved details for issue {self.issue_key}")
@patch('src.tools.issues.initialize_jira')
def test_get_issue_details_with_comments(self, mock_init_jira):
"""Test retrieval of issue details including comments."""
# Set up mock
mock_init_jira.return_value = self.mock_jira
# Call the function with include_comments=True
result = get_issue_details(self.issue_key, include_comments=True)
# Verify comments are included and correctly formatted
self.assertIn('comments', result['details'])
comments = result['details']['comments']
self.assertEqual(len(comments), 1)
self.assertEqual(comments[0]['id'], "12345")
self.assertEqual(comments[0]['body'], "Test comment")
self.assertEqual(comments[0]['author'], "Comment Author")
logger.info(f"Successfully retrieved issue details with comments for {self.issue_key}")
@patch('src.tools.issues.initialize_jira')
def test_get_issue_details_not_found(self, mock_init_jira):
"""Test retrieval of non-existent issue."""
# Set up mock to return None for non-existent issue
self.mock_jira.issue.return_value = None
mock_init_jira.return_value = self.mock_jira
# Verify that attempting to get non-existent issue raises ValueError
with self.assertRaises(ValueError) as context:
get_issue_details(self.issue_key)
self.assertEqual(str(context.exception), f"Issue {self.issue_key} not found")
logger.info("Successfully handled non-existent issue request")
if __name__ == '__main__':
unittest.main()