@@ -247,6 +247,49 @@ async def generator() -> AsyncGenerator[str, None]:
247247 assert span .ended == 1
248248
249249
250+ @pytest .mark .asyncio
251+ async def test_async_generator_wrapper_fallback_preserves_context (
252+ monkeypatch : pytest .MonkeyPatch ,
253+ ) -> None :
254+ marker = contextvars .ContextVar ("marker" , default = "ambient" )
255+ seen : list [str ] = []
256+ original_create_task = asyncio .create_task
257+
258+ def create_task_with_type_error (* args : Any , ** kwargs : Any ) -> asyncio .Task [Any ]:
259+ if "context" in kwargs :
260+ raise TypeError ("context argument unsupported" )
261+
262+ return original_create_task (* args , ** kwargs )
263+
264+ monkeypatch .setattr (asyncio , "create_task" , create_task_with_type_error )
265+
266+ async def generator () -> AsyncGenerator [str , None ]:
267+ try :
268+ yield marker .get ()
269+ yield "item_1"
270+ finally :
271+ seen .append (marker .get ())
272+
273+ span = SpanRecorder ()
274+ context = contextvars .copy_context ()
275+ context .run (marker .set , "preserved" )
276+ wrapper = _ContextPreservedAsyncGeneratorWrapper (
277+ generator (),
278+ context ,
279+ cast (Any , span ),
280+ False ,
281+ None ,
282+ )
283+
284+ assert await wrapper .__anext__ () == "preserved"
285+ marker .set ("ambient-now" )
286+
287+ await wrapper .aclose ()
288+
289+ assert seen == ["preserved" ]
290+ assert span .ended == 1
291+
292+
250293@pytest .mark .asyncio
251294async def test_async_generator_wrapper_del_ends_span_when_abandoned () -> None :
252295 async def generator () -> AsyncGenerator [str , None ]:
0 commit comments