"""Tests for deprecated functionality.""" import warnings from unittest.mock import AsyncMock, patch import pytest from starlette.applications import Starlette from fastmcp import Client, FastMCP def test_fastmcp_kwargs_settings_deprecation_warning(): """Test that passing settings as kwargs to FastMCP raises a deprecation warning.""" with pytest.warns( DeprecationWarning, match="Passing runtime and transport-specific settings as kwargs to the FastMCP constructor is deprecated", ): server = FastMCP("TestServer", host="127.0.0.2", port=8001) assert server.settings.host == "127.0.0.2" assert server.settings.port == 8001 def test_sse_app_deprecation_warning(): """Test that sse_app raises a deprecation warning.""" server = FastMCP("TestServer") with pytest.warns(DeprecationWarning, match="The sse_app method is deprecated"): app = server.sse_app() assert isinstance(app, Starlette) def test_streamable_http_app_deprecation_warning(): """Test that streamable_http_app raises a deprecation warning.""" server = FastMCP("TestServer") with pytest.warns( DeprecationWarning, match="The streamable_http_app method is deprecated" ): app = server.streamable_http_app() assert isinstance(app, Starlette) @pytest.mark.asyncio async def test_run_sse_async_deprecation_warning(): """Test that run_sse_async raises a deprecation warning.""" server = FastMCP("TestServer") # Use patch to avoid actually running the server with patch.object(server, "run_http_async", new_callable=AsyncMock) as mock_run: with pytest.warns( DeprecationWarning, match="The run_sse_async method is deprecated" ): await server.run_sse_async() # Verify the mock was called with the right transport mock_run.assert_called_once() call_kwargs = mock_run.call_args.kwargs assert call_kwargs.get("transport") == "sse" @pytest.mark.asyncio async def test_run_streamable_http_async_deprecation_warning(): """Test that run_streamable_http_async raises a deprecation warning.""" server = FastMCP("TestServer") # Use patch to avoid actually running the server with patch.object(server, "run_http_async", new_callable=AsyncMock) as mock_run: with pytest.warns( DeprecationWarning, match="The run_streamable_http_async method is deprecated", ): await server.run_streamable_http_async() # Verify the mock was called with the right transport mock_run.assert_called_once() call_kwargs = mock_run.call_args.kwargs assert call_kwargs.get("transport") == "streamable-http" def test_http_app_with_sse_transport(): """Test that http_app with SSE transport works (no warning).""" server = FastMCP("TestServer") # This should not raise a warning since we're using the new API with warnings.catch_warnings(record=True) as recorded_warnings: app = server.http_app(transport="sse") assert isinstance(app, Starlette) # Verify no deprecation warnings were raised for using transport parameter deprecation_warnings = [ w for w in recorded_warnings if issubclass(w.category, DeprecationWarning) ] assert len(deprecation_warnings) == 0 def test_from_client_deprecation_warning(): """Test that FastMCP.from_client raises a deprecation warning.""" server = FastMCP("TestServer") with pytest.warns(DeprecationWarning, match="from_client"): FastMCP.from_client(Client(server))