diff --git a/python/packages/core/tests/workflow/test_function_executor.py b/python/packages/core/tests/workflow/test_function_executor.py index 2ac083d943..a7803a735e 100644 --- a/python/packages/core/tests/workflow/test_function_executor.py +++ b/python/packages/core/tests/workflow/test_function_executor.py @@ -529,11 +529,12 @@ async def bad_handler(cls, data: str) -> str: assert "@handler on instance methods" in str(exc_info.value) async def test_async_staticmethod_detection_behavior(self): - """Document the behavior of asyncio.iscoroutinefunction with staticmethod descriptors. + """Document the behavior of inspect.iscoroutinefunction with staticmethod descriptors. This test explains why the unwrapping is necessary when decorators are stacked. """ import asyncio + import inspect # When @staticmethod is applied, it creates a descriptor async def my_async_func(): @@ -544,19 +545,19 @@ async def my_async_func(): static_wrapped = staticmethod(my_async_func) # Direct check on descriptor object fails (this is the bug) - assert not asyncio.iscoroutinefunction(static_wrapped) # type: ignore[reportDeprecated] + assert not inspect.iscoroutinefunction(static_wrapped) assert isinstance(static_wrapped, staticmethod) # But unwrapping __func__ reveals the async function unwrapped = static_wrapped.__func__ - assert asyncio.iscoroutinefunction(unwrapped) # type: ignore[reportDeprecated] + assert inspect.iscoroutinefunction(unwrapped) # When accessed via class attribute, Python's descriptor protocol # automatically unwraps it, so it works: class C: async_static = static_wrapped - assert asyncio.iscoroutinefunction(C.async_static) # type: ignore[reportDeprecated] # Works via descriptor protocol + assert inspect.iscoroutinefunction(C.async_static) # Works via descriptor protocol class TestExecutorExplicitTypes: diff --git a/python/packages/devui/tests/devui/test_cleanup_hooks.py b/python/packages/devui/tests/devui/test_cleanup_hooks.py index 8d02bfaf27..3425b6e696 100644 --- a/python/packages/devui/tests/devui/test_cleanup_hooks.py +++ b/python/packages/devui/tests/devui/test_cleanup_hooks.py @@ -2,7 +2,7 @@ """Tests for cleanup hook registration and execution.""" -import asyncio +import inspect import tempfile from pathlib import Path @@ -123,7 +123,7 @@ async def test_register_cleanup_multiple_hooks(): # Execute all hooks for hook in hooks: - if asyncio.iscoroutinefunction(hook): + if inspect.iscoroutinefunction(hook): await hook() else: hook() @@ -195,8 +195,6 @@ async def test_mixed_async_sync_hooks(): hooks = discovery.get_cleanup_hooks(entity_info.id) assert len(hooks) == 2 - import inspect - for hook in hooks: if inspect.iscoroutinefunction(hook): await hook() @@ -229,8 +227,6 @@ def failing_hook(): assert len(hooks) == 2 # Execute hooks with error handling (like _server.py does) - import inspect - for hook in hooks: try: if inspect.iscoroutinefunction(hook):