mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-07-16 17:36:07 +00:00
fix(platform): align eba event declarations
This commit is contained in:
@@ -36,6 +36,7 @@ class DummyLogger(AbstractEventLogger):
|
||||
class DummyDingTalkClient(DingTalkClient):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self._message_handlers = {}
|
||||
self.client = SimpleNamespace(register_callback_handler=AsyncMock())
|
||||
self.markdown_card = kwargs.get('markdown_card', True)
|
||||
self.access_token = ''
|
||||
self.send_message = AsyncMock()
|
||||
@@ -115,6 +116,30 @@ def dingtalk_event(conversation='GroupMessage', **overrides) -> DingTalkEvent:
|
||||
return DingTalkEvent.from_payload(payload)
|
||||
|
||||
|
||||
def dingtalk_card_callback_event(**overrides) -> DingTalkEvent:
|
||||
return DingTalkEvent.from_payload(
|
||||
{
|
||||
'conversation_type': 'CardCallback',
|
||||
'Type': 'card_callback',
|
||||
'CardCallback': {
|
||||
'extension': overrides.get('extension', {}),
|
||||
'corp_id': overrides.get('corp_id', 'corp-1'),
|
||||
'user_id': overrides.get('user_id', 'user-1'),
|
||||
'content': overrides.get(
|
||||
'content',
|
||||
{
|
||||
'action': 'like',
|
||||
'feedback_id': 'feedback-1',
|
||||
'message_id': 'bot-msg-1',
|
||||
},
|
||||
),
|
||||
'space_id': overrides.get('space_id', 'space-1'),
|
||||
'card_instance_id': overrides.get('card_instance_id', 'card-1'),
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def test_dingtalk_supported_events_match_manifest():
|
||||
assert make_adapter().get_supported_events() == manifest()['spec']['supported_events']
|
||||
|
||||
@@ -195,7 +220,7 @@ async def test_dingtalk_event_converter_maps_group_and_private_message():
|
||||
group_event = await DingTalkEventConverter.target2yiri(dingtalk_event(), 'LangBot')
|
||||
|
||||
assert isinstance(group_event, platform_events.MessageReceivedEvent)
|
||||
assert group_event.adapter_name == 'dingtalk'
|
||||
assert group_event.adapter_name == 'dingtalk-eba'
|
||||
assert group_event.chat_type == platform_entities.ChatType.GROUP
|
||||
assert group_event.chat_id == 'group-1'
|
||||
assert group_event.group.name == 'LangBot Team'
|
||||
@@ -212,6 +237,42 @@ async def test_dingtalk_event_converter_maps_group_and_private_message():
|
||||
assert private_event.group is None
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_dingtalk_event_converter_maps_card_feedback():
|
||||
feedback = await DingTalkEventConverter.target2yiri(dingtalk_card_callback_event(), 'LangBot')
|
||||
callback = await DingTalkEventConverter.target2yiri(
|
||||
dingtalk_card_callback_event(content={'action': 'open_details'}),
|
||||
'LangBot',
|
||||
)
|
||||
|
||||
assert isinstance(feedback, platform_events.FeedbackReceivedEvent)
|
||||
assert feedback.adapter_name == 'dingtalk-eba'
|
||||
assert feedback.feedback_id == 'feedback-1'
|
||||
assert feedback.feedback_type == 1
|
||||
assert feedback.user_id == 'user-1'
|
||||
assert feedback.session_id == 'space-1'
|
||||
assert feedback.message_id == 'bot-msg-1'
|
||||
|
||||
assert isinstance(callback, platform_events.PlatformSpecificEvent)
|
||||
assert callback.action == 'card.callback'
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_dingtalk_adapter_dispatches_card_feedback_event():
|
||||
adapter = make_adapter()
|
||||
calls: list[platform_events.Event] = []
|
||||
|
||||
async def listener(event, adapter):
|
||||
calls.append(event)
|
||||
|
||||
adapter.register_listener(platform_events.FeedbackReceivedEvent, listener)
|
||||
await adapter._handle_native_event(dingtalk_card_callback_event())
|
||||
|
||||
assert len(calls) == 1
|
||||
assert isinstance(calls[0], platform_events.FeedbackReceivedEvent)
|
||||
assert calls[0].feedback_type == 1
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_dingtalk_adapter_dispatches_and_caches_message_event():
|
||||
adapter = make_adapter()
|
||||
|
||||
@@ -143,6 +143,7 @@ def qq_event(event_type: str = 'C2C_MESSAGE_CREATE', **overrides) -> QQOfficialE
|
||||
'image_attachments': overrides.get('image_attachments'),
|
||||
'content_type': overrides.get('content_type', 'image/png'),
|
||||
}
|
||||
payload.update(overrides.get('extra', {}))
|
||||
return QQOfficialEvent(payload)
|
||||
|
||||
|
||||
@@ -194,7 +195,7 @@ async def test_qqofficial_event_converter_maps_private_group_and_platform_specif
|
||||
private_event = await QQOfficialEventConverter().target2yiri(qq_event('C2C_MESSAGE_CREATE'))
|
||||
group_event = await QQOfficialEventConverter().target2yiri(qq_event('GROUP_AT_MESSAGE_CREATE'))
|
||||
channel_event = await QQOfficialEventConverter().target2yiri(qq_event('AT_MESSAGE_CREATE'))
|
||||
platform_event = await QQOfficialEventConverter().target2yiri(qq_event('GUILD_CREATE'))
|
||||
platform_event = await QQOfficialEventConverter().target2yiri(qq_event('UNKNOWN_EVENT'))
|
||||
|
||||
assert isinstance(private_event, platform_events.MessageReceivedEvent)
|
||||
assert private_event.adapter_name == 'qqofficial-eba'
|
||||
@@ -209,7 +210,67 @@ async def test_qqofficial_event_converter_maps_private_group_and_platform_specif
|
||||
|
||||
assert channel_event.chat_id == 'channel-1'
|
||||
assert isinstance(platform_event, platform_events.PlatformSpecificEvent)
|
||||
assert platform_event.action == 'qqofficial.GUILD_CREATE'
|
||||
assert platform_event.action == 'qqofficial.UNKNOWN_EVENT'
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_qqofficial_event_converter_maps_declared_lifecycle_events():
|
||||
converter = QQOfficialEventConverter()
|
||||
|
||||
reaction_add = await converter.target2yiri(
|
||||
qq_event(
|
||||
'MESSAGE_REACTION_ADD',
|
||||
extra={
|
||||
'message_id': 'reacted-msg',
|
||||
'emoji': 'thumbs_up',
|
||||
'group_openid': 'group-openid',
|
||||
'openid': 'reactor-openid',
|
||||
},
|
||||
)
|
||||
)
|
||||
reaction_remove = await converter.target2yiri(
|
||||
qq_event('MESSAGE_REACTION_REMOVE', extra={'message_id': 'reacted-msg', 'emoji_id': '1'})
|
||||
)
|
||||
member_joined = await converter.target2yiri(
|
||||
qq_event('GROUP_MEMBER_ADD', extra={'openid': 'new-member', 'group_openid': 'group-openid'})
|
||||
)
|
||||
member_left = await converter.target2yiri(
|
||||
qq_event('GROUP_MEMBER_REMOVE', extra={'openid': 'old-member', 'operator_openid': 'operator-openid'})
|
||||
)
|
||||
bot_invited = await converter.target2yiri(
|
||||
qq_event('GROUP_ADD_ROBOT', extra={'group_openid': 'group-openid', 'op_user_id': 'inviter-openid'})
|
||||
)
|
||||
bot_removed = await converter.target2yiri(
|
||||
qq_event('GROUP_DEL_ROBOT', extra={'group_openid': 'group-openid', 'op_user_id': 'operator-openid'})
|
||||
)
|
||||
|
||||
assert isinstance(reaction_add, platform_events.MessageReactionEvent)
|
||||
assert reaction_add.type == 'message.reaction'
|
||||
assert reaction_add.is_add is True
|
||||
assert reaction_add.message_id == 'reacted-msg'
|
||||
assert reaction_add.reaction == 'thumbs_up'
|
||||
assert reaction_add.chat_type == platform_entities.ChatType.GROUP
|
||||
|
||||
assert isinstance(reaction_remove, platform_events.MessageReactionEvent)
|
||||
assert reaction_remove.is_add is False
|
||||
|
||||
assert isinstance(member_joined, platform_events.MemberJoinedEvent)
|
||||
assert member_joined.type == 'group.member_joined'
|
||||
assert member_joined.group.id == 'group-openid'
|
||||
assert member_joined.member.id == 'new-member'
|
||||
|
||||
assert isinstance(member_left, platform_events.MemberLeftEvent)
|
||||
assert member_left.type == 'group.member_left'
|
||||
assert member_left.member.id == 'old-member'
|
||||
assert member_left.operator.id == 'operator-openid'
|
||||
|
||||
assert isinstance(bot_invited, platform_events.BotInvitedToGroupEvent)
|
||||
assert bot_invited.type == 'bot.invited_to_group'
|
||||
assert bot_invited.inviter.id == 'inviter-openid'
|
||||
|
||||
assert isinstance(bot_removed, platform_events.BotRemovedFromGroupEvent)
|
||||
assert bot_removed.type == 'bot.removed_from_group'
|
||||
assert bot_removed.operator.id == 'operator-openid'
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@@ -236,6 +297,24 @@ async def test_qqofficial_adapter_dispatches_eba_and_legacy_and_caches_group_eve
|
||||
assert (await adapter.get_group_member_info('group-openid', 'member-openid')).user.id == 'member-openid'
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_qqofficial_adapter_dispatches_non_message_eba_events():
|
||||
adapter = make_adapter()
|
||||
calls: list[platform_events.Event] = []
|
||||
|
||||
async def member_listener(event, adapter):
|
||||
calls.append(event)
|
||||
|
||||
adapter.register_listener(platform_events.MemberJoinedEvent, member_listener)
|
||||
await adapter._handle_native_event(
|
||||
qq_event('GROUP_MEMBER_ADD', extra={'openid': 'new-member', 'group_openid': 'group-openid'})
|
||||
)
|
||||
|
||||
assert len(calls) == 1
|
||||
assert isinstance(calls[0], platform_events.MemberJoinedEvent)
|
||||
assert calls[0].member.id == 'new-member'
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_qqofficial_send_reply_stream_platform_api_and_unsupported():
|
||||
adapter = make_adapter()
|
||||
@@ -252,7 +331,9 @@ async def test_qqofficial_send_reply_stream_platform_api_and_unsupported():
|
||||
assert ('private_text', 'user-openid', 'reply', 'msg-1') in adapter.bot.sent
|
||||
assert any(call[0] == 'image' and call[1] == 'c2c' for call in adapter.bot.sent)
|
||||
|
||||
await adapter.send_message('group', 'group-openid', platform_message.MessageChain([platform_message.Plain(text='hello group')]))
|
||||
await adapter.send_message(
|
||||
'group', 'group-openid', platform_message.MessageChain([platform_message.Plain(text='hello group')])
|
||||
)
|
||||
assert ('group_text', 'group-openid', 'hello group', None) in adapter.bot.sent
|
||||
|
||||
assert await adapter.call_platform_api('get_mode', {}) == {
|
||||
|
||||
Reference in New Issue
Block a user