CRUD, FBA (FBV)

Для ускорения разработки CRUD операций, удобно использовать готовые функции (По аналогии с CBV в Django). Они находятся в модуле use и называются FBA (Functions Base Actions).

Список элементов на основе шаблона

list_action_example = use.list_action(
    Faq,
    template_name='demo/bot/list.html',
)

Пример теста

def test_list_action_example(bot_client, chat):
    """
    Test /list_action: success
    """
    chat = asserts.assert_command_was_handled(
        '/list_action',
        chat,
        bot_client,
    )
    assert 'list_action' in chats.get_last_message(chat).text

Список элементов на основе шаблона с пагинацией

list_action_pagination_example = use.list_action(
    Faq,
    template_name='demo/bot/list.html',
    pagination=use.list.Pagination(1, call_data_pattern='list_action_pagination {page}')
)

Пример теста

def test_list_action_pagination_example(bot_client, chat):
    """
    Test /list_action_pagination and call
    list_action_pagination <int:page>: success
    """
    chat = asserts.assert_command_was_handled(
        '/list_action_pagination',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'Как быстрее писать код для списка' in last_message.text
    asserts.assert_keyboard_in_message(last_message)

    chat = asserts.assert_call_was_handled(
        'list_action_pagination 2',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'Что это дает' in last_message.text
    asserts.assert_keyboard_in_message(last_message)

Один элемент с pk на основе шаблона

detail_action_example = use.detail_action(
    Faq,
    'demo/bot/detail.html',
)

Пример теста

def test_detail_action_example(bot_client, chat):
    """
    Test /detail_action/<int:pk>: success
    """
    # make FAQ
    chat = asserts.assert_command_was_handled(
        '/detail_action 1',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'detail_action' in last_message.text
    assert 'Использовать detail_action' in last_message.text

Сообщение на основе шаблона и контекста

template_action_example = use.template_action(
    'demo/bot/reply.html',
    context={
        'this': 'Это',
        'message': 'сообщение',
        'make': 'было создано по шаблону'
    }
)

Пример теста

def test_template_action_example(bot_client, chat):
    """
    Test /template_action: success
    """
    chat = asserts.assert_command_was_handled(
        '/template_action',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        '<b>Это</b> <i>сообщение</i> было создано по шаблону',
    )

Опрос на основе формы

def result_callback(bot, message):
    form = chats.get_note(message.chat, 'form')
    form.is_valid()
    data = form.cleaned_data
    first_name = data['first_name']
    last_name = data['last_name']
    middle_name = data['middle_name']
    result_text = f'Привет, {first_name} {last_name} {middle_name}'
    message_with_text = messages.create_message(result_text, sender=bot)
    chat = actions.send_message(message.chat, message_with_text)
    return chat


create_action_example = use.create_action(
    NameForm,
    result_callback,
)

Пример теста

def test_create_action_example(bot_client, chat):
    """
    Test /create_action
    """
    chat = asserts.assert_command_was_handled(
        '/create_action',
        chat,
        bot_client,
    )
    last_message = asserts.assert_chat_last_message_text_equal(
        chat,
        'Как бы вас звали на букву "Л"?:',
    )
    asserts.assert_keyboard_in_message(last_message)

    chat = asserts.assert_text_message_was_handled(
        'Имя',
        chat,
        bot_client,
    )

    error_message = chat.messages[-2]
    assert 'Неверно введено имя, пожалуйста введите снова:' == error_message.text

    chat = asserts.assert_text_message_was_handled(
        'Лорное Имя',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'Какой бы была ваша фамилия на букву "Л"?:' == last_message.text

    chat = asserts.assert_text_message_was_handled(
        'Фамилия',
        chat,
        bot_client,
    )
    error_message = chat.messages[-2]
    assert 'Неверно введена фамилия, пожалуйста введите снова:' == error_message.text

    chat = asserts.assert_text_message_was_handled(
        'Лорная Фамилия',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'Каким бы было ваше отчество на букву "Л"?:' == last_message.text

    chat = asserts.assert_text_message_was_handled(
        'Отчество',
        chat,
        bot_client,
    )
    error_message = chat.messages[-2]
    assert 'Неверно введено отчество, пожалуйста введите снова:' == error_message.text

    chat = asserts.assert_text_message_was_handled(
        'Лорное Отчество',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'Привет, Лорное Имя Лорная Фамилия Лорное Отчество' == last_message.text

    chat = asserts.assert_command_was_handled(
        '/start',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert 'Привет, Я Demo Bot' in last_message.text