Базовое применение

Файл conftest.py. Настройка Fixtures для pytest

from pytest import fixture
from telegram_framework.test import asserts


@fixture
def bot_client():
    client = asserts.prepare_client()
    return client


@fixture
def chat(bot_client):  # pylint: disable=redefined-outer-name
    return asserts.prepare_chat(bot_client, 'demo.links')

Отправка текстового сообщения

def send_text_message_example(bot, message):
    text = 'Пример отправки обычного текстового сообщения'
    text_message = messages.create_message(
        text=text,
        sender=bot,
    )
    return actions.send_message(message.chat, text_message)

Пример теста

def test_send_text_message_example(bot_client, chat):
    """
    Test /text_message: success
    """
    chat = asserts.assert_command_was_handled(
        '/text_message',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        'Пример отправки обычного текстового сообщения',
    )

Отправка текстового сообщения в формате HTML

def send_html_message_example(bot, message):
    text = '<b>Пример</b> <i>отправки</i> <s>текстового</s> HTML сообщения'
    text_message = messages.create_message(
        text=text,
        sender=bot,
        format_type='HTML',
    )
    return actions.send_message(message.chat, text_message)

Пример теста

def test_send_html_message_example(bot_client, chat):
    """
    Test /html_message: success
    """
    chat = asserts.assert_command_was_handled(
        '/html_message',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        '<b>Пример</b> <i>отправки</i> <s>текстового</s> HTML сообщения',
    )

Рендеринг шаблона в формате HTML

def render_template_example(bot, message):
    context = {
        'this': 'Это',
        'message': 'сообщение',
        'make': 'было создано по шаблону'
    }
    response_message = messages.create_template_message(
        sender=bot,
        template='demo/bot/reply.html',
        context=context,
    )
    return actions.send_message(message.chat, response_message)

Пример теста

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

Отправка ответа на сообщение

def echo_answer_example(bot, message):
    text = f'На любое неизвестное сообщение я умею присылать его в ответ: {message.text}'
    echo_reply = messages.create_reply(message, text, bot)
    return actions.send_reply(echo_reply)

Пример теста

def test_echo_answer_example(bot_client, chat):
    """
    Test send any text message: success
    """
    text = 'any message'
    chat = asserts.assert_text_message_was_handled(
        text,
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
         f'На любое неизвестное сообщение я умею присылать его в ответ: {text}',
    )

Ответ на конкретное сообщение

def fixed_text_answer_example(bot, message):
    text = f'На сообщение {message.text}, я даю фиксированный ответ: Пожалуйста'
    reply = messages.create_reply(message, text, bot)
    return actions.send_reply(reply)

Пример теста

def test_fixed_text_answer_example(bot_client, chat):
    """
    Test send "Спасибо бот": success
    """
    text = 'Спасибо бот'
    chat = asserts.assert_text_message_was_handled(
        text,
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
         f'На сообщение {text}, я даю фиксированный ответ: Пожалуйста',
    )

Ответ на сообщение содержащее текст

def contains_text_answer_example(bot, message):
    text = 'На сообщение содержащее "Привет", я говорю "И тебе привет"'
    reply = messages.create_reply(message, text, bot)
    return actions.send_reply(reply)

Пример теста

def test_contains_text_answer_example(bot_client, chat):
    """
    Test send "Спасибо бот": success
    """
    text = 'Привет бот'
    chat = asserts.assert_text_message_was_handled(
        text,
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
         'На сообщение содержащее "Привет", я говорю "И тебе привет"',
    )

Отправка изображения

def send_picture_example(bot, message):
    file_path = Path(settings.BASE_DIR) / 'static' / 'logo_1280_640.png'
    image = messages.create_image(bot, file_path)
    return actions.send_image(message.chat, image)

Пример теста

