Skip to main content

test your python-telegram-bot easily

Project description

Unit-tests for python-telegram-bot.

How it works

This is a first version of library

Only long polling mode supported!

Library starts your python-telegram-bot object with custom url (our unit-test server on Flask running under waitress). Now you can communicate in unit-tests with your bot as you do in Telegram.

Features

  1. send text message

  2. send command

  3. send file

  4. receive file

Fixtures

user

User object to send messages and check incoming messages from your bot

bot

Your bot object. See ‘Using’

Echo Bot example

Check echo of Echo Bot from python-telegram-bot example.

def test_echobot_message(bot, user):
    user.send_message('testing message')
    message = user.get_message()
    assert message['text'] == 'testing message'

Check /start command of Echo Bot

def test_echobot_start(bot, user):
    user.send_command('/start')
    message = user.get_message()
    assert message['text'] == 'Hi [FN LN](tg://user?id=1)\!'

File Bot example

Bot renames file you send to him.

def test_echobot_file(bot, user):
    current_dir = os.path.dirname(os.path.abspath(__file__))

    user.send_document(current_dir, 'test.txt')

    document = user.get_document()

    file_io = document.path_or_bytes
    assert file_io.name == 'echo_test.txt'

    content = io.TextIOWrapper(file_io, encoding='utf-8').read()
    assert content == 'Hello world!\nHello world!'

Installing

You can install or upgrade telegram-bot-unittest with:

$ pip install telegram-bot-unittest --upgrade

Or you can install from source with:

$ git clone https://github.com/dontsovcmc/telegram-bot-unittest --recursive
$ cd telegram-bot-unittest
$ python setup.py install

Using

1. Create non-bloking function ‘setup_bot’ that runs your bot. We need to separate updater.idle() and creating Updater().

def setup_bot(bot_token: str, base_url: str = None) -> Updater:

    updater = Updater(bot_token, base_url=base_url)

    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("help", help_command))
    dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))
    updater.start_polling()

    return updater

def main(base_url: str = None) -> None:

    updater = setup_bot(BOT_TOKEN, base_url)
    updater.idle()
  1. Add fixture ‘bot’ to you fixture.py file. Example:

import pytest
from <your module> import <start_bot_function>
from telegram_bot_unittest.routes import TELEGRAM_URL
from telegram_bot_unittest.user import BOT_TOKEN

@pytest.fixture(scope='session')
def bot(telegram_server):
    updater = start_bot_function(BOT_TOKEN, TELEGRAM_URL)
    yield updater.bot
    updater.stop()
  1. add ‘telegram_bot_unittest.fixtures’ to ‘pytest_plugins’ list in conftest.py

  2. Add fixture ‘bot’ to you test functions.

  3. Enjoy!

Contributing

Contributions of all sizes are welcome.

License

You may copy, distribute and modify the software provided that modifications are described and licensed for free under LGPL-3. Derivatives works (including modifications or anything statically linked to the library) can only be redistributed under LGPL-3, but applications that use the library don’t have to be.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

telegram-bot-unittest-0.4.zip (21.2 kB view hashes)

Uploaded Source

Built Distribution

telegram_bot_unittest-0.4-py3-none-any.whl (14.6 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page