fix: api_error_handler silently drops return values from async methods (#5540)
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import inspect
|
||||
|
||||
import httpx
|
||||
import pytest
|
||||
|
||||
from mem0.client.utils import api_error_handler
|
||||
from mem0.exceptions import AuthenticationError, NetworkError, RateLimitError
|
||||
|
||||
|
||||
def test_sync_returns_value():
|
||||
@api_error_handler
|
||||
def sync_fn():
|
||||
return {"result": "ok"}
|
||||
|
||||
assert sync_fn() == {"result": "ok"}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_async_returns_value():
|
||||
@api_error_handler
|
||||
async def async_fn():
|
||||
return {"result": "ok"}
|
||||
|
||||
assert await async_fn() == {"result": "ok"}
|
||||
|
||||
|
||||
def test_async_decorated_preserves_coroutine_flag():
|
||||
@api_error_handler
|
||||
async def async_fn():
|
||||
return True
|
||||
|
||||
assert inspect.iscoroutinefunction(async_fn)
|
||||
|
||||
|
||||
def test_sync_decorated_is_not_coroutine():
|
||||
@api_error_handler
|
||||
def sync_fn():
|
||||
return True
|
||||
|
||||
assert not inspect.iscoroutinefunction(sync_fn)
|
||||
|
||||
|
||||
def test_sync_http_error_raises_structured_exception():
|
||||
@api_error_handler
|
||||
def sync_fn():
|
||||
request = httpx.Request("GET", "https://api.mem0.ai/v1/memories")
|
||||
response = httpx.Response(401, request=request, text="Unauthorized")
|
||||
raise httpx.HTTPStatusError("401", request=request, response=response)
|
||||
|
||||
with pytest.raises(AuthenticationError):
|
||||
sync_fn()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_async_http_error_raises_structured_exception():
|
||||
@api_error_handler
|
||||
async def async_fn():
|
||||
request = httpx.Request("GET", "https://api.mem0.ai/v1/memories")
|
||||
response = httpx.Response(429, request=request, text="Rate limited")
|
||||
raise httpx.HTTPStatusError("429", request=request, response=response)
|
||||
|
||||
with pytest.raises(RateLimitError):
|
||||
await async_fn()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_async_connect_error_raises_network_error():
|
||||
@api_error_handler
|
||||
async def async_fn():
|
||||
request = httpx.Request("GET", "https://api.mem0.ai/v1/memories")
|
||||
raise httpx.ConnectError("Connection refused", request=request)
|
||||
|
||||
with pytest.raises(NetworkError) as exc_info:
|
||||
await async_fn()
|
||||
assert exc_info.value.error_code == "NET_CONNECT"
|
||||
Reference in New Issue
Block a user