-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_message_handler.py
More file actions
307 lines (231 loc) · 10.3 KB
/
test_message_handler.py
File metadata and controls
307 lines (231 loc) · 10.3 KB
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
"""
Unit tests for message handler.
Tests filtering direct messages and extracting sender/text.
"""
import unittest
from datetime import datetime
from unittest.mock import MagicMock
class TestMessageHandler(unittest.TestCase):
"""Test message handling functionality."""
def test_is_direct_message_returns_true_for_direct_message(self):
"""Test that is_direct_message returns True for private messages."""
from src.message_handler import is_direct_message
# Mock Telegram update object with private chat
update = MagicMock()
update.message.chat.type = 'private'
self.assertTrue(is_direct_message(update))
def test_is_direct_message_returns_false_for_group_message(self):
"""Test that is_direct_message returns False for group messages."""
from src.message_handler import is_direct_message
# Mock Telegram update object with group chat
update = MagicMock()
update.message.chat.type = 'group'
self.assertFalse(is_direct_message(update))
def test_is_direct_message_returns_false_for_supergroup_message(self):
"""Test that is_direct_message returns False for supergroup messages."""
from src.message_handler import is_direct_message
# Mock Telegram update object with supergroup chat
update = MagicMock()
update.message.chat.type = 'supergroup'
self.assertFalse(is_direct_message(update))
def test_is_direct_message_returns_false_for_channel_message(self):
"""Test that is_direct_message returns False for channel messages."""
from src.message_handler import is_direct_message
# Mock Telegram update object with channel
update = MagicMock()
update.message.chat.type = 'channel'
self.assertFalse(is_direct_message(update))
def test_extract_sender_from_user_first_name(self):
"""Test extracting sender name from user first_name."""
from src.message_handler import extract_sender
update = MagicMock()
update.message.from_user.first_name = "John"
update.message.from_user.last_name = None
sender = extract_sender(update)
self.assertEqual(sender, "John")
def test_extract_sender_from_user_first_and_last_name(self):
"""Test extracting sender with both first and last name."""
from src.message_handler import extract_sender
update = MagicMock()
update.message.from_user.first_name = "John"
update.message.from_user.last_name = "Doe"
sender = extract_sender(update)
self.assertEqual(sender, "John Doe")
def test_extract_sender_uses_username_as_fallback(self):
"""Test that username is used if name is not available."""
from src.message_handler import extract_sender
update = MagicMock()
update.message.from_user.first_name = None
update.message.from_user.last_name = None
update.message.from_user.username = "john_doe"
sender = extract_sender(update)
self.assertEqual(sender, "john_doe")
def test_extract_sender_uses_user_id_as_last_fallback(self):
"""Test that user ID is used if name/username are not available."""
from src.message_handler import extract_sender
update = MagicMock()
update.message.from_user.first_name = None
update.message.from_user.last_name = None
update.message.from_user.username = None
update.message.from_user.id = 12345
sender = extract_sender(update)
self.assertEqual(sender, "12345")
def test_extract_message_text(self):
"""Test extracting message text from update."""
from src.message_handler import extract_message_text
update = MagicMock()
update.message.text = "Hello, this is a test message"
text = extract_message_text(update)
self.assertEqual(text, "Hello, this is a test message")
def test_extract_message_timestamp(self):
"""Test extracting message timestamp from update."""
from src.message_handler import extract_message_timestamp
# Create a datetime object for comparison
test_datetime = datetime(2026, 2, 24, 10, 30, 45)
update = MagicMock()
update.message.date = test_datetime
timestamp = extract_message_timestamp(update)
self.assertEqual(timestamp, test_datetime)
def test_has_file_returns_false_for_text_message(self):
"""Test that has_file returns False for text-only messages."""
from src.message_handler import has_file
update = MagicMock()
update.message.photo = None
update.message.document = None
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
self.assertFalse(has_file(update))
def test_has_file_returns_true_for_photo(self):
"""Test that has_file returns True for photo messages."""
from src.message_handler import has_file
update = MagicMock()
update.message.photo = [MagicMock()]
update.message.document = None
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
self.assertTrue(has_file(update))
def test_has_file_returns_true_for_document(self):
"""Test that has_file returns True for document messages."""
from src.message_handler import has_file
update = MagicMock()
update.message.photo = None
update.message.document = MagicMock()
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
self.assertTrue(has_file(update))
def test_has_file_returns_true_for_audio(self):
"""Test that has_file returns True for audio messages."""
from src.message_handler import has_file
update = MagicMock()
update.message.photo = None
update.message.document = None
update.message.audio = MagicMock()
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
self.assertTrue(has_file(update))
def test_has_file_returns_true_for_video(self):
"""Test that has_file returns True for video messages."""
from src.message_handler import has_file
update = MagicMock()
update.message.photo = None
update.message.document = None
update.message.audio = None
update.message.video = MagicMock()
update.message.animation = None
update.message.voice = None
update.message.video_note = None
self.assertTrue(has_file(update))
def test_extract_file_type_photo(self):
"""Test extracting file type for photo messages."""
from src.message_handler import extract_file_type
update = MagicMock()
update.message.photo = [MagicMock()]
update.message.document = None
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
file_type = extract_file_type(update)
self.assertEqual(file_type, "photo")
def test_extract_file_type_document(self):
"""Test extracting file type for document messages."""
from src.message_handler import extract_file_type
update = MagicMock()
update.message.photo = None
update.message.document = MagicMock()
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
file_type = extract_file_type(update)
self.assertEqual(file_type, "document")
def test_extract_file_type_audio(self):
"""Test extracting file type for audio messages."""
from src.message_handler import extract_file_type
update = MagicMock()
update.message.photo = None
update.message.document = None
update.message.audio = MagicMock()
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
file_type = extract_file_type(update)
self.assertEqual(file_type, "audio")
def test_extract_file_object_photo(self):
"""Test extracting file object from photo messages (uses largest)."""
from src.message_handler import extract_file_object
photo_small = MagicMock()
photo_large = MagicMock()
update = MagicMock()
update.message.photo = [photo_small, photo_large]
update.message.document = None
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
file_obj = extract_file_object(update)
self.assertEqual(file_obj, photo_large)
def test_extract_file_object_document(self):
"""Test extracting file object from document messages."""
from src.message_handler import extract_file_object
document = MagicMock()
update = MagicMock()
update.message.photo = None
update.message.document = document
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
file_obj = extract_file_object(update)
self.assertEqual(file_obj, document)
def test_extract_file_object_none_for_text_message(self):
"""Test extracting file object returns None for text messages."""
from src.message_handler import extract_file_object
update = MagicMock()
update.message.photo = None
update.message.document = None
update.message.audio = None
update.message.video = None
update.message.animation = None
update.message.voice = None
update.message.video_note = None
file_obj = extract_file_object(update)
self.assertIsNone(file_obj)
if __name__ == '__main__':
unittest.main()