-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtests.py
More file actions
106 lines (87 loc) · 3.65 KB
/
tests.py
File metadata and controls
106 lines (87 loc) · 3.65 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
from copy import deepcopy
from unittest import TestCase
from unittest.mock import patch, Mock, ANY
from pony.orm import db_session, rollback
import settings
from vk_api.bot_longpoll import VkBotMessageEvent
from generate_ticket import generate_ticket
from vk_bot import Bot
def isolated_db(test_func):
def wrapper(*args, **kwargs):
with db_session:
test_func(*args, **kwargs)
rollback()
return wrapper
class Test1(TestCase):
RAW_EVENT = {
'type': 'message_new',
'object': {'date': 1606715220, 'from_id': 515717314, 'id': 238, 'out': 0, 'peer_id': 515717314,
'text': 'Привет бот', 'conversation_message_id': 236, 'fwd_messages': [], 'important': False,
'random_id': 0,
'attachments': [], 'is_hidden': False},
'group_id': 200472146,
'event_id': '0dc98c8bacc0e4ca20920d94cdcb01ecc10318a6'}
def test_run(self):
count = 5
obj = {'a': 1}
event = [obj] * count # [obj, obj, ...]
long_poller_mock = Mock(return_value=event)
long_poller_listen_mock = Mock()
long_poller_listen_mock.listen = long_poller_mock
with patch('vk_bot.vk_api.VkApi'):
with patch('vk_bot.VkBotLongPoll', return_value=long_poller_listen_mock):
bot = Bot('', '')
bot.on_event = Mock()
bot.run()
bot.on_event.assert_called()
bot.on_event.assert_any_call(obj)
assert bot.on_event.call_count == count
INPUTS = [
'Привет',
'А когда?',
'Где будет конференция?',
'Зарегистрируй меня',
'Вениамин',
'мой адрес email@email',
'email@email.ru',
]
EXPECTED_OUTPUTS = [
settings.DEFAULT_ANSWER,
settings.INTENTS[0]['answer'],
settings.INTENTS[1]['answer'],
settings.SCENARIOS['registration']['steps']['step1']['text'],
settings.SCENARIOS['registration']['steps']['step2']['text'],
settings.SCENARIOS['registration']['steps']['step2']['failure_text'],
settings.SCENARIOS['registration']['steps']['step3']['text'].format(name='Вениамин', email='email@email.ru')
]
@isolated_db
def test_run_ok(self):
send_mock = Mock()
api_mok = Mock()
api_mok.messages.send = send_mock
events = []
for input_text in self.INPUTS:
event = deepcopy(self.RAW_EVENT)
event['object']['text'] = input_text
events.append(VkBotMessageEvent(event))
long_poller_mock = Mock()
long_poller_mock.listen = Mock(return_value=events)
with patch('vk_bot.VkBotLongPoll', return_value=long_poller_mock):
bot = Bot('', '')
bot.api = api_mok
bot.run()
assert send_mock.call_count == len(self.INPUTS)
real_outputs = []
for call in send_mock.call_args_list:
args, kwargs = call
real_outputs.append(kwargs['message'])
assert real_outputs == self.EXPECTED_OUTPUTS
def test_image_generation(self):
# with open('lesson_016/ticket/avatar.png', 'rb') as avatar_file:
# avatar_mock = Mock()
# avatar_mock.content = avatar_file.read()
# with patch('request.get', return_value=avatar_mock):
ticket_file = generate_ticket('Алексей', 'adwiz@suroviy.ru')
with open('lesson_016/ticket/ticket-example.png', 'rb') as expected_file:
expected_bytes = expected_file.read()
assert ticket_file.read() == expected_bytes