From a41531963d916d9d506c638e119bc4ac6049ea60 Mon Sep 17 00:00:00 2001 From: jell-o-fishi Date: Wed, 23 Nov 2022 12:55:27 +0200 Subject: [PATCH 1/3] added cli unit tests --- requirements.txt | 3 ++- tests/rsocket/test_cli_command.py | 45 ++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5050e7c1..17a43cdd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,4 +14,5 @@ reactivex==4.0.4 starlette==0.22.0 asyncclick==8.1.3.4 pytest-profiling==1.7.0 -pytest-xdist==3.0.2 \ No newline at end of file +pytest-xdist==3.0.2 +decoy==1.11.1 \ No newline at end of file diff --git a/tests/rsocket/test_cli_command.py b/tests/rsocket/test_cli_command.py index 642a0e4d..c948f109 100644 --- a/tests/rsocket/test_cli_command.py +++ b/tests/rsocket/test_cli_command.py @@ -3,13 +3,16 @@ import tempfile import pytest +from decoy import Decoy +from rsocket.awaitable.awaitable_rsocket import AwaitableRSocket from rsocket.cli.command import parse_uri, build_composite_metadata, create_request_payload, get_metadata_value, \ create_setup_payload, normalize_data, normalize_limit_rate, RequestType, get_request_type, parse_headers, \ - normalize_metadata_mime_type + normalize_metadata_mime_type, execute_request from rsocket.extensions.helpers import route, authenticate_simple, authenticate_bearer from rsocket.extensions.mimetypes import WellKnownMimeTypes from rsocket.frame import MAX_REQUEST_N +from rsocket.helpers import create_future from rsocket.payload import Payload from tests.rsocket.helpers import create_data @@ -175,3 +178,43 @@ def test_normalize_metadata_mime_type(composite_items, metadata_mime_type, expec actual = normalize_metadata_mime_type(composite_items, metadata_mime_type) assert actual == expected + + +async def test_execute_request_response(decoy: Decoy): + client = decoy.mock(cls=AwaitableRSocket) + + decoy.when(await client.request_response(Payload())).then_return(Payload(b'abc')) + + result = await execute_request(client, RequestType.response, 3, Payload()) + + assert result.data == b'abc' + + +async def test_execute_request_stream(decoy: Decoy): + client = decoy.mock(cls=AwaitableRSocket) + + decoy.when(await client.request_stream(Payload(), limit_rate=3)).then_return([Payload(b'abc')]) + + result = await execute_request(client, RequestType.stream, 3, Payload()) + + assert result[0].data == b'abc' + + +async def test_execute_request_channel(decoy: Decoy): + client = decoy.mock(cls=AwaitableRSocket) + + decoy.when(await client.request_channel(Payload(), limit_rate=3)).then_return([Payload(b'abc')]) + + result = await execute_request(client, RequestType.channel, 3, Payload()) + + assert result[0].data == b'abc' + + +async def test_execute_request_fnf(decoy: Decoy): + client = decoy.mock(cls=AwaitableRSocket) + + decoy.when(client.fire_and_forget(Payload())).then_return(create_future(None)) + + result = await execute_request(client, RequestType.fnf, 3, Payload()) + + assert result is None From 0182c77dda5a4fa6a039db70895a3b5714af4c52 Mon Sep 17 00:00:00 2001 From: jell-o-fishi Date: Wed, 23 Nov 2022 13:06:55 +0200 Subject: [PATCH 2/3] added unit test --- tests/rsocket/test_stream_helpers.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 tests/rsocket/test_stream_helpers.py diff --git a/tests/rsocket/test_stream_helpers.py b/tests/rsocket/test_stream_helpers.py new file mode 100644 index 00000000..901edaa7 --- /dev/null +++ b/tests/rsocket/test_stream_helpers.py @@ -0,0 +1,23 @@ +from asyncio import Queue + +from rsocket.streams.helpers import async_generator_from_queue + + +async def test_async_generator_from_queue(): + queue = Queue() + + for i in range(10): + queue.put_nowait(i) + + queue.put_nowait(None) + + async def collect(): + results = [] + async for i in async_generator_from_queue(queue): + results.append(i) + + return results + + r = await collect() + + assert r == list(range(10)) From c22b6da001e1f57a3098f62a7f52fcdfce81dafd Mon Sep 17 00:00:00 2001 From: jell-o-fishi Date: Wed, 23 Nov 2022 15:28:13 +0200 Subject: [PATCH 3/3] added unit tests. replace default response implementation with throwing exception not returning a future with an error --- rsocket/frame.py | 2 +- rsocket/reactivex/reactivex_handler.py | 4 +--- rsocket/request_handler.py | 3 +-- rsocket/rx_support/rx_handler.py | 4 +--- tests/rx_support/test_rx_handler.py | 17 +++++++++++++++++ tests/test_reactivex/test_reactivex_handler.py | 17 +++++++++++++++++ 6 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 tests/rx_support/test_rx_handler.py create mode 100644 tests/test_reactivex/test_reactivex_handler.py diff --git a/rsocket/frame.py b/rsocket/frame.py index a6146691..d9e987b8 100644 --- a/rsocket/frame.py +++ b/rsocket/frame.py @@ -726,7 +726,7 @@ def exception_to_error_frame(stream_id: int, exception: Exception) -> ErrorFrame frame.data = ensure_bytes(exception.data) else: frame.error_code = ErrorCode.APPLICATION_ERROR - frame.data = str(exception).encode() + frame.data = ensure_bytes(str(exception)) return frame diff --git a/rsocket/reactivex/reactivex_handler.py b/rsocket/reactivex/reactivex_handler.py index 671c3443..c2f5dbed 100644 --- a/rsocket/reactivex/reactivex_handler.py +++ b/rsocket/reactivex/reactivex_handler.py @@ -2,12 +2,10 @@ from datetime import timedelta from typing import Optional, Union, Callable -import reactivex from reactivex import Observable, Subject from rsocket.error_codes import ErrorCode from rsocket.extensions.composite_metadata import CompositeMetadata -from rsocket.helpers import create_error_future from rsocket.logger import logger from rsocket.payload import Payload from rsocket.reactivex.reactivex_channel import ReactivexChannel @@ -82,7 +80,7 @@ async def request_fire_and_forget(self, payload: Payload): """The requester isn't listening for errors. Nothing to do.""" async def request_response(self, payload: Payload) -> Observable: - return reactivex.from_future(create_error_future(RuntimeError('Not implemented'))) + raise RuntimeError('Not implemented') async def request_stream(self, payload: Payload) -> Observable: raise RuntimeError('Not implemented') diff --git a/rsocket/request_handler.py b/rsocket/request_handler.py index c3329723..087205d0 100644 --- a/rsocket/request_handler.py +++ b/rsocket/request_handler.py @@ -7,7 +7,6 @@ from reactivestreams.subscriber import Subscriber from rsocket.error_codes import ErrorCode from rsocket.extensions.composite_metadata import CompositeMetadata -from rsocket.helpers import create_error_future from rsocket.local_typing import Awaitable from rsocket.logger import logger from rsocket.payload import Payload @@ -90,7 +89,7 @@ async def on_metadata_push(self, payload: Payload): """Nothing by default""" async def request_response(self, payload: Payload) -> Awaitable[Payload]: - return create_error_future(RuntimeError('Not implemented')) + raise RuntimeError('Not implemented') async def request_stream(self, payload: Payload) -> Publisher: raise RuntimeError('Not implemented') diff --git a/rsocket/rx_support/rx_handler.py b/rsocket/rx_support/rx_handler.py index 460b1c5a..dbaf1fc5 100644 --- a/rsocket/rx_support/rx_handler.py +++ b/rsocket/rx_support/rx_handler.py @@ -2,13 +2,11 @@ from datetime import timedelta from typing import Optional, Union, Callable -import rx from rx import Observable from rx.core.typing import Subject from rsocket.error_codes import ErrorCode from rsocket.extensions.composite_metadata import CompositeMetadata -from rsocket.helpers import create_error_future from rsocket.logger import logger from rsocket.payload import Payload from rsocket.rx_support.rx_channel import RxChannel @@ -83,7 +81,7 @@ async def request_fire_and_forget(self, payload: Payload): """The requester isn't listening for errors. Nothing to do.""" async def request_response(self, payload: Payload) -> Observable: - return rx.from_future(create_error_future(RuntimeError('Not implemented'))) + raise RuntimeError('Not implemented') async def request_stream(self, payload: Payload) -> Observable: raise RuntimeError('Not implemented') diff --git a/tests/rx_support/test_rx_handler.py b/tests/rx_support/test_rx_handler.py new file mode 100644 index 00000000..ef39295a --- /dev/null +++ b/tests/rx_support/test_rx_handler.py @@ -0,0 +1,17 @@ +import pytest + +from rsocket.payload import Payload +from rsocket.rx_support.rx_handler import BaseRxHandler + + +async def test_rx_handler(): + handler = BaseRxHandler() + + with pytest.raises(Exception): + await handler.request_channel(Payload()) + + with pytest.raises(Exception): + await handler.request_response(Payload()) + + with pytest.raises(Exception): + await handler.request_channel(Payload()) diff --git a/tests/test_reactivex/test_reactivex_handler.py b/tests/test_reactivex/test_reactivex_handler.py new file mode 100644 index 00000000..2da801bb --- /dev/null +++ b/tests/test_reactivex/test_reactivex_handler.py @@ -0,0 +1,17 @@ +import pytest + +from rsocket.payload import Payload +from rsocket.reactivex.reactivex_handler import BaseReactivexHandler + + +async def test_reactivex_handler(): + handler = BaseReactivexHandler() + + with pytest.raises(Exception): + await handler.request_channel(Payload()) + + with pytest.raises(Exception): + await handler.request_response(Payload()) + + with pytest.raises(Exception): + await handler.request_channel(Payload())