|
| 1 | +import base64 |
1 | 2 | import unittest
|
| 3 | +from unittest.mock import AsyncMock, patch, Mock |
| 4 | +import aiohttp |
2 | 5 | from signalbot import Message, MessageType
|
| 6 | +from signalbot.api import SignalAPI |
| 7 | +from signalbot.utils import ChatTestCase, SendMessagesMock, ReceiveMessagesMock |
3 | 8 |
|
4 | 9 |
|
5 |
| -class TestMessage(unittest.TestCase): |
| 10 | +class TestMessage(unittest.IsolatedAsyncioTestCase): |
6 | 11 | raw_sync_message = '{"envelope":{"source":"+490123456789","sourceNumber":"+490123456789","sourceUuid":"<uuid>","sourceName":"<name>","sourceDevice":1,"timestamp":1632576001632,"syncMessage":{"sentMessage":{"timestamp":1632576001632,"message":"Uhrzeit","expiresInSeconds":0,"viewOnce":false,"mentions":[],"attachments":[],"contacts":[],"groupInfo":{"groupId":"<groupid>","type":"DELIVER"},"destination":null,"destinationNumber":null,"destinationUuid":null}}}}' # noqa
|
7 | 12 | raw_data_message = '{"envelope":{"source":"+490123456789","sourceNumber":"+490123456789","sourceUuid":"<uuid>","sourceName":"<name>","sourceDevice":1,"timestamp":1632576001632,"dataMessage":{"timestamp":1632576001632,"message":"Uhrzeit","expiresInSeconds":0,"viewOnce":false,"mentions":[],"attachments":[],"contacts":[],"groupInfo":{"groupId":"<groupid>","type":"DELIVER"}}}}' # noqa
|
8 | 13 | raw_reaction_message = '{"envelope":{"source":"<source>","sourceNumber":"<source>","sourceUuid":"<uuid>","sourceName":"<name>","sourceDevice":1,"timestamp":1632576001632,"syncMessage":{"sentMessage":{"timestamp":1632576001632,"message":null,"expiresInSeconds":0,"viewOnce":false,"reaction":{"emoji":"👍","targetAuthor":"<target>","targetAuthorNumber":"<target>","targetAuthorUuid":"<uuid>","targetSentTimestamp":1632576001632,"isRemove":false},"mentions":[],"attachments":[],"contacts":[],"groupInfo":{"groupId":"<groupid>","type":"DELIVER"},"destination":null,"destinationNumber":null,"destinationUuid":null}}}}' # noqa
|
9 | 14 | raw_user_chat_message = '{"envelope":{"source":"+490123456789","sourceNumber":"+490123456789","sourceUuid":"<uuid>","sourceName":"<name>","sourceDevice":1,"timestamp":1632576001632,"dataMessage":{"timestamp":1632576001632,"message":"Uhrzeit","expiresInSeconds":0,"viewOnce":false}},"account":"+49987654321","subscription":0}' # noqa
|
| 15 | + raw_attachment_message = '{"envelope":{"source":"+490123456789","sourceNumber":"+490123456789","sourceUuid":"<uuid>","sourceName":"<name>","sourceDevice":1,"timestamp":1632576001632,"dataMessage":{"timestamp":1632576001632,"message":"Uhrzeit","expiresInSeconds":0,"viewOnce":false, "attachments": [{"contentType": "image/png", "filename": "image.png", "id": "4296180834490578536","size": 12005}]}},"account":"+49987654321","subscription":0}' # noqa |
10 | 16 |
|
11 | 17 | expected_source = "+490123456789"
|
12 | 18 | expected_timestamp = 1632576001632
|
13 | 19 | expected_text = "Uhrzeit"
|
14 | 20 | expected_group = "<groupid>"
|
15 | 21 |
|
| 22 | + signal_service = "127.0.0.1:8080" |
| 23 | + phone_number = "+49123456789" |
| 24 | + |
| 25 | + group_id = "group_id1" |
| 26 | + group_secret = "group.group_secret1" |
| 27 | + groups = {group_id: group_secret} |
| 28 | + |
| 29 | + def setUp(self): |
| 30 | + self.signal_api = SignalAPI( |
| 31 | + TestMessage.signal_service, TestMessage.phone_number |
| 32 | + ) |
| 33 | + |
16 | 34 | # Own Message
|
17 |
| - def test_parse_source_own_message(self): |
18 |
| - message = Message.parse(TestMessage.raw_sync_message) |
| 35 | + async def test_parse_source_own_message(self): |
| 36 | + message = await Message.parse(self.signal_api, TestMessage.raw_sync_message) |
19 | 37 | self.assertEqual(message.timestamp, TestMessage.expected_timestamp)
|
20 | 38 |
|
21 |
| - def test_parse_timestamp_own_message(self): |
22 |
| - message = Message.parse(TestMessage.raw_sync_message) |
| 39 | + async def test_parse_timestamp_own_message(self): |
| 40 | + message = await Message.parse(self.signal_api, TestMessage.raw_sync_message) |
23 | 41 | self.assertEqual(message.source, TestMessage.expected_source)
|
24 | 42 |
|
25 |
| - def test_parse_type_own_message(self): |
26 |
| - message = Message.parse(TestMessage.raw_sync_message) |
| 43 | + async def test_parse_type_own_message(self): |
| 44 | + message = await Message.parse(self.signal_api, TestMessage.raw_sync_message) |
27 | 45 | self.assertEqual(message.type, MessageType.SYNC_MESSAGE)
|
28 | 46 |
|
29 |
| - def test_parse_text_own_message(self): |
30 |
| - message = Message.parse(TestMessage.raw_sync_message) |
| 47 | + async def test_parse_text_own_message(self): |
| 48 | + message = await Message.parse(self.signal_api, TestMessage.raw_sync_message) |
31 | 49 | self.assertEqual(message.text, TestMessage.expected_text)
|
32 | 50 |
|
33 |
| - def test_parse_group_own_message(self): |
34 |
| - message = Message.parse(TestMessage.raw_sync_message) |
| 51 | + async def test_parse_group_own_message(self): |
| 52 | + message = await Message.parse(self.signal_api, TestMessage.raw_sync_message) |
35 | 53 | self.assertEqual(message.group, TestMessage.expected_group)
|
36 | 54 |
|
37 | 55 | # Foreign Messages
|
38 |
| - def test_parse_source_foreign_message(self): |
39 |
| - message = Message.parse(TestMessage.raw_data_message) |
| 56 | + async def test_parse_source_foreign_message(self): |
| 57 | + message = await Message.parse(self.signal_api, TestMessage.raw_data_message) |
40 | 58 | self.assertEqual(message.timestamp, TestMessage.expected_timestamp)
|
41 | 59 |
|
42 |
| - def test_parse_timestamp_foreign_message(self): |
43 |
| - message = Message.parse(TestMessage.raw_data_message) |
| 60 | + async def test_parse_timestamp_foreign_message(self): |
| 61 | + message = await Message.parse(self.signal_api, TestMessage.raw_data_message) |
44 | 62 | self.assertEqual(message.source, TestMessage.expected_source)
|
45 | 63 |
|
46 |
| - def test_parse_type_foreign_message(self): |
47 |
| - message = Message.parse(TestMessage.raw_data_message) |
| 64 | + async def test_parse_type_foreign_message(self): |
| 65 | + message = await Message.parse(self.signal_api, TestMessage.raw_data_message) |
48 | 66 | self.assertEqual(message.type, MessageType.DATA_MESSAGE)
|
49 | 67 |
|
50 |
| - def test_parse_text_foreign_message(self): |
51 |
| - message = Message.parse(TestMessage.raw_data_message) |
| 68 | + async def test_parse_text_foreign_message(self): |
| 69 | + message = await Message.parse(self.signal_api, TestMessage.raw_data_message) |
52 | 70 | self.assertEqual(message.text, TestMessage.expected_text)
|
53 | 71 |
|
54 |
| - def test_parse_group_foreign_message(self): |
55 |
| - message = Message.parse(TestMessage.raw_data_message) |
| 72 | + async def test_parse_group_foreign_message(self): |
| 73 | + message = await Message.parse(self.signal_api, TestMessage.raw_data_message) |
56 | 74 | self.assertEqual(message.group, TestMessage.expected_group)
|
57 | 75 |
|
58 |
| - def test_read_reaction(self): |
59 |
| - message = Message.parse(TestMessage.raw_reaction_message) |
| 76 | + async def test_read_reaction(self): |
| 77 | + message = await Message.parse(self.signal_api, TestMessage.raw_reaction_message) |
60 | 78 | self.assertEqual(message.reaction, "👍")
|
61 | 79 |
|
| 80 | + @patch("aiohttp.ClientSession.get", new_callable=AsyncMock) |
| 81 | + async def test_attachments(self, mock_get): |
| 82 | + attachment_bytes_str = b"test" |
| 83 | + |
| 84 | + mock_response = AsyncMock(spec=aiohttp.ClientResponse) |
| 85 | + mock_response.raise_for_status = Mock() |
| 86 | + mock_response.content.read = AsyncMock(return_value=attachment_bytes_str) |
| 87 | + |
| 88 | + mock_get.return_value = mock_response |
| 89 | + |
| 90 | + expected_base64_bytes = base64.b64encode(attachment_bytes_str) |
| 91 | + expected_base64_str = str(expected_base64_bytes, encoding="utf-8") |
| 92 | + |
| 93 | + message = await Message.parse( |
| 94 | + self.signal_api, TestMessage.raw_attachment_message |
| 95 | + ) |
| 96 | + self.assertEqual(message.base64_attachments, [expected_base64_str]) |
| 97 | + |
62 | 98 | # User Chats
|
63 |
| - def test_parse_user_chat_message(self): |
64 |
| - message = Message.parse(TestMessage.raw_user_chat_message) |
| 99 | + async def test_parse_user_chat_message(self): |
| 100 | + message = await Message.parse( |
| 101 | + self.signal_api, TestMessage.raw_user_chat_message |
| 102 | + ) |
65 | 103 | self.assertEqual(message.source, TestMessage.expected_source)
|
66 | 104 | self.assertEqual(message.text, TestMessage.expected_text)
|
67 | 105 | self.assertEqual(message.timestamp, TestMessage.expected_timestamp)
|
|
0 commit comments