ServiceNow MCP Server

by osomai
Verified
""" 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()
ID: wfdzusqbvb