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) time_now = time_machine.travel( datetime.datetime(year=2020, month=5, day=25)) time_now.start() with patch('avia_ticket_bot.vk_api.bot_longpoll.VkBotLongPoll', return_value=long_poller_mock): bot = ChatBot('', '') bot.api = api_mock bot.send_image = Mock() bot.run() time_now.stop() 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_bot(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock logger_mock = Mock('chatbot.logger') logger_mock.debug = Mock() logger_mock.info = Mock() events = [] for input_text in self.INPUTS: event_row = deepcopy(self.RAW_EVENT) event_row['object']['text'] = input_text events.append(VkBotMessageEvent(raw=event_row)) longpoller_listen_mock = Mock() longpoller_listen_mock.listen = Mock(return_value=events) with patch('chatbot.VkBotLongPoll', return_value=longpoller_listen_mock): bot = Bot('', '', logger_mock) 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']) assert real_outputs == self.EXPECTED_OUTPUT
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): api_mock = Mock() send_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(raw=event)) long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch("vkbot.VkBotLongPoll", return_value=long_poller_mock): bot = VKBot("", "") bot.api = api_mock bot.run() assert send_mock.call_count == len(self.INPUTS) + 5 # метод get_flight отправляет юзеру 5 полетов дополнительно 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_run_ok(self): events = [] for input_text in self.INPUTS: event = deepcopy(self.RAW_EVENT) event['object']['message']['text'] = input_text events.append(VkBotMessageEvent(event)) send_mock = Mock() long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch('air_ticket_bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot(group_id='', group_token='') bot.api = Mock() bot.send_image = Mock() bot.api.messages.send = send_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']) # чтобы как-то упорядочить рандомную дату real_outputs[6] = settings.SCENARIOS['order_ticket']['steps']['step5'][ 'text'].format(result_flights_str=True) real_outputs[9] = settings.SCENARIOS['order_ticket']['steps']['step8'][ 'text'].format(name='Иван', departure='Москва', arrival='Лондон', flight_date_to_output=True, spaces='1') 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_IVENT) 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.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 handle(self, data): event = VkBotMessageEvent(data) msg = event.object if msg.text: id = str(msg.from_id) if id in self.pending(): try: to = random.choice([ x for x in self.pending() + self.done() if x != id and x not in self.targeted() ]) except IndexError: self.send('Люди закончились', msg.from_id) return with open(self.done_folder + id, 'w') as f: f.write(to) with open(self.targeted_folder + to, 'w') as f: f.write('') os.remove(self.pending_folder + id) self.send(f'vk.com/id{to}', msg.from_id) logger.info(f'NEW: {id} to {to}') elif id in self.done(): with open(self.done_folder + id, 'r') as f: to = f.read() self.send(f'vk.com/id{to}', msg.from_id) logger.info(f'repeat: {id} to {to}') else: self.send('Вы не в списке', msg.from_id)
def handle(self, data): event = data if type(event) is not VkBotMessageEvent: event = VkBotMessageEvent(event) msg = event.object with user_db: user = User.get_or_none(User.vk_id == str(msg.peer_id)) if user is None: logger.info(f'New user {msg.peer_id}') user_info = self.vk.users.get(user_ids=msg.peer_id)[0] first_name = user_info.get('first_name', '') last_name = user_info.get('last_name', '') user = User.create(vk_id=str(msg.peer_id), first_name=first_name, last_name=last_name, state=states.USER_NEW) try: handler = self.handlers.get(user.state, self.handle_other) handler(msg, user) logger.info(f'Handled by {handler.__name__} : {msg}') user.save() except Exception as e: logger.exception(e) self.set_user_state(user, user.state) self.send(f'Ошибка: {e}', msg.peer_id) logger.debug(f'No text: {msg}')
def test_on_translate(self): event = VkBotMessageEvent(raw=self.SEND_EVENT) with patch('bot.vk_api.VkApi'): # with patch('translator.translate', return_value='Test'): bot = Bot('', '') bot.translator = Mock() bot.translator.translate.return_value = 'Test' bot.on_translate(event) assert bot.translator.translate(event) == 'Test'
def test_on_event(self): event = VkBotMessageEvent(raw=td.RAW_EVENT) with patch('vk_bot.VkApi'): with patch('vk_bot.bot_longpoll.VkBotLongPoll'): with patch('vk_bot.Bot._on_message') as on_message_mock: bot = vk_bot.Bot('', '') bot._on_event(event=event) self.assertEqual(True, on_message_mock.called) on_message_mock.assert_called_with(event) # Проверяем обработку незнакомого ивента event.type = 'bad_event_for_test' with patch('vk_bot.bot_logger.debug') as logger_mock: bot._on_event(event=event) self.assertEqual(True, logger_mock.called) logger_mock.assert_called_with('Unknown event type %s', event.type)
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'])
async def main_loop(): async for event in lp.iter(): print(f'Got new event from vk!') event = VkBotEvent(event) if event.type == VkBotEventType.MESSAGE_NEW: event = VkBotMessageEvent(event.raw) action = event.message.get('action') if action is not None and action.get( 'type') == 'chat_invite_user': vk_bot = VkBot(event) vk_bot.text = HELP_MESSAGE await write_msg(vk_bot) else: vk_bot = VkBot(event) vk_bot.from_user = await get_user_title(vk_bot) vk_bot.chat_title = await get_chat_title(vk_bot) vk_bot.new_message() await write_msg(vk_bot) elif event.type == VkBotEventType.MESSAGE_EVENT: event = VkBotMessageEvent(event.raw) vk_bot = VkBot(event) vk_bot.from_user = await get_user_title(vk_bot) vk_bot.new_callback_answer() await edit_last_message(vk_bot)
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_run(self): count = 5 event = VkBotMessageEvent(raw=self.RAW_EVENT) events = Mock(return_value=[event] * count) long_poller_listen_mock = Mock() long_poller_listen_mock.listen = events with patch("vkbot.vk_api.VkApi"): with patch("vkbot.VkBotLongPoll", return_value=long_poller_listen_mock): bot_test = VKBot("", "") bot_test.event_receiver = Mock() bot_test.run() bot_test.event_receiver.assert_called() bot_test.event_receiver.assert_any_call(event) assert bot_test.event_receiver.call_count == count
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(self): event = VkBotMessageEvent(raw=self.RAW_EVENT) send_mock = Mock() with patch('chatbot_vk.vk_api.VkApi'): with patch('chatbot_vk.VkBotLongPoll'): bot = Bot('', '') bot.api = Mock() bot.api.messages.send = send_mock bot.on_event(event) send_mock.assert_called_once_with( message=self.RAW_EVENT['object']['text'], random_id=ANY, peer_id=self.RAW_EVENT['object']['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_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.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_run(self): count = 5 event = VkBotMessageEvent(raw=self.RAW_EVENT) events = [event] * count long_poller_mock = Mock() long_poller_mock.listen = Mock(return_value=events) with patch('avia_ticket_bot.vk_api.VkApi'): with patch('avia_ticket_bot.vk_api.bot_longpoll.VkBotLongPoll', return_value=long_poller_mock): bot = ChatBot('', '') bot.on_event = Mock() bot.send_image = Mock() bot.run() bot.on_event.assert_called() bot.on_event.assert_any_call(event=event) self.assertEqual(bot.on_event.call_count, count)
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_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_run_ok(self): send_mock = Mock() api_mock = Mock() api_mock.messages.send = send_mock api_mock.users.get = Mock(return_value=self.info_user) events = [] for input_text in self.IMPUTS: 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) generate_flights_mock = Mock() self.data_about_flights = {} self.data_about_flights["timetable_flights"] = self.timetable_flights self.data_about_flights[ "departure_cities_for_write"] = self.departure_cities_for_write self.data_about_flights["departure_cities"] = self.departure_cities generate_flights_mock.run = Mock(return_value=self.data_about_flights) with patch("chatbot_core.VkBotLongPoll", return_value=long_poller_mock): with patch("chatbot_core.GenerateFlights", return_value=generate_flights_mock): bot = Bot("", "") bot.api = api_mock bot.flight_schedule = self.timetable_flights bot.sent_image = Mock() bot.run() assert send_mock.call_count == len(self.IMPUTS) real_outputs = [] for call in send_mock.call_args_list: args, kwargs = call real_outputs.append(kwargs['message']) index = 0 for _ in range(len(self.EXPECTED_OUTPUTS)): self.assertEqual(real_outputs[index], self.EXPECTED_OUTPUTS[index], f"{real_outputs[index]}") index += 1
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_intents(self): send_message_mock = Mock() msg_event = deepcopy(td.RAW_EVENT) with patch('vk_bot.VkApi'), \ patch('vk_bot.bot_longpoll.VkBotLongPoll'): bot = vk_bot.Bot('', '') bot.send_message = send_message_mock for message_text, _ in td.INTENTS: msg_event['object']['message']['text'] = message_text bot._on_message(event=VkBotMessageEvent(raw=msg_event)) self.assertEqual(True, send_message_mock.called) self.assertEqual(len(td.INTENTS), send_message_mock.call_count) expected_calls = [ call(msg_event['object']['message']['peer_id'], response) for _, response in td.INTENTS ] send_message_mock.assert_has_calls(expected_calls, any_order=False)
def test_run_2(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('chat_bot.VkBotLongPoll', return_value=long_poller_mock): bot = Bot('', '') bot.api = api_mock bot.send_img = 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 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_scenario_ticket(self): send_message_mock = Mock() msg_event = deepcopy(td.RAW_EVENT) with patch('vk_bot.VkApi'), \ patch('vk_bot.bot_longpoll.VkBotLongPoll'), \ patch('skyscanner_api.get_flight', return_value=td.FLIGHT), \ patch('skyscanner_api.get_dates', return_value=['2021-02-12']), \ patch('skyscanner_api.get_city', side_effect=[None, td.ORIGIN, None, td.DEST], return_value=None): bot = vk_bot.Bot('', '') bot.send_message = send_message_mock for message_text, _ in td.INTENTS: msg_event['object']['message']['text'] = message_text bot._on_message(event=VkBotMessageEvent(raw=msg_event)) self.assertEqual(True, send_message_mock.called) self.assertEqual(len(td.INTENTS), send_message_mock.call_count) expected_calls = [ call(msg_event['object']['message']['peer_id'], response) for _, response in td.INTENTS ] send_message_mock.assert_has_calls(expected_calls, any_order=False)
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