mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-10-27 02:45:24 +08:00
test(pipeline): verify message and provider behavior
This commit is contained in:
@@ -89,6 +89,25 @@ def set_runner(fake_app):
|
||||
return _set_runner
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def chat_session():
|
||||
from langbot_plugin.api.entities.builtin.provider.session import Session, Conversation, LauncherTypes
|
||||
from langbot_plugin.api.entities.builtin.provider.prompt import Prompt
|
||||
|
||||
return Session(
|
||||
launcher_type=LauncherTypes.PERSON,
|
||||
launcher_id=12345,
|
||||
sender_id=12345,
|
||||
bot_uuid='test-bot-uuid',
|
||||
using_conversation=Conversation(
|
||||
prompt=Prompt(name='default', messages=[]),
|
||||
messages=[],
|
||||
pipeline_uuid='test-pipeline-uuid',
|
||||
bot_uuid='test-bot-uuid',
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
# ============== CACHED LAZY IMPORTS ==============
|
||||
|
||||
_chat_handler_module = None
|
||||
@@ -223,7 +242,9 @@ class TestChatMessageHandlerReal:
|
||||
assert query.user_message.content is not None
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_adapter_without_stream_method_defaults_non_stream(self, fake_app, mock_event_ctx, set_runner):
|
||||
async def test_adapter_without_stream_method_defaults_non_stream(
|
||||
self, fake_app, mock_event_ctx, set_runner, chat_session
|
||||
):
|
||||
"""Adapter without is_stream_output_supported defaults to non-stream."""
|
||||
from tests.factories import text_query
|
||||
from langbot_plugin.api.entities.builtin.provider.message import Message, ContentElement
|
||||
@@ -237,6 +258,7 @@ class TestChatMessageHandlerReal:
|
||||
query = text_query('test')
|
||||
query.adapter = Mock(spec=[])
|
||||
query.user_message = Message(role='user', content=[ContentElement.from_text('test')])
|
||||
query.session = chat_session
|
||||
|
||||
class SingleRunner:
|
||||
name = 'local-agent'
|
||||
@@ -256,7 +278,9 @@ class TestChatMessageHandlerReal:
|
||||
async for result in handler.handle(query):
|
||||
results.append(result)
|
||||
|
||||
assert len(results) >= 1
|
||||
assert len(results) == 1
|
||||
assert results[0].result_type == get_entities().ResultType.CONTINUE
|
||||
assert [(message.role, message.content) for message in query.resp_messages] == [('assistant', 'response')]
|
||||
|
||||
|
||||
@pytest.mark.usefixtures('mock_circular_import_chain')
|
||||
@@ -315,7 +339,7 @@ class TestChatHandlerStreaming:
|
||||
query.adapter.create_message_card.assert_awaited_once()
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_streaming_chunks_collected(self, fake_app, mock_event_ctx, set_runner):
|
||||
async def test_streaming_chunks_collected(self, fake_app, mock_event_ctx, set_runner, chat_session):
|
||||
"""Streaming produces multiple results."""
|
||||
from tests.factories import text_query
|
||||
from langbot_plugin.api.entities.builtin.provider.message import Message, ContentElement, MessageChunk
|
||||
@@ -330,6 +354,7 @@ class TestChatHandlerStreaming:
|
||||
query.adapter.is_stream_output_supported = AsyncMock(return_value=True)
|
||||
query.adapter.create_message_card = AsyncMock()
|
||||
query.user_message = Message(role='user', content=[ContentElement.from_text('test')])
|
||||
query.session = chat_session
|
||||
|
||||
class StreamRunner:
|
||||
name = 'local-agent'
|
||||
@@ -340,17 +365,24 @@ class TestChatHandlerStreaming:
|
||||
|
||||
async def run(self, query):
|
||||
yield MessageChunk(role='assistant', content='Hello', is_final=False)
|
||||
yield MessageChunk(role='assistant', content=' World', is_final=True)
|
||||
yield MessageChunk(role='assistant', content='Hello World', is_final=True)
|
||||
|
||||
set_runner(StreamRunner)
|
||||
|
||||
handler = chat.ChatMessageHandler(fake_app)
|
||||
|
||||
results = []
|
||||
delivered = []
|
||||
async for result in handler.handle(query):
|
||||
results.append(result)
|
||||
delivered.append(query.resp_messages[-1])
|
||||
|
||||
assert len(results) >= 1
|
||||
assert len(results) == 2
|
||||
assert all(result.result_type == get_entities().ResultType.CONTINUE for result in results)
|
||||
assert [chunk.content for chunk in delivered] == ['Hello', 'Hello World']
|
||||
assert [chunk.is_final for chunk in delivered] == [False, True]
|
||||
assert len({chunk.resp_message_id for chunk in delivered}) == 1
|
||||
query.adapter.create_message_card.assert_awaited_once()
|
||||
|
||||
|
||||
@pytest.mark.usefixtures('mock_circular_import_chain')
|
||||
@@ -536,7 +568,7 @@ class TestChatHandlerHelper:
|
||||
chat = get_chat_handler()
|
||||
handler = chat.ChatMessageHandler(fake_app)
|
||||
result = handler.cut_str('first line\nsecond line')
|
||||
assert '...' in result
|
||||
assert result == 'first line...'
|
||||
|
||||
def test_response_size_limit_uses_instance_config(self, fake_app):
|
||||
from langbot_plugin.api.entities.builtin.provider.message import Message
|
||||
|
||||
Reference in New Issue
Block a user