Skip to content

Commit 9704f99

Browse files
Raise modeled errors
Modeled errors should be raised, this updates the event receiver to raise them.
1 parent cca5234 commit 9704f99

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

python-packages/aws-event-stream/aws_event_stream/_private/deserializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ async def receive(self) -> E | None:
4646
payload_codec=self._payload_codec,
4747
is_client_mode=self._is_client_mode,
4848
)
49-
return self._deserializer(deserializer)
49+
result = self._deserializer(deserializer)
50+
if isinstance(getattr(result, "value"), Exception):
51+
raise result.value # type: ignore
52+
return result
5053

5154
async def close(self) -> None:
5255
if (close := getattr(self._source, "close", None)) is not None:

python-packages/aws-event-stream/tests/unit/_private/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ def serialize_members(self, serializer: ShapeSerializer):
274274

275275

276276
@dataclass
277-
class ErrorEvent:
277+
class ErrorEvent(Exception):
278278
code: ClassVar[str] = "NoSuchResource"
279279
fault: ClassVar[Literal["client", "server"]] = "client"
280280

python-packages/aws-event-stream/tests/unit/_private/test_deserializers.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,53 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33
from io import BytesIO
4+
from typing import Any
45

56
import pytest
7+
from smithy_core.aio.types import AsyncBytesReader
68
from smithy_core.deserializers import DeserializeableShape
79
from smithy_json import JSONCodec
810

9-
from aws_event_stream._private.deserializers import EventDeserializer
11+
from aws_event_stream._private.deserializers import (
12+
AWSAsyncEventReceiver,
13+
EventDeserializer,
14+
)
1015
from aws_event_stream.events import Event, EventMessage
1116
from aws_event_stream.exceptions import UnmodeledEventError
1217

1318
from . import (
1419
EVENT_STREAM_SERDE_CASES,
1520
INITIAL_REQUEST_CASE,
1621
INITIAL_RESPONSE_CASE,
22+
ErrorEvent,
1723
EventStreamDeserializer,
24+
EventStreamErrorEvent,
1825
EventStreamOperationInputOutput,
1926
)
2027

2128

29+
@pytest.mark.parametrize("expected,given", EVENT_STREAM_SERDE_CASES)
30+
async def test_event_receiver(expected: DeserializeableShape, given: EventMessage):
31+
source = AsyncBytesReader(given.encode())
32+
deserializer = EventStreamDeserializer()
33+
receiver = AWSAsyncEventReceiver[Any](
34+
payload_codec=JSONCodec(), source=source, deserializer=deserializer.deserialize
35+
)
36+
37+
result: Any = None
38+
39+
try:
40+
result = await receiver.receive()
41+
except ErrorEvent as e:
42+
if isinstance(expected, EventStreamErrorEvent):
43+
expected = expected.value
44+
else:
45+
raise
46+
result = e
47+
48+
assert result == expected
49+
50+
2251
@pytest.mark.parametrize("expected,given", EVENT_STREAM_SERDE_CASES)
2352
def test_event_deserializer(expected: DeserializeableShape, given: EventMessage):
2453
source = Event.decode(BytesIO(given.encode()))

0 commit comments

Comments
 (0)