File size: 3,773 Bytes
c03605c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
"""Tests for the study chatbot echo functionality."""
import pytest
from unittest.mock import AsyncMock, Mock
import sys
import os

# Add src to path for imports
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))

from study_chatbot import app


@pytest.mark.asyncio
async def test_echo_text_message():
    """Test that text messages are echoed back correctly."""
    # Mock chainlit Message
    mock_message = Mock()
    mock_message.content = "Hello, world!"
    
    # Mock chainlit.Message constructor and send method
    mock_response = AsyncMock()
    mock_response.send = AsyncMock()
    
    # Patch chainlit.Message
    import chainlit as cl
    original_message = cl.Message
    cl.Message = Mock(return_value=mock_response)
    
    try:
        # Call the handler
        await app.main(mock_message)
        
        # Verify response was created with echoed content
        cl.Message.assert_called_once_with(content="Hello, world!")
        mock_response.send.assert_called_once()
    finally:
        # Restore original
        cl.Message = original_message


@pytest.mark.asyncio
async def test_empty_message():
    """Test that empty messages get a helpful response."""
    # Mock chainlit Message with empty content
    mock_message = Mock()
    mock_message.content = ""
    mock_message.data = None
    
    # Mock chainlit.Message constructor and send method
    mock_response = AsyncMock()
    mock_response.send = AsyncMock()
    
    # Patch chainlit.Message
    import chainlit as cl
    original_message = cl.Message
    cl.Message = Mock(return_value=mock_response)
    
    try:
        # Call the handler
        await app.main(mock_message)
        
        # Verify helpful message was sent
        cl.Message.assert_called_once_with(content="I can only echo text messages. Please send plain text.")
        mock_response.send.assert_called_once()
    finally:
        # Restore original
        cl.Message = original_message


@pytest.mark.asyncio
async def test_none_message():
    """Test that None content gets a helpful response."""
    # Mock chainlit Message with None content
    mock_message = Mock()
    mock_message.content = None
    mock_message.data = None
    
    # Mock chainlit.Message constructor and send method
    mock_response = AsyncMock()
    mock_response.send = AsyncMock()
    
    # Patch chainlit.Message
    import chainlit as cl
    original_message = cl.Message
    cl.Message = Mock(return_value=mock_response)
    
    try:
        # Call the handler
        await app.main(mock_message)
        
        # Verify helpful message was sent
        cl.Message.assert_called_once_with(content="I can only echo text messages. Please send plain text.")
        mock_response.send.assert_called_once()
    finally:
        # Restore original
        cl.Message = original_message


@pytest.mark.asyncio
async def test_whitespace_only_message():
    """Test that whitespace-only messages get a helpful response."""
    # Mock chainlit Message with whitespace
    mock_message = Mock()
    mock_message.content = "   \n\t   "
    mock_message.data = None
    
    # Mock chainlit.Message constructor and send method
    mock_response = AsyncMock()
    mock_response.send = AsyncMock()
    
    # Patch chainlit.Message
    import chainlit as cl
    original_message = cl.Message
    cl.Message = Mock(return_value=mock_response)
    
    try:
        # Call the handler
        await app.main(mock_message)
        
        # Verify helpful message was sent
        cl.Message.assert_called_once_with(content="I can only echo text messages. Please send plain text.")
        mock_response.send.assert_called_once()
    finally:
        # Restore original
        cl.Message = original_message