| import pytest |
| from aiofile import async_open |
| from langflow.components.inputs import ChatInput, TextInputComponent |
| from langflow.schema.message import Message |
| from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_NAME_USER, MESSAGE_SENDER_USER |
|
|
| from tests.base import ComponentTestBaseWithClient, ComponentTestBaseWithoutClient |
|
|
|
|
| @pytest.mark.usefixtures("client") |
| class TestChatInput(ComponentTestBaseWithClient): |
| @pytest.fixture |
| def component_class(self): |
| return ChatInput |
|
|
| @pytest.fixture |
| def default_kwargs(self): |
| return { |
| "input_value": "Hello, how are you?", |
| "should_store_message": True, |
| "sender": MESSAGE_SENDER_USER, |
| "sender_name": MESSAGE_SENDER_NAME_USER, |
| "session_id": "test_session_123", |
| "files": [], |
| "background_color": "#f0f0f0", |
| "chat_icon": "👤", |
| "text_color": "#000000", |
| } |
|
|
| @pytest.fixture |
| def file_names_mapping(self): |
| return [ |
| {"version": "1.0.15", "module": "inputs", "file_name": "ChatInput"}, |
| {"version": "1.0.16", "module": "inputs", "file_name": "ChatInput"}, |
| {"version": "1.0.17", "module": "inputs", "file_name": "ChatInput"}, |
| {"version": "1.0.18", "module": "inputs", "file_name": "ChatInput"}, |
| {"version": "1.0.19", "module": "inputs", "file_name": "ChatInput"}, |
| ] |
|
|
| async def test_message_response(self, component_class, default_kwargs): |
| """Test that the message_response method returns a valid Message object.""" |
| component = component_class(**default_kwargs) |
| message = await component.message_response() |
|
|
| assert isinstance(message, Message) |
| assert message.text == default_kwargs["input_value"] |
| assert message.sender == default_kwargs["sender"] |
| assert message.sender_name == default_kwargs["sender_name"] |
| assert message.session_id == default_kwargs["session_id"] |
| assert message.files == default_kwargs["files"] |
| assert message.properties.model_dump() == { |
| "background_color": default_kwargs["background_color"], |
| "text_color": default_kwargs["text_color"], |
| "icon": default_kwargs["chat_icon"], |
| "edited": False, |
| "source": {"id": None, "display_name": None, "source": None}, |
| "allow_markdown": False, |
| "state": "complete", |
| "targets": [], |
| } |
|
|
| async def test_message_response_ai_sender(self, component_class): |
| """Test message response with AI sender type.""" |
| kwargs = { |
| "input_value": "I am an AI assistant", |
| "sender": MESSAGE_SENDER_AI, |
| "sender_name": "AI Assistant", |
| "session_id": "test_session_123", |
| } |
| component = component_class(**kwargs) |
| message = await component.message_response() |
|
|
| assert isinstance(message, Message) |
| assert message.sender == MESSAGE_SENDER_AI |
| assert message.sender_name == "AI Assistant" |
|
|
| async def test_message_response_without_session(self, component_class): |
| """Test message response without session ID.""" |
| kwargs = { |
| "input_value": "Test message", |
| "sender": MESSAGE_SENDER_USER, |
| "sender_name": MESSAGE_SENDER_NAME_USER, |
| "session_id": "", |
| } |
| component = component_class(**kwargs) |
| message = await component.message_response() |
|
|
| assert isinstance(message, Message) |
| assert message.session_id == "" |
|
|
| async def test_message_response_with_files(self, component_class, tmp_path): |
| """Test message response with file attachments.""" |
| |
| test_file = tmp_path / "test.txt" |
| async with async_open(test_file, "w") as f: |
| await f.write("Test content") |
|
|
| kwargs = { |
| "input_value": "Message with file", |
| "sender": MESSAGE_SENDER_USER, |
| "sender_name": MESSAGE_SENDER_NAME_USER, |
| "session_id": "test_session_123", |
| "files": [str(test_file)], |
| } |
| component = component_class(**kwargs) |
| message = await component.message_response() |
|
|
| assert isinstance(message, Message) |
| assert len(message.files) == 1 |
| assert message.files[0] == str(test_file) |
|
|
| async def test_message_storage_disabled(self, component_class): |
| """Test message response when storage is disabled.""" |
| kwargs = { |
| "input_value": "Test message", |
| "should_store_message": False, |
| "sender": MESSAGE_SENDER_USER, |
| "sender_name": MESSAGE_SENDER_NAME_USER, |
| "session_id": "test_session_123", |
| } |
| component = component_class(**kwargs) |
| message = await component.message_response() |
|
|
| assert isinstance(message, Message) |
| |
| assert message.text == "Test message" |
|
|
|
|
| class TestTextInputComponent(ComponentTestBaseWithoutClient): |
| @pytest.fixture |
| def component_class(self): |
| return TextInputComponent |
|
|
| @pytest.fixture |
| def default_kwargs(self): |
| return { |
| "input_value": "Hello, world!", |
| "data_template": "{text}", |
| } |
|
|
| @pytest.fixture |
| def file_names_mapping(self): |
| return [ |
| {"version": "1.0.15", "module": "inputs", "file_name": "TextInput"}, |
| {"version": "1.0.16", "module": "inputs", "file_name": "TextInput"}, |
| {"version": "1.0.17", "module": "inputs", "file_name": "TextInput"}, |
| {"version": "1.0.18", "module": "inputs", "file_name": "TextInput"}, |
| {"version": "1.0.19", "module": "inputs", "file_name": "TextInput"}, |
| ] |
|
|