We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/echelon-ai-labs/servicenow-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
"""
Tests for the ServiceNow MCP server integration with catalog functionality.
"""
import unittest
from unittest.mock import MagicMock, patch
from servicenow_mcp.server import ServiceNowMCP
from servicenow_mcp.tools.catalog_tools import (
GetCatalogItemParams,
ListCatalogCategoriesParams,
ListCatalogItemsParams,
)
from servicenow_mcp.tools.catalog_tools import (
get_catalog_item as get_catalog_item_tool,
)
from servicenow_mcp.tools.catalog_tools import (
list_catalog_categories as list_catalog_categories_tool,
)
from servicenow_mcp.tools.catalog_tools import (
list_catalog_items as list_catalog_items_tool,
)
class TestServerCatalog(unittest.TestCase):
"""Test cases for the server integration with catalog functionality."""
def setUp(self):
"""Set up test fixtures."""
# Create a mock config
self.config = {
"instance_url": "https://example.service-now.com",
"auth": {
"type": "basic",
"basic": {
"username": "admin",
"password": "password",
},
},
}
# Create a mock server
self.server = ServiceNowMCP(self.config)
# Mock the FastMCP server
self.server.mcp_server = MagicMock()
self.server.mcp_server.resource = MagicMock()
self.server.mcp_server.tool = MagicMock()
def test_register_catalog_resources(self):
"""Test that catalog resources are registered correctly."""
# Call the method to register resources
self.server._register_resources()
# Check that the resource decorators were called
resource_calls = self.server.mcp_server.resource.call_args_list
resource_paths = [call[0][0] for call in resource_calls]
# Check that catalog resources are registered
self.assertIn("catalog://items", resource_paths)
self.assertIn("catalog://categories", resource_paths)
self.assertIn("catalog://{item_id}", resource_paths)
def test_register_catalog_tools(self):
"""Test that catalog tools are registered correctly."""
# Call the method to register tools
self.server._register_tools()
# Check that the tool decorator was called
self.server.mcp_server.tool.assert_called()
# Get the tool functions
tool_calls = self.server.mcp_server.tool.call_args_list
# Instead of trying to extract names from the call args, just check that the decorator was called
# the right number of times (at least 3 times for the catalog tools)
self.assertGreaterEqual(len(tool_calls), 3)
@patch("servicenow_mcp.tools.catalog_tools.list_catalog_items")
def test_list_catalog_items_tool(self, mock_list_catalog_items):
"""Test the list_catalog_items tool."""
# Mock the tool function
mock_list_catalog_items.return_value = {
"success": True,
"message": "Retrieved 1 catalog items",
"items": [
{
"sys_id": "item1",
"name": "Laptop",
}
],
}
# Register the tools
self.server._register_tools()
# Check that the tool decorator was called
self.server.mcp_server.tool.assert_called()
@patch("servicenow_mcp.tools.catalog_tools.get_catalog_item")
def test_get_catalog_item_tool(self, mock_get_catalog_item):
"""Test the get_catalog_item tool."""
# Mock the tool function
mock_get_catalog_item.return_value = {
"success": True,
"message": "Retrieved catalog item: Laptop",
"data": {
"sys_id": "item1",
"name": "Laptop",
},
}
# Register the tools
self.server._register_tools()
# Check that the tool decorator was called
self.server.mcp_server.tool.assert_called()
@patch("servicenow_mcp.tools.catalog_tools.list_catalog_categories")
def test_list_catalog_categories_tool(self, mock_list_catalog_categories):
"""Test the list_catalog_categories tool."""
# Mock the tool function
mock_list_catalog_categories.return_value = {
"success": True,
"message": "Retrieved 1 catalog categories",
"categories": [
{
"sys_id": "cat1",
"title": "Hardware",
}
],
}
# Register the tools
self.server._register_tools()
# Check that the tool decorator was called
self.server.mcp_server.tool.assert_called()
if __name__ == "__main__":
unittest.main()