debug launch config

This commit is contained in:
John Lancaster
2026-08-29 21:06:02 -05:00
parent de95477480
commit c31a78206f
12 changed files with 207 additions and 49 deletions
+47
View File
@@ -0,0 +1,47 @@
import socket
import sys
from collections.abc import Iterator
import pytest
from xprocess import ProcessStarter
from xprocess import XProcess
SERVER_HOST = "127.0.0.1"
@pytest.fixture
def fastapi_server_url(xprocess: XProcess, unused_tcp_port: int) -> Iterator[str]:
class ServerStarter(ProcessStarter):
timeout = 10
terminate_on_interrupt = True
@property
def args(self) -> list[str]:
return [
sys.executable,
"-m",
"uvicorn",
"personal_mcp.app:create_app",
"--factory",
"--host",
SERVER_HOST,
"--port",
str(unused_tcp_port),
"--log-level",
"warning",
"--no-access-log",
]
def startup_check(self) -> bool:
try:
with socket.create_connection((SERVER_HOST, unused_tcp_port), timeout=0.1):
return True
except OSError:
return False
process_name = f"personal-mcp-http-{unused_tcp_port}"
xprocess.ensure(process_name, ServerStarter)
try:
yield f"http://{SERVER_HOST}:{unused_tcp_port}/mcp"
finally:
xprocess.getinfo(process_name).terminate()
+11
View File
@@ -0,0 +1,11 @@
import pytest
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport
from test_stdio import assert_server_contract
@pytest.mark.integration
async def test_fastapi_server_enumerates_and_reads_content(fastapi_server_url: str) -> None:
transport = StreamableHttpTransport(fastapi_server_url)
async with Client(transport) as client:
await assert_server_contract(client)
+40
View File
@@ -0,0 +1,40 @@
import sys
from pathlib import Path
import pytest
from fastmcp import Client
from fastmcp.client.transports import StdioTransport
from mcp_types import TextResourceContents
async def assert_server_contract(client: Client) -> None:
resources = {str(resource.uri) for resource in await client.list_resources()}
templates = {str(template.uri_template) for template in await client.list_resource_templates()}
prompts = {prompt.name for prompt in await client.list_prompts()}
assert await client.list_tools() == []
assert "skill://pytesting/SKILL.md" in resources
assert "resource://docs/{path*}" in templates
assert "skill://pytesting/{path*}" in templates
assert "pytest-fill-scaffold" in prompts
skill_content = await client.read_resource("skill://pytesting/SKILL.md")
docs_content = await client.read_resource("resource://docs/index.md")
assert isinstance(skill_content[0], TextResourceContents)
assert "# Pytesting" in skill_content[0].text
assert isinstance(docs_content[0], TextResourceContents)
assert '"format": "markdown"' in docs_content[0].text
@pytest.mark.integration
async def test_stdio_server_enumerates_and_reads_content() -> None:
transport = StdioTransport(
command=sys.executable,
args=["-m", "personal_mcp.mcp"],
cwd=str(Path(__file__).parent.parent),
keep_alive=False,
)
async with Client(transport) as client:
await assert_server_contract(client)