11from __future__ import annotations
22
33import contextvars
4+ import sys
45from collections .abc import AsyncGenerator , AsyncIterator , Generator
56from contextlib import AsyncExitStack
67from pathlib import Path
2223from starlette .websockets import WebSocket
2324from tests .types import TestClientFactory
2425
26+ if sys .version_info < (3 , 11 ): # pragma: no cover
27+ from exceptiongroup import ExceptionGroup
28+
2529
2630class CustomMiddleware (BaseHTTPMiddleware ):
2731 async def dispatch (
@@ -42,6 +46,10 @@ def exc(request: Request) -> None:
4246 raise Exception ("Exc" )
4347
4448
49+ def exc_group (request : Request ) -> None :
50+ raise ExceptionGroup ("my exception group" , [ValueError ("TEST" )])
51+
52+
4553def exc_stream (request : Request ) -> StreamingResponse :
4654 return StreamingResponse (_generate_faulty_stream ())
4755
@@ -77,6 +85,7 @@ async def websocket_endpoint(session: WebSocket) -> None:
7785 routes = [
7886 Route ("/" , endpoint = homepage ),
7987 Route ("/exc" , endpoint = exc ),
88+ Route ("/exc-group" , endpoint = exc_group ),
8089 Route ("/exc-stream" , endpoint = exc_stream ),
8190 Route ("/no-response" , endpoint = NoResponse ),
8291 WebSocketRoute ("/ws" , endpoint = websocket_endpoint ),
@@ -90,13 +99,18 @@ def test_custom_middleware(test_client_factory: TestClientFactory) -> None:
9099 response = client .get ("/" )
91100 assert response .headers ["Custom-Header" ] == "Example"
92101
93- with pytest .raises (Exception ) as ctx :
102+ with pytest .raises (Exception ) as ctx1 :
94103 response = client .get ("/exc" )
95- assert str (ctx .value ) == "Exc"
104+ assert str (ctx1 .value ) == "Exc"
96105
97- with pytest .raises (Exception ) as ctx :
106+ with pytest .raises (Exception ) as ctx2 :
98107 response = client .get ("/exc-stream" )
99- assert str (ctx .value ) == "Faulty Stream"
108+ assert str (ctx2 .value ) == "Faulty Stream"
109+
110+ with pytest .raises (ExceptionGroup , match = "my exception group" ) as ctx3 :
111+ client .get ("/exc-group" )
112+ assert len (ctx3 .value .exceptions ) == 1
113+ assert isinstance (ctx3 .value .exceptions [0 ], ValueError )
100114
101115 with pytest .raises (RuntimeError ):
102116 response = client .get ("/no-response" )
0 commit comments