def test_get_yes_no_filters_and_proceed(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)
    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text=YES)
    message.chat = chat
    update.message = message
    data = c.get_yes_no_filters_and_proceed(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.BUILD_FILTERS

    message = Message(1, timezone.now(), chat=chat, text=NO)
    message.chat = chat
    update.message = message
    data = c.get_yes_no_filters_and_proceed(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.BUILD_AGGREGATE_YES_NO
def test_get_mode_show_mode_options_w_f_and_c(mocker):
    log = logging.getLogger()
    c = ConvTestFiltersCommands(log, 'created_at', suffix='dev')
    c.set_chat_id(1)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)
    mocker.patch('os.listdir', return_value=["x.py"])

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1,
                      timezone.now(),
                      chat=chat,
                      text=BTN_CAPTION_BUILD_QUERY)
    message.chat = chat
    update.message = message
    data = c.get_mode_show_mode_options(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.BUILD_PERIOD

    message = Message(1,
                      timezone.now(),
                      chat=chat,
                      text=BTN_CAPTION_USE_SAVED_FILTER)
    message.chat = chat
    update.message = message
    data = c.get_mode_show_mode_options(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.SAVED_FILTER_SELECT

    message = Message(1,
                      timezone.now(),
                      chat=chat,
                      text=BTN_CAPTION_CUSTOM_MGMT)
    message.chat = chat
    update.message = message
    data = c.get_mode_show_mode_options(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.CUSTOM_MGMT_COMMAND_SELECT
def test_execute_command_exception(mocker):
    log = logging.getLogger()
    c = ConvTestFiltersCommands(log, 'created_at', suffix='dev')
    c.set_chat_id(1)
    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)
    mocker.patch(
        DJANGO_CALL_COMMAND,
        side_effect=Exception('ERROR'),
    )

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text='10')
    message.chat = chat
    update.message = message
    data = c.execute_custom_command(update, 'xx')
    assert mock.called
    assert mock.call_args[0] == ("``` Error xx:\nERROR ```", )
    assert data is False
    assert c.query_context == {
        'mode': '',
        'period': {
            'uom': '',
            'quantity': 0,
            'timedelta': None,
        },
        'filters': [],
        'aggregate': {
            'type': '',
            'property': '',
        },
        'saved': '',
        'custom_command': '',
    }
    def test_conversation_handler_per_user(self, dp, bot, user1):
        handler = ConversationHandler(entry_points=self.entry_points,
                                      states=self.states,
                                      fallbacks=self.fallbacks,
                                      per_chat=False)
        dp.add_handler(handler)

        # User one, starts the state machine.
        message = Message(0,
                          user1,
                          None,
                          self.group,
                          text='/start',
                          entities=[
                              MessageEntity(type=MessageEntity.BOT_COMMAND,
                                            offset=0,
                                            length=len('/start'))
                          ],
                          bot=bot)
        dp.process_update(Update(update_id=0, message=message))

        # The user is thirsty and wants to brew coffee.
        message.text = '/brew'
        message.entities[0].length = len('/brew')
        dp.process_update(Update(update_id=0, message=message))

        # Let's now verify that for the same user in a different group, the state will still be
        # updated
        message.chat = self.second_group
        message.text = '/pourCoffee'
        message.entities[0].length = len('/pourCoffee')
        dp.process_update(Update(update_id=0, message=message))

        assert handler.conversations[(user1.id, )] == self.DRINKING
def test_get_mode_show_mode_options(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1,
                      timezone.now(),
                      chat=chat,
                      text=BTN_CAPTION_BUILD_QUERY)
    message.chat = chat
    update.message = message
    data = c.get_mode_show_mode_options(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.BUILD_PERIOD

    message = Message(1,
                      timezone.now(),
                      chat=chat,
                      text=BTN_CAPTION_USE_SAVED_FILTER)
    message.chat = chat
    update.message = message
    data = c.get_mode_show_mode_options(update, None)

    assert mock.called
    assert mock.call_args[0] == (
        '``` No saved filters found for this command ```', )
    assert data == ConversationHandler.END

    message = Message(1,
                      timezone.now(),
                      chat=chat,
                      text=BTN_CAPTION_CUSTOM_MGMT)
    message.chat = chat
    update.message = message
    data = c.get_mode_show_mode_options(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == ConversationHandler.END
def test_get_yes_no_aggregate_and_proceed(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)
    c.set_query_period_uom(WEEKS)
    c.set_query_period_quantity(10)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text=YES)
    message.chat = chat
    update.message = message
    data = c.get_yes_no_aggregate_and_proceed(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.BUILD_AGGREGATE

    fake_data = MockSet()
    for _i in range(1, 15):
        fake_data.add(
            MockModel(
                mock_name=f'name{_i}',
                id=f'id{_i}',
                name=f'name{_i}',
                status='pending',
                created_at=timezone.now(),
            ))

    mocker.patch(
        INITIAL_QUERY_SET_METHOD,
        return_value=fake_data,
    )

    message = Message(1, timezone.now(), chat=chat, text=NO)
    message.chat = chat
    update.message = message
    data = c.get_yes_no_aggregate_and_proceed(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == ConversationHandler.END
def test_get_saved_filter_and_proceed_no_user(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.model = MockModel
    c.get_saved_filter = lambda x: 1
    mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text='saved_filter')
    message.chat = chat
    update = Update(1)
    update.message = message
    data = c.get_saved_filter_and_proceed(update, None)
    assert data is None
def test_get_saved_filter_and_proceed_no_filter_method(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.model = MockModel
    c.set_chat_id(1)
    mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text='unknown')
    message.chat = chat
    update.message = message

    with pytest.raises(SavedFilterNotFound):
        c.get_saved_filter_and_proceed(update, None)
def test_cancel(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat)
    message.chat = chat
    update.message = message
    data = c.cancel(update, None)

    assert mock.called
    assert mock.call_args[0] == ('``` End of conversation ```', )
    assert data == ConversationHandler.END
def test_show_mode_select(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat)
    message.chat = chat
    update.message = message
    data = c.show_mode_select(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.MODE_SELECTOR
def test_show_list_of_commands(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text=WEEKS)
    message.chat = chat
    update.message = message
    data = c.show_list_of_commands(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == ConversationHandler.END
def test_get_aggregate_and_proceed_unknown(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_query_period_uom(WEEKS)
    c.set_query_period_quantity(10)
    c.set_chat_id(1)
    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text='unknown')
    message.chat = chat
    update.message = message

    data = c.get_aggregate_and_proceed(update, None)

    assert mock.called
    assert mock.call_args[0] == ('``` End of conversation ```', )
    assert data == ConversationHandler.END
def test_get_period_uom_show_quantity(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text=WEEKS)
    message.chat = chat
    update.message = message
    data = c.get_period_uom_show_quantity(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == TelegramConversation.STATUS.BUILD_PERIOD_QUANTITY
    assert c.query_period_uom == WEEKS
def test_get_aggregate_and_proceed_sum(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_query_period_uom(WEEKS)
    c.set_query_period_quantity(10)
    c.set_chat_id(1)
    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text=SUM)
    message.chat = chat
    update.message = message

    data = c.get_aggregate_and_proceed(update, None)

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data == c.STATUS.BUILD_AGGREGATE_SUM_PROPERTY
    assert c.aggregate_type == SUM
def test_empty_queryset(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.model = FakeModel
    c.set_chat_id(1)
    c.set_query_period_uom(WEEKS)
    c.set_query_period_quantity(1)
    c.add_query_filter('status', 'pending')
    c.set_query_mode(BTN_CAPTION_BUILD_QUERY)

    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text=COUNT)
    message.chat = chat
    update.message = message

    c.run_query(update)

    assert mock.call_args[0] == (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    def test_conversation_handler_per_user(self, dp, bot, user1):
        handler = ConversationHandler(
            entry_points=self.entry_points,
            states=self.states,
            fallbacks=self.fallbacks,
            per_chat=False)
        dp.add_handler(handler)

        # User one, starts the state machine.
        message = Message(0, user1, None, self.group, text='/start', bot=bot)
        dp.process_update(Update(update_id=0, message=message))

        # The user is thirsty and wants to brew coffee.
        message.text = '/brew'
        dp.process_update(Update(update_id=0, message=message))

        # Let's now verify that for the same user in a different group, the state will still be
        # updated
        message.chat = self.second_group
        message.text = '/pourCoffee'
        dp.process_update(Update(update_id=0, message=message))

        assert handler.conversations[(user1.id,)] == self.DRINKING
def test_get_custom_command_and_execute(mocker):
    log = logging.getLogger()
    c = ConvTest(log, 'created_at', suffix='dev')
    c.set_chat_id(1)
    c.model = MockModel

    def x(*args, **kwargs):
        #  empty function to patch custom mgmt command
        pass

    c.execute_custom_command = x

    mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)
    mocker.patch('os.listdir', return_value=["x.py"])

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text='x')
    message.chat = chat
    update.message = message
    data = c.get_custom_command_and_execute(update, None)

    assert data == ConversationHandler.END
    assert c.custom_command == 'x'
def test_execute_custom_command(mocker):
    log = logging.getLogger()
    c = ConvTestFiltersCommands(log, 'created_at', suffix='dev')
    c.set_chat_id(1)
    mock = mocker.patch(TELEGRAM_REPLY_METHOD, return_value=None)
    mocker.patch(
        DJANGO_CALL_COMMAND,
        return_value=True,
    )

    update = Update(1)
    chat = Chat(1, 'user')
    message = Message(1, timezone.now(), chat=chat, text='10')
    message.chat = chat
    update.message = message
    data = c.execute_custom_command(update, 'xx')

    assert mock.called
    assert mock.call_args[0] != (
        f'``` {TelegramConversation.EMPTY_RESULT} ```', )
    assert data is True
    assert c.query_context == {
        'mode': '',
        'period': {
            'uom': '',
            'quantity': 0,
            'timedelta': None,
        },
        'filters': [],
        'aggregate': {
            'type': '',
            'property': '',
        },
        'saved': '',
        'custom_command': '',
    }
示例#19
0
    def test_dispatcher_integration_handlers(self, caplog, bot,
                                             base_persistence, chat_data,
                                             user_data):
        def get_user_data():
            return user_data

        def get_chat_data():
            return chat_data

        base_persistence.get_user_data = get_user_data
        base_persistence.get_chat_data = get_chat_data
        # base_persistence.update_chat_data = lambda x: x
        # base_persistence.update_user_data = lambda x: x
        updater = Updater(bot=bot,
                          persistence=base_persistence,
                          use_context=True)
        dp = updater.dispatcher

        def callback_known_user(update, context):
            if not context.user_data['test1'] == 'test2':
                pytest.fail('user_data corrupt')

        def callback_known_chat(update, context):
            if not context.chat_data['test3'] == 'test4':
                pytest.fail('chat_data corrupt')

        def callback_unknown_user_or_chat(update, context):
            if not context.user_data == {}:
                pytest.fail('user_data corrupt')
            if not context.chat_data == {}:
                pytest.fail('chat_data corrupt')
            context.user_data[1] = 'test7'
            context.chat_data[2] = 'test8'

        known_user = MessageHandler(Filters.user(user_id=12345),
                                    callback_known_user,
                                    pass_chat_data=True,
                                    pass_user_data=True)
        known_chat = MessageHandler(Filters.chat(chat_id=-67890),
                                    callback_known_chat,
                                    pass_chat_data=True,
                                    pass_user_data=True)
        unknown = MessageHandler(Filters.all,
                                 callback_unknown_user_or_chat,
                                 pass_chat_data=True,
                                 pass_user_data=True)
        dp.add_handler(known_user)
        dp.add_handler(known_chat)
        dp.add_handler(unknown)
        user1 = User(id=12345, first_name='test user', is_bot=False)
        user2 = User(id=54321, first_name='test user', is_bot=False)
        chat1 = Chat(id=-67890, type='group')
        chat2 = Chat(id=-987654, type='group')
        m = Message(1, user1, None, chat2)
        u = Update(0, m)
        with caplog.at_level(logging.ERROR):
            dp.process_update(u)
        rec = caplog.records[-1]
        assert rec.msg == 'No error handlers are registered, logging exception.'
        assert rec.levelname == 'ERROR'
        rec = caplog.records[-2]
        assert rec.msg == 'No error handlers are registered, logging exception.'
        assert rec.levelname == 'ERROR'
        m.from_user = user2
        m.chat = chat1
        u = Update(1, m)
        dp.process_update(u)
        m.chat = chat2
        u = Update(2, m)

        def save_chat_data(data):
            if -987654 not in data:
                pytest.fail()

        def save_user_data(data):
            if 54321 not in data:
                pytest.fail()

        base_persistence.update_chat_data = save_chat_data
        base_persistence.update_user_data = save_user_data
        dp.process_update(u)

        assert dp.user_data[54321][1] == 'test7'
        assert dp.chat_data[-987654][2] == 'test8'