fix(wecomcs): preserve provider error details (#2772)

This commit is contained in:
Guanchao Wang
2026-10-26 18:05:38 +08:00
committed by GitHub
parent 029fbbf3c3
commit 1d3c47c439
2 changed files with 97 additions and 22 deletions
@@ -4,6 +4,63 @@ import httpx
import pytest
from langbot.libs.wecom_customer_service_api.api import WecomCSClient
from langbot_plugin.api.entities.builtin.platform.message import Image
@pytest.mark.asyncio
@pytest.mark.parametrize(
('method', 'args'),
[
('send_text_msg', ('kf', 'user', 'msg', 'hello')),
('send_image_msg', ('kf', 'user', 'msg', 'media')),
('send_event_text', ('code', 'msg', 'hello')),
('send_image', ('user', 1, 'media')),
('change_service_status', ('user', 'kf', 'servicer')),
('get_pic_url', ('media',)),
('upload_to_work', (Image(base64='aW1hZ2U='),)),
('get_detailed_message_list', ('<xml><Token>token</Token><OpenKfId>kf</OpenKfId></xml>',)),
],
)
@pytest.mark.parametrize('errcode', [95002, 40014])
async def test_api_failures_preserve_provider_diagnostics(method, args, errcode):
def handle_request(request):
if request.url.path.endswith('/gettoken'):
return httpx.Response(200, json={'access_token': 'refreshed-token'})
return httpx.Response(200, json={'errcode': errcode, 'errmsg': 'provider detail, rid: trace-123'})
client = WecomCSClient('corp', 'secret', 'token', 'aes', None, unified_mode=True)
client.access_token = 'access-token'
client._http_client = httpx.AsyncClient(transport=httpx.MockTransport(handle_request))
try:
with pytest.raises(Exception) as error:
await getattr(client, method)(*args)
assert str(errcode) in str(error.value)
assert 'provider detail, rid: trace-123' in str(error.value)
finally:
await client.close()
@pytest.mark.asyncio
async def test_upload_returns_media_after_token_refresh():
uploads = 0
def handle_request(request):
nonlocal uploads
if request.url.path.endswith('/gettoken'):
return httpx.Response(200, json={'access_token': 'refreshed-token'})
uploads += 1
if uploads == 1:
return httpx.Response(200, json={'errcode': 42001, 'errmsg': 'token expired'})
return httpx.Response(200, json={'media_id': 'uploaded-media'})
client = WecomCSClient('corp', 'secret', 'token', 'aes', None, unified_mode=True)
client.access_token = 'access-token'
client._http_client = httpx.AsyncClient(transport=httpx.MockTransport(handle_request))
try:
assert await client.upload_to_work(Image(base64='aW1hZ2U=')) == 'uploaded-media'
assert uploads == 2
finally:
await client.close()
@pytest.mark.asyncio