From 3bf335fa8d22e2909f6c3c211cf88b48085c8adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=80=AC=E3=81=93=E3=81=93=E3=81=82?= Date: Mon, 8 Jul 2024 23:54:44 +0900 Subject: [PATCH 1/2] Update ci.yml --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14c0f07..10d09df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt + pip install . + pip install uvicorn[standard] httpx pytest pytest-asyncio - name: Run tests run: | @@ -76,4 +77,4 @@ jobs: ...context.repo, issue_number: context.issue.number, body: `### Ruff Linter Failed\n
\nOutput (Click To Expand): \n\n\`\`\`\n${ruffOutput}\n\`\`\`\n
` - }) \ No newline at end of file + }) From 54a65f3998505de0b1a7d4efc6060f669d5ab727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=80=AC=E3=81=93=E3=81=93=E3=81=82?= Date: Mon, 8 Jul 2024 23:55:07 +0900 Subject: [PATCH 2/2] Create test_websocket.py --- tests/test_websocket.py | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/test_websocket.py diff --git a/tests/test_websocket.py b/tests/test_websocket.py new file mode 100644 index 0000000..0d6224e --- /dev/null +++ b/tests/test_websocket.py @@ -0,0 +1,57 @@ +from multiprocessing import Process +import socket +import random +import time + +import pytest +import uvicorn +from kasumi import Kasumi, WebSocket +from kasumi.exceptions import ConnectionClosed +from websockets.client import connect +from websockets.exceptions import ConnectionClosedError + +app = Kasumi() + +def is_port_in_use(port: int) -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + return s.connect_ex(('localhost', port)) == 0 + +def get_random_port() -> int: + while True: + port = random.randint(1024, 65535) + if not is_port_in_use(port): + return port + +port = get_random_port() + +@app.ws("/ws") +async def websocket_endpoint(websocket: WebSocket): + await websocket.accept() + try: + while True: + data = await websocket.recv() + if data: + await websocket.send_str(f"Message text was: {data.text}") + except ConnectionClosed: + pass + +@pytest.fixture(scope="module") +def uvicorn_server(): + config = uvicorn.Config(app, host="127.0.0.1", port=port, log_level="info") + server = uvicorn.Server(config) + process = Process(target=server.run) + process.start() + time.sleep(1) + yield + process.terminate() + process.join() + +@pytest.mark.asyncio +async def test_websocket(uvicorn_server): + try: + async with connect(f"ws://127.0.0.1:{port}/ws") as websocket: + await websocket.send("Hello, WebSocket!") + response = await websocket.recv() + assert response == "Message text was: Hello, WebSocket!" + except ConnectionClosedError: + pass