Skip to content

Commit 7fa2ec7

Browse files
committed
mypy
1 parent ba7467a commit 7fa2ec7

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

services/web/server/src/simcore_service_webserver/exception_handling_base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ async def __aexit__(
112112
return True # suppress
113113
return False # reraise
114114

115-
def get_response(self):
115+
def get_response(self) -> web.Response | None:
116116
return self._response
117117

118118

@@ -126,7 +126,7 @@ def exception_handling_decorator(
126126

127127
def _decorator(handler: WebHandler):
128128
@functools.wraps(handler)
129-
async def _wrapper(request: web.Request) -> web.StreamResponse:
129+
async def _wrapper(request: web.Request):
130130
cm = ExceptionHandlingContextManager(
131131
exception_handlers_map, request=request
132132
)

services/web/server/src/simcore_service_webserver/exception_handling_factory.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from aiohttp import web
55
from common_library.error_codes import create_error_code
66
from common_library.json_serialization import json_dumps
7-
from models_library.basic_types import IDStr
87
from models_library.rest_error import ErrorGet
98
from servicelib.aiohttp.web_exceptions_extension import get_all_aiohttp_http_exceptions
109
from servicelib.logging_errors import create_troubleshotting_log_kwargs
@@ -81,7 +80,7 @@ async def _exception_handler(
8180
_DefaultDict(getattr(exception, "__dict__", {}))
8281
)
8382

84-
error = ErrorGet(message=user_msg)
83+
error = ErrorGet.model_construct(message=user_msg)
8584

8685
if is_5xx_server_error(status_code):
8786
oec = create_error_code(exception)
@@ -98,7 +97,7 @@ async def _exception_handler(
9897
},
9998
)
10099
)
101-
error = ErrorGet(message=user_msg, support_id=IDStr(oec))
100+
error = ErrorGet.model_construct(message=user_msg, support_id=oec)
102101

103102
return create_error_response(error, status_code=status_code)
104103

services/web/server/tests/unit/isolated/test_exception_handling.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
exception_handling_decorator,
1818
to_exceptions_handlers_map,
1919
)
20+
from simcore_service_webserver.exception_handling_base import (
21+
exception_handling_middleware,
22+
)
2023

2124

2225
@pytest.fixture
@@ -114,3 +117,42 @@ async def _handler(request: web.Request):
114117
# undhandled HTTPSuccess
115118
resp = await client.get("/HTTPOk")
116119
assert resp.status == status.HTTP_200_OK
120+
121+
122+
@pytest.mark.parametrize("build_method", ["custom", "http_map"])
123+
async def test_handling_exceptions_with_middelware(
124+
aiohttp_client: Callable,
125+
exception_handlers_map: ExceptionHandlersMap,
126+
build_method: str,
127+
):
128+
# adding new routes
129+
routes = web.RouteTableDef()
130+
131+
@routes.get("/{what}") # NO decorantor now
132+
async def _handler(request: web.Request):
133+
match request.match_info["what"]:
134+
case "ValueError":
135+
raise ValueError # handled
136+
return web.Response()
137+
138+
app = web.Application()
139+
app.add_routes(routes)
140+
141+
# 1. create & install middleware
142+
exc_handling = exception_handling_middleware(exception_handlers_map)
143+
app.middlewares.append(exc_handling)
144+
145+
# 2. testing from the client side
146+
client = await aiohttp_client(app)
147+
148+
# success
149+
resp = await client.get("/ok")
150+
assert resp.status == status.HTTP_200_OK
151+
152+
# handled non-HTTPException exception
153+
resp = await client.get("/ValueError")
154+
assert resp.status == status.HTTP_422_UNPROCESSABLE_ENTITY
155+
if build_method == "http_map":
156+
body = await resp.json()
157+
error = ErrorGet.model_validate(body["error"])
158+
assert error.message == f"{build_method=}"

0 commit comments

Comments
 (0)