diff --git a/tests/test_request_cancel.py b/tests/test_request_cancel.py index eb8ce9b5..56610b2d 100644 --- a/tests/test_request_cancel.py +++ b/tests/test_request_cancel.py @@ -2,7 +2,7 @@ import pytest import asyncio import contextlib -from sanic.response import text +from sanic.response import text, stream async def test_request_cancel_when_connection_lost(loop, app, test_client): @@ -32,3 +32,42 @@ async def test_request_cancel_when_connection_lost(loop, app, test_client): await asyncio.sleep(1.0) assert app.still_serving_cancelled_request is False + + +async def test_stream_request_cancel_when_connection_lost(loop, app, test_client): + app.still_serving_cancelled_request = False + + @app.post('/post/', stream=True) + async def post(request, id): + assert isinstance(request.stream, asyncio.Queue) + + async def streaming(response): + while True: + body = await request.stream.get() + if body is None: + break + await response.write(body.decode('utf-8')) + + await asyncio.sleep(1.0) + # at this point client is already disconnected + app.still_serving_cancelled_request = True + + return stream(streaming) + + test_cli = await test_client(app) + + # schedule client call + task = loop.create_task(test_cli.post('/post/1')) + loop.call_later(0.01, task) + await asyncio.sleep(0.5) + + # cancelling request and closing connection after 0.5 sec + task.cancel() + + with contextlib.suppress(asyncio.CancelledError): + await task + + # Wait for server and check if it's still serving the cancelled request + await asyncio.sleep(1.0) + + assert app.still_serving_cancelled_request is False