Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,13 @@ on:
- "pyproject.toml"
- ".github/workflows/**"

# run on all pull requests because these checks are required and will block merges otherwise
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zzstoatzz the issue is that if someone opens a doc PR, these tests wont run and they're required to pass in order to merge (I can override, and do, but i wish there was a better way)

pull_request:
paths:
- "src/**"
- "tests/**"
- "uv.lock"
- "pyproject.toml"
- ".github/workflows/**"

workflow_dispatch:

Expand Down
13 changes: 9 additions & 4 deletions tests/client/auth/test_oauth_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,15 @@ def client_unauthorized(streamable_http_server: str) -> Client:
@pytest.fixture
def client_with_headless_oauth(streamable_http_server: str) -> Client:
"""Client with headless OAuth that bypasses browser interaction."""
return Client(
transport=StreamableHttpTransport(streamable_http_server),
auth=HeadlessOAuth(mcp_url=streamable_http_server),
)
# Expect warning about in-memory token storage
with pytest.warns(
UserWarning,
match="Using in-memory token storage is not recommended for production use",
):
return Client(
transport=StreamableHttpTransport(streamable_http_server),
auth=HeadlessOAuth(mcp_url=streamable_http_server),
)


async def test_unauthorized(client_unauthorized: Client):
Expand Down
42 changes: 34 additions & 8 deletions tests/client/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -968,26 +968,52 @@ def test_stdio_doesnt_support_auth(self):
Client(transport=StdioTransport("echo", ["hello"]), auth="oauth")

def test_oauth_literal_sets_up_oauth_shttp(self):
client = Client(
transport=StreamableHttpTransport("http://localhost:8000"), auth="oauth"
)
# Expect warning about in-memory token storage
with pytest.warns(
UserWarning,
match="Using in-memory token storage is not recommended for production use",
):
client = Client(
transport=StreamableHttpTransport("http://localhost:8000"), auth="oauth"
)
assert isinstance(client.transport, StreamableHttpTransport)
assert isinstance(client.transport.auth, OAuthClientProvider)

def test_oauth_literal_pass_direct_to_transport(self):
client = Client(
transport=StreamableHttpTransport("http://localhost:8000", auth="oauth"),
)
# Expect warning about in-memory token storage
with pytest.warns(
UserWarning,
match="Using in-memory token storage is not recommended for production use",
):
client = Client(
transport=StreamableHttpTransport(
"http://localhost:8000", auth="oauth"
),
)
assert isinstance(client.transport, StreamableHttpTransport)
assert isinstance(client.transport.auth, OAuthClientProvider)

def test_oauth_literal_sets_up_oauth_sse(self):
client = Client(transport=SSETransport("http://localhost:8000"), auth="oauth")
# Expect warning about in-memory token storage
with pytest.warns(
UserWarning,
match="Using in-memory token storage is not recommended for production use",
):
client = Client(
transport=SSETransport("http://localhost:8000"), auth="oauth"
)
assert isinstance(client.transport, SSETransport)
assert isinstance(client.transport.auth, OAuthClientProvider)

def test_oauth_literal_pass_direct_to_transport_sse(self):
client = Client(transport=SSETransport("http://localhost:8000", auth="oauth"))
# Expect warning about in-memory token storage
with pytest.warns(
UserWarning,
match="Using in-memory token storage is not recommended for production use",
):
client = Client(
transport=SSETransport("http://localhost:8000", auth="oauth")
)
assert isinstance(client.transport, SSETransport)
assert isinstance(client.transport.auth, OAuthClientProvider)

Expand Down
7 changes: 6 additions & 1 deletion tests/client/test_sse.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,12 @@ async def nested_sse_server():
from fastmcp.utilities.http import find_available_port

server = create_test_server()
sse_app = server.sse_app(path="/mcp/sse/", message_path="/mcp/messages")
# Expect deprecation warning for sse_app method
with pytest.warns(
DeprecationWarning,
match="The sse_app method is deprecated .* Use http_app as a modern .* alternative",
):
sse_app = server.sse_app(path="/mcp/sse/", message_path="/mcp/messages")

# Nest the app under multiple mounts to test URL resolution
inner = Starlette(routes=[Mount("/nest-inner", app=sse_app)])
Expand Down
7 changes: 6 additions & 1 deletion tests/test_mcp_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,12 @@ async def test_remote_config_with_oauth_literal():
}
}
}
client = Client(config)
# Expect warning about in-memory token storage
with pytest.warns(
UserWarning,
match="Using in-memory token storage is not recommended for production use",
):
client = Client(config)
assert isinstance(client.transport.transport, StreamableHttpTransport)
assert isinstance(client.transport.transport.auth, OAuthClientProvider)

Expand Down
Loading