def test_on_event(self): """ Тестирование осноной функции on_event """ send_mock = Mock() api_mock = Mock() api_mock.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("bot.VkBotLongPoll", return_value=long_poller_mock): with patch("api_yandex.forming_answer", return_value=self.LIST_FLIGHTS): bot = Bot("", "") bot.api = api_mock bot.send_image = Mock() 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.ANSWER
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock events = [] for input_text in self.INPUTS: event = deepcopy(self.RAW_EVENT) event['object']['text'] = input_text events.append(VkBotEvent(event)) long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch('bot.VkBotLongPoll', return_value=long_poller_mock): test_bot = Bot('', '') test_bot.api = api_mock test_bot.send_image = Mock() test_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']) # для удобной проверки # for real, expec in zip(real_outputs, self.EXPECTED_OUTPUTS): # print(real) # print('-' * 50) # print(expec) # print('-' * 50) # print(real == expec) # print('_' * 50) assert real_outputs == self.EXPECTED_OUTPUTS
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock events = [] for input_text in self.INPUTS: event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = input_text events.append(VkBotEvent(event)) long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch('bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock bot.send_image = Mock() 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_on_event(self): event = VkBotMessageEvent(raw=self.RAW_EVENT) send_mock = Mock() with patch("bot.vk_api.VkApi"): with patch("bot.VkBotLongPoll"): bot = Bot("", "") bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( peer_id=self.RAW_EVENT['object']['peer_id'], message=self.RAW_EVENT['object']['text'], random_id=ANY)
def test_on_event(self): # проверяем на стандартный ответ event = VkBotMessageEvent(self.RAW_EVENT) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message=f"Наберите команду - /help для помощи", random_id=ANY, peer_id=self.RAW_EVENT['object']['message']['peer_id'])
def test_on_event(self): event = VkBotMessageEvent(raw=self.SEND_EVENT) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.on_translate = Mock( return_value=self.GET_EVENT['object']['text']) bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message=self.GET_EVENT['object']['text'], random_id=ANY, peer_id=self.GET_EVENT['object']['peer_id'])
def test_fail_city_out_action( self): # проверка списка доступных город для отправлений user_id = self.RAW_EVENT['object']['message']['peer_id'] send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.fail_city_out_action(user_id) send_mock.assert_called_once_with( message='\nМосква\nПариж\nСанкт-петербург\nНью-йорк', random_id=ANY, peer_id=user_id)
def test_on_event(self): # TODO не понимаю почему тест остался в рабочем состоянии, возможно я его в принципе не правильно написала """проверить работу каждой функции на каждый step""" event = VkBotMessageEvent(raw=self.ROW_EVENT) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() text = settings.DEFAULT_ANSWERS bot.api.messages.send = send_mock bot.on_event(event=event) send_mock.assert_called_once_with( message=text, random_id=ANY, peer_id=self.ROW_EVENT['object']['message']['peer_id'])
def test_on_event_ticket(self): event = VkBotMessageEvent(raw=self.RUN_SCENARIO) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.vk_api.bot_longpoll.VkBotLongPoll', ): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message="Для поиска билетов укажите город отправления", random_id=ANY, peer_id=self.RAW_EVENT['object']['message']['peer_id'], )
def test_on_event(self): event = VkBotMessageEvent(raw=self.RAW_EVENT) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.vk_api.bot_longpoll.VkBotLongPoll', ): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message=DEFAULT_ANSWER, random_id=ANY, peer_id=self.RAW_EVENT['object']['message']['peer_id'], )
def test_on_event1(self): # проверка на ответ после /ticket event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = '/ticket' event = VkBotMessageEvent(event) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message= f"\nВы запустили помощника для заказа билета на самолет \nВведите Ваше имя: ", random_id=ANY, peer_id=self.RAW_EVENT['object']['message']['peer_id'])
def test_on_event(self): event = VkBotMessageEvent(raw=self.RAW_EVENT) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot._on_event(event) send_mock.assert_called_once() send_mock.assert_called_once_with( message='Ты отправил -> ' + self.RAW_EVENT['object']['message']['text'], random_id=ANY, peer_id=self.RAW_EVENT['object']['message']['peer_id'])
def test_on_event2(self): # проверка на ответ после /help event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = '/help' event = VkBotMessageEvent(event) send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message= f"Это чат-бот предназначенный для заказа билета на самолет, чтобы заказать " f"билет включите помощника командой - /ticket, чтобы в процессе заказа начать" f" заново -наберите также - /ticket", random_id=ANY, peer_id=self.RAW_EVENT['object']['message']['peer_id'])
def test_bot_run_scenario(self): events = [] for input_line in self.INPUTS: event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = input_line events.append(VkBotMessageEvent(event)) send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) tickets_api_mock = Mock() tickets_api_mock.get_tickets = Mock(return_value=self.FAKE_FLIGHTS) tickets_api_mock.get_departure_locations = self.DEPARTURES tickets_api_mock.get_arrival_locations = self.ARRIVALS tickets_api_mock.is_route_available = Mock(return_value=True) with patch('bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock bot.tickets_api = tickets_api_mock bot.departures = tickets_api_mock.get_departure_locations bot.arrivals = tickets_api_mock.get_arrival_locations bot.run() actual_results = [] for call in send_mock.call_args_list: args, kwargs = call actual_results.append(kwargs['message']) assert actual_results == BotTester.EXPECTED_OUTPUTS assert send_mock.call_count == len(BotTester.EXPECTED_OUTPUTS) with self.assertRaises(BaseException): bot.send_mock.assert_not_called() with self.assertRaises(BaseException): bot.send_mock.assert_called_with('some message')
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock events = [] for input_text in self.INPUTS: event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = input_text events.append(VkBotMessageEvent(event)) long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch('bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock bot.default_answer_method = [Mock(), Mock()] bot.run() assert send_mock.call_count == len(self.INPUTS) real_outputs = [] output_iterator = iter(self.EXPECTED_CORRECT_OUTPUTS) for call in send_mock.call_args_list: args, kwargs = call print(f'Реальный ответ: {kwargs["message"]}\n') try: print(f'Ожидаемый ответ: {next(output_iterator)}\n') except StopIteration: pass real_outputs.append(kwargs['message']) assert all([ x[0].startswith(x[1]) for x in zip(real_outputs[1:], self.EXPECTED_CORRECT_OUTPUTS) ]) assert sum([mock.call_count for mock in bot.default_answer_method]) == 1
def test_correct_check( self): # проверка правильности вывода введеных данных user_id = self.RAW_EVENT['object']['message']['peer_id'] state = Mock() state.context = self.CONTEXT send_mock = Mock() with patch('bot.vk_api.VkApi'): with patch('bot.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.correct_check(user_id, state) send_mock.assert_called_once_with( message= '\nгород отправления: \nМосква\n \nгород назначения: \nСанкт-петербург\n\nдата отправления:' ' \n14-05-2020\n\nномер рейса: \n№5\n\nвремя отправления: \n14:00\n\nколичество мест:' ' \n4\n\nваш комментарий:\n1\n', random_id=ANY, peer_id=user_id)
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock ya_mock = Mock() ya_request_mock = Mock(return_value=next(self.request_answer())) ya_mock.request_ya_rasp = ya_request_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('bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot() bot.api = api_mock bot.send_image = Mock() ya_rasp.request_ya_rasp = ya_request_mock 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']) for c, i in enumerate(real_outputs): if real_outputs[c] != self.EXPECTED_OUTPUTS[c]: print(real_outputs[c], ' real') print(self.EXPECTED_OUTPUTS[c], ' expected') assert real_outputs == self.EXPECTED_OUTPUTS
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.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('bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock 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']) for index, (real, expec) in enumerate( zip(real_outputs, self.EXPECTED_OUTPUTS)): print('Ввод: ', self.INPUTS[index]) print('-' * 50) print('Что пришло - ', real) print('-' * 50) print('Что ожидалось - ', expec) print('-' * 50) print('Всё верно? - ', real == expec) print('=' * 50) assert real_outputs == self.EXPECTED_OUTPUTS
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock events = [] for input_text in self.INPUTS: event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = input_text events.append(VkBotEvent(event)) long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch("bot.VkBotLongPoll", return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock bot.send_image = Mock() bot.run() EXPECTED_OUTPUTS = [ settings.DEFAULT_ANSWER, settings.SCENARIOS['registration']['steps']['step1']['text'], settings.SCENARIOS['registration']['steps']['step1']['failure_text'], settings.SCENARIOS['registration']['steps']['step2']['text'], settings.SCENARIOS['registration']['steps']['step2']['failure_text'], settings.SCENARIOS['registration']['steps']['step3']['text'], settings.SCENARIOS['registration']['steps']['step3']['failure_text'], settings.SCENARIOS['registration']['steps']['step4']['text'].format(city_from='Москва', city_to='Лондон', input_date='11-01-2021', list=handlers.check_flights( 'Москва', 'Лондон')), settings.SCENARIOS['registration']['steps']['step4']['failure_text'], settings.SCENARIOS['registration']['steps']['step5']['text'].format(city_from='Москва', city_to='Лондон', flight_date='13-12-9666', flight='666'), settings.SCENARIOS['registration']['steps']['step5']['failure_text'], settings.SCENARIOS['registration']['steps']['step6']['text'].format(quantity='3'), settings.SCENARIOS['registration']['steps']['step7']['text'].format(city_from='Москва', city_to='Лондон', flight_date='13-12-9666', flight='666', quantity='3', comment='коммент'), settings.SCENARIOS['registration']['steps']['step7']['failure_text'], settings.SCENARIOS['registration']['steps']['step8']['text'], settings.SCENARIOS['registration']['steps']['step8']['failure_text'], settings.SCENARIOS['registration']['steps']['step9']['text'], settings.SCENARIOS['registration']['steps']['step9']['failure_text'], settings.SCENARIOS['registration']['steps']['step10']['text'].format(city_from='Москва', city_to='Лондон', flight_date='13-12-9666', quantity='3', phone='89253263240', name='Василий'), ] 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 str(real_outputs) == str(EXPECTED_OUTPUTS)
class TestBot(unittest.TestCase): bot = Bot(BotSettings) def test_loading(self): with self.assertLogs(self.bot.logger, level='INFO') as cm: self.bot = Bot(BotSettings, logger=self.bot.logger) self.assertIn(f'INFO:{self.bot.logger.name}:Initializing bot', cm.output) self.assertIn(f'INFO:{self.bot.logger.name}:Initializing vk clients', cm.output) self.assertIn(f'INFO:{self.bot.logger.name}:Loading plugins', cm.output) def test_methods(self): result = self.bot.do(self.bot.api.groups.getById(group_id=1)) self.assertNotIn(result, (False, None)) count = 4 result = self.bot.do(self.bot.api.messages.get(count=count)) self.assertNotIn(result, (False, None)) self.assertIn("items", result) self.assertEqual(len(result['items']), count) result = self.bot.do(self.bot.api().messages.get(count=1)) self.assertNotIn(result, (False, None)) result = self.bot.do( self.bot.api(wait=Wait.CUSTOM).messages.get(count=1)) self.assertEqual(asyncio.isfuture(result), True) self.bot.loop.run_until_complete(result) self.assertEqual(result.done(), True) self.assertNotIn(result.result(), (False, None)) def test_longpoll(self): task = self.bot.longpoll_run(True) async def bot_killer(): await asyncio.sleep(5) self.bot.stop_bot() asyncio.ensure_future(bot_killer(), loop=self.bot.loop) with self.assertLogs(self.bot.logger, level='INFO') as cm: with self.assertRaises(asyncio.CancelledError): self.bot.loop.run_until_complete(task) self.assertEqual( cm.output, [f'INFO:{self.bot.logger.name}:Attempting to turn bot off']) def test_callback(self): task = self.bot.callback_run(True) async def bot_killer(): await asyncio.sleep(5) self.bot.stop_bot() asyncio.ensure_future(bot_killer(), loop=self.bot.loop) with self.assertLogs(self.bot.logger, level='INFO') as cm: with self.assertRaises(asyncio.CancelledError): self.bot.loop.run_until_complete(task) self.assertEqual( cm.output, [f'INFO:{self.bot.logger.name}:Attempting to turn bot off']) def test_errors(self): with self.assertLogs(self.bot.logger, level='ERROR') as cm: self.bot.do(self.bot.api.messages.send()) self.assertIn( r"ERROR:sketal:Errors while executing vk method: {'code': 100, 'method': 'messages.send', 'error_msg': 'One of the parameters specified was missing or invalid: you should specify peer_id, user_id, domain, chat_id or user_ids param'}, {'code': 100, 'method': 'execute', 'error_msg': 'One of the parameters specified was missing or invalid: you should specify peer_id, user_id, domain, chat_id or user_ids param'}", cm.output) def test_upload(self): with open("docs/image_for_tests.png", "rb") as f: result = self.bot.do(upload_photo(self.bot.api, f.read())) self.assertIsNotNone(result) self.assertNotEqual(result.url, "") self.bot.do( self.bot.api.photos.delete(owner_id=result.owner_id, photo_id=result.id)) with open("docs/image_for_tests.png", "rb") as f: result = self.bot.do( upload_doc(self.bot.api, f.read(), "image.png")) self.assertIsNotNone(result) self.assertNotEqual(result.url, "") self.bot.do( self.bot.api.docs.delete(owner_id=result.owner_id, doc_id=result.id)) def test_mass_method(self): async def work(): with self.bot.api.mass_request(): tasks = [] for _ in range(70): tasks.append(await self.bot.api(wait=Wait.CUSTOM ).messages.get(count=1)) while tasks: await asyncio.sleep(0.01) task = tasks.pop() if task.done(): continue tasks.append(task) self.bot.do(work()) def test_accumulative_methods(self): async def work(): sender = self.bot.api.get_default_sender("wall.getById") with self.bot.api.mass_request(): tas1 = await self.bot.api.method_accumulative( "wall.getById", {}, {"posts": "-145935681_515"}, sender=sender, wait=Wait.CUSTOM) tas2 = await self.bot.api.method_accumulative( "wall.getById", {}, {"posts": "-145935681_512"}, sender=sender, wait=Wait.CUSTOM) tas3 = await self.bot.api.method_accumulative( "wall.getById", {}, {"posts": "-145935681_511"}, sender=sender, wait=Wait.CUSTOM) if tas1 is False and tas2 is False and tas3 is False: return await asyncio.gather(tas1, tas2, tas3, loop=self.bot.loop, return_exceptions=True) self.assertEqual(tas1.result()["id"], 515) self.assertEqual(tas2.result()["id"], 512) self.assertEqual(tas3.result()["id"], 511) self.bot.do(work())
def test_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock self.make_errors() text_data = self.collect_ticket_data() expected_outputs = [ settings.INTENTS[0]['answer'], settings.INTENTS[1]['answer'], settings.DEFAULT_ANSWER, settings.SCENARIOS['make a ticket']['steps']['step_1']['text'], settings.SCENARIOS['make a ticket']['steps']['step_1'] ['failure_text'].format(error=self.errors['err_dep_city']), settings.SCENARIOS['make a ticket']['steps']['step_2']['text'], settings.SCENARIOS['make a ticket']['steps']['step_2'] ['failure_text'].format(error=self.errors['err_dest_city_1']), settings.SCENARIOS['make a ticket']['steps']['step_2'] ['failure_text'].format(error=self.errors['err_dest_city_2']), settings.SCENARIOS['make a ticket']['steps']['step_3']['text'], settings.SCENARIOS['make a ticket']['steps']['step_3'] ['failure_text'].format(error=self.errors['err_date_1']), settings.SCENARIOS['make a ticket']['steps']['step_3'] ['failure_text'].format(error=self.errors['err_date_2']), settings.SCENARIOS['make a ticket']['steps']['step_3'] ['failure_text'].format(error=self.errors['err_date_3']), settings.SCENARIOS['make a ticket']['steps']['step_4'] ['text'].format(flights=self.flight_data['flights']), settings.SCENARIOS['make a ticket']['steps']['step_4'] ['failure_text'].format(error=self.errors['err_flight_number_1']), settings.SCENARIOS['make a ticket']['steps']['step_5']['text'], settings.SCENARIOS['make a ticket']['steps']['step_5'] ['failure_text'], settings.SCENARIOS['make a ticket']['steps']['step_6']['text'], settings.SCENARIOS['make a ticket']['steps']['step_7']['text'], settings.SCENARIOS['make a ticket']['steps']['step_7'] ['failure_text'], settings.SCENARIOS['make a ticket']['steps']['step_8'] ['text'].format(input_data=text_data), settings.SCENARIOS['make a ticket']['steps']['step_9']['text'], settings.SCENARIOS['make a ticket']['steps']['step_9'] ['failure_text'].format(error=self.errors['err_phone_number_1']), settings.SCENARIOS['make a ticket']['steps']['step_10']['text'], ] events = [] for input_text in self.INPUTS.values(): 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('bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock bot.send_image = Mock() 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 == expected_outputs