Skip to content

Commit 0420e5b

Browse files
Restore final SSE test and CI workflow for GitHub Actions
1 parent 35917e3 commit 0420e5b

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

.github/workflows/test.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: Run SSE Test
2+
3+
on:
4+
push:
5+
branches:
6+
- sse-test-final
7+
pull_request:
8+
branches:
9+
- main
10+
11+
jobs:
12+
test:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- name: Checkout code
16+
uses: actions/checkout@v3
17+
18+
- name: Set up Python
19+
uses: actions/setup-python@v4
20+
with:
21+
python-version: '3.10'
22+
23+
- name: Install dependencies
24+
run: |
25+
python -m pip install --upgrade pip
26+
pip install -r tests/requirements-dev.txt
27+
28+
- name: Run tests
29+
run: |
30+
pytest tests/test_sse_client_server_hardened.py
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import asyncio
2+
from typing import AsyncGenerator, List
3+
4+
from fastapi import FastAPI
5+
from starlette.responses import StreamingResponse
6+
import uvicorn
7+
from threading import Thread
8+
import httpx
9+
from mcp.client.sse import aconnect_sse
10+
11+
app = FastAPI()
12+
13+
@app.get("/sse")
14+
async def sse_endpoint() -> StreamingResponse:
15+
async def event_stream() -> AsyncGenerator[str, None]:
16+
for i in range(3):
17+
yield f"data: Hello {i + 1}\n\n"
18+
await asyncio.sleep(0.1)
19+
return StreamingResponse(event_stream(), media_type="text/event-stream")
20+
21+
def run_mock_server() -> None:
22+
uvicorn.run(app, host="127.0.0.1", port=8012, log_level="warning")
23+
24+
async def run_test() -> None:
25+
server_thread = Thread(target=run_mock_server, daemon=True)
26+
server_thread.start()
27+
await asyncio.sleep(1)
28+
29+
messages: List[str] = []
30+
31+
async with httpx.AsyncClient() as client:
32+
async with aconnect_sse(client, "GET", "http://127.0.0.1:8012/sse") as event_source:
33+
async for event in event_source.aiter_sse():
34+
if event.data:
35+
print("Event received:", event.data)
36+
messages.append(event.data)
37+
if len(messages) == 3:
38+
break
39+
40+
assert messages == ["Hello 1", "Hello 2", "Hello 3"]
41+
print("\nTest passed! SSE connection via aconnect_sse worked correctly.")
42+
43+
def test_aconnect_sse_server_response() -> None:
44+
asyncio.run(run_test())

0 commit comments

Comments
 (0)