def test_send_picture_example(bot_client, chat):
    """
    Test /send_picture: success
    """
    chat = asserts.assert_command_was_handled(
        '/send_picture',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert isinstance(last_message, messages.Image)
    assert 'logo_1280_640.png' in str(last_message.file_path)

Отправка изображения с заголовком

def send_picture_with_caption_example(bot, message):
    file_path = Path(settings.BASE_DIR) / 'static' / 'logo_1280_640.png'
    caption = messages.create_message('Это логотипы DTF', bot)
    image = messages.create_image(bot, file_path, caption)
    return actions.send_image(message.chat, image)

Пример теста

def test_send_picture_with_caption_example(bot_client, chat):
    """
    Test /send_picture_with_caption: success
    """
    chat = asserts.assert_command_was_handled(
        '/send_picture_with_caption',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert last_message.caption is not None
    assert 'Это логотипы DTF' == last_message.caption.text

Отправка изображения с заголовком в формате HTML

def send_picture_with_html_caption_example(bot, message):
    file_path = Path(settings.BASE_DIR) / 'static' / 'logo_1280_640.png'
    caption = messages.create_message(
        'Это логотипы <b>DTF</b>',
        bot,
        format_type='HTML'
    )
    image = messages.create_image(bot, file_path, caption)
    return actions.send_image(message.chat, image)

Пример теста

def test_send_picture_with_html_caption_example(bot_client, chat):
    """
    Test /send_picture_with_caption: success
    """
    chat = asserts.assert_command_was_handled(
        '/send_picture_with_html_caption',
        chat,
        bot_client,
    )
    last_message = chats.get_last_message(chat)
    assert last_message.caption is not None
    assert 'Это логотипы <b>DTF</b>' == last_message.caption.text

Получение данных пользователя

def get_user_data_example(bot, message):
    user_data = message.sender.user_data
    user_id = user_data.id
    first_name = user_data.first_name if user_data.first_name else 'скрыто'
    last_name = user_data.last_name if user_data.last_name else 'скрыта'
    username = user_data.username if user_data.username else 'скрыто'
    response_message = messages.create_message(
        text=f'Ваш telegram id: {user_id}\n'
             f'Ваше имя: {first_name}\n'
             f'Ваша фамилия: {last_name}\n'
             f'Ваше имя пользователя {username}',
        sender=bot,
    )
    return actions.send_message(message.chat, response_message)

Пример теста

def test_get_user_data_example(chat):
    """
    Test /get_user_data: success
    """
    client_data = UserData(
        123,
        'Client',
        'Test',
        'client',
    )
    client = bots.get_bot(123, client_data)
    chat = asserts.assert_command_was_handled(
        '/get_user_data',
        chat,
        client=client
    )
    asserts.assert_chat_last_message_text_equal(chat, f'Ваш telegram id: {client_data.id}\n'
                                              f'Ваше имя: {client_data.first_name}\n'
                                              f'Ваша фамилия: {client_data.last_name}\n'
                                              f'Ваше имя пользователя {client_data.username}')

def test_get_user_data_not_full(bot_client, chat):
    """
    Test /get_user_data: success not full user data
    """
    chat = asserts.assert_command_was_handled(
        '/get_user_data',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        f'Ваш telegram id: {bot_client.user_data.id}\n'
             f'Ваше имя: скрыто\nВаша фамилия: скрыта\n'
             f'Ваше имя пользователя скрыто')

Пример команды с параметром

def send_param_text_message_example(bot, message, param):
    text = f'Пример отправки обычного текстового сообщения с параметром "{param}"'
    text_message = messages.create_message(
        text=text,
        sender=bot,
    )
    return actions.send_message(message.chat, text_message)

Пример теста

def test_send_param_text_message_example(bot_client, chat):
    """
    Test /param_text_message <str:param>: success
    """
    chat = asserts.assert_command_was_handled(
        '/param_text_message PARAM',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        'Пример отправки обычного текстового сообщения с параметром "PARAM"',
    )

Пример вызова (call) с параметром

def param_call_buttons_example(bot, message):
    keyboard = keyboards.inline.Keyboard(
        buttons=[
            keyboards.inline.Button('Параметр ONE', 'put_on_me_params ONE'),
            keyboards.inline.Button('Параметр TWO', 'put_on_me_params TWO'),
        ],
        layout=layouts.Layout(columns_count=2)
    )
    message_with_text = messages.create_message('Кнопки для обработчика с параметром', sender=bot)
    message_with_keyboard = messages.add_keyboard(message_with_text, keyboard)
    return actions.send_message(message.chat, message_with_keyboard)


def put_button_param_handler(bot, message, param):
    reply_message = messages.create_message(
        text=f'Реакция на параметр {param}',
        sender=bot,
    )
    return actions.send_message(message.chat, reply_message)

Пример теста

def test_param_call_buttons_example(bot_client, chat):
    """
    Test /param_call_buttons: success
    """
    chat = asserts.assert_command_was_handled(
        '/param_call_buttons',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        'Кнопки для обработчика с параметром',
    )
    asserts.assert_chat_last_message_keyboard_len(chat, 2)

def test_put_button_param_handler(bot_client, chat):
    """
    Test button "put_on_me_params <str:param>": success
    """
    chat = asserts.assert_call_was_handled(
        'put_on_me_params PARAMPAM',
        chat,
        bot_client,
    )
    asserts.assert_chat_last_message_text_equal(
        chat,
        'Реакция на параметр PARAMPAM',
    )

Пример получения данных из чата с ботом

def get_chat_data_example(bot, message):
    chat = message.chat
    data = {
        'Данные чата': '',
        'id': chat.id,
        'type': chat.info.type,
        'title': chat.info.title,
    }
    data_list = [f'{k}: {v}' for k, v in data.items()]
    response_message_text = '\n'.join(data_list)
    response_message = messages.create_message(
        response_message_text,
        bot,
    )
    return actions.send_message(chat, response_message)

Пример теста

def test_get_chat_data_example(bot_client, chat):
    """
    Test /chat_data_example: success
    """
    chat = asserts.assert_command_was_handled(
        '/chat_data_example',
        chat,
        bot_client,
    )
    expected_response_text = 'Данные чата: \nid: 0\ntype: dummy\ntitle: None'
    asserts.assert_chat_last_message_text_equal(
        chat,
        expected_response_text,
    )