# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """Test MCP app imports and tool/prompt registration.""" def test_mcp_app_imports_successfully(): """Test that the MCP app can be imported without errors.""" from superset.mcp_service.app import mcp assert mcp is not None assert hasattr(mcp, "_tool_manager") tools = mcp._tool_manager._tools assert len(tools) > 0 assert "health_check" in tools assert "list_charts" in tools def test_mcp_prompts_registered(): """Test that MCP prompts are registered.""" from superset.mcp_service.app import mcp prompts = mcp._prompt_manager._prompts assert len(prompts) > 0 def test_mcp_resources_registered(): """Test that MCP resources are registered. Resources are registered via @mcp.resource() decorators in resource files. They require __init__.py in parent packages for find_packages() to include them in distributions. This test ensures all expected resources are found. """ from superset.mcp_service.app import mcp resource_manager = mcp._resource_manager resources = resource_manager._resources assert len(resources) > 0, "No MCP resources registered" # Verify the two documented resources are registered resource_uris = set(resources.keys()) assert "chart://configs" in resource_uris, ( "chart://configs resource not registered - " "check superset/mcp_service/chart/__init__.py exists" ) assert "instance://metadata" in resource_uris, ( "instance://metadata resource not registered - " "check superset/mcp_service/system/resources/ imports" ) def test_mcp_packages_discoverable_by_setuptools(): """Test that all MCP sub-packages have __init__.py for setuptools. setuptools.find_packages() only discovers directories with __init__.py. Without __init__.py, sub-packages (tool, resources, prompts) are excluded from built distributions, causing missing module errors in deployments. """ from pathlib import Path mcp_root = Path(__file__).parents[3] / "superset" / "mcp_service" assert mcp_root.is_dir(), f"MCP service root not found: {mcp_root}" # All immediate sub-directories that contain Python files should be packages missing = [] for subdir in sorted(mcp_root.iterdir()): if not subdir.is_dir() or subdir.name.startswith(("_", ".")): continue # Check if it has any .py files in it or its subdirectories has_py = any(subdir.rglob("*.py")) if has_py and not (subdir / "__init__.py").exists(): missing.append(subdir.name) assert not missing, ( f"MCP sub-packages missing __init__.py (will be excluded from " f"setuptools distributions): {missing}" )