From a2d8ca366389f78210ccf5ab2788deb5a61f4979 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Fri, 25 Dec 2015 23:28:07 +0200 Subject: [PATCH 01/10] some errors are prefixed with '[Error]: ' - strip that down use custom _lstrip_str() func instead of regex. a little performance improvment and (IMO) a bit more readable. --- telegram/error.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/telegram/error.py b/telegram/error.py index fe557771b..b24bffc8d 100644 --- a/telegram/error.py +++ b/telegram/error.py @@ -18,7 +18,22 @@ """This module contains a object that represents a Telegram Error""" -import re + +def _lstrip_str(in_s, lstr): + """ + Args: + in_s (str): in string + lstr (str): substr to strip from left side + + Returns: + str: + + """ + if in_s.startswith(lstr): + res = in_s[len(lstr):] + else: + res = in_s + return res class TelegramError(Exception): @@ -26,16 +41,20 @@ class TelegramError(Exception): def __init__(self, message): """ + Args: + message (str): + Returns: - str: + """ super(TelegramError, self).__init__() - api_error = re.match(r'^Error: (?P.*)', message) - if api_error: - self.message = api_error.group('message').capitalize() - else: - self.message = message + msg = _lstrip_str(message, 'Error: ') + msg = _lstrip_str(msg, '[Error]: ') + if msg != message: + # api_error - capitalize the msg... + msg = msg.capitalize() + self.message = msg def __str__(self): return '%s' % (self.message) From 79f29c4b9e94d5623aa2f6f0dea23ba52cfc9166 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 00:34:26 +0200 Subject: [PATCH 02/10] properly handle utf-8 server response & identify json parsing errors refs #134 --- telegram/utils/request.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/telegram/utils/request.py b/telegram/utils/request.py index fb6b3e555..71ec0887a 100644 --- a/telegram/utils/request.py +++ b/telegram/utils/request.py @@ -45,7 +45,11 @@ def _parse(json_data): Returns: A JSON parsed as Python dict with results. """ - data = json.loads(json_data.decode()) + decoded_s = json_data.decode('utf-8') + try: + data = json.loads(decoded_s) + except ValueError: + raise TelegramError('Invalid server response; probably bad token') if not data.get('ok') and data.get('description'): return data['description'] From 21fdaa4ff76a7d2b4165b9449328c212845075f1 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 00:36:06 +0200 Subject: [PATCH 03/10] utils.request: decorate functions with general try... except... refs #134 --- telegram/utils/request.py | 73 +++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/telegram/utils/request.py b/telegram/utils/request.py index 71ec0887a..2182d9d7d 100644 --- a/telegram/utils/request.py +++ b/telegram/utils/request.py @@ -19,6 +19,7 @@ """This module contains methods to make POST and GET requests""" +import functools import json import socket from ssl import SSLError @@ -49,7 +50,7 @@ def _parse(json_data): try: data = json.loads(decoded_s) except ValueError: - raise TelegramError('Invalid server response; probably bad token') + raise TelegramError('Invalid server response') if not data.get('ok') and data.get('description'): return data['description'] @@ -57,6 +58,34 @@ def _parse(json_data): return data['result'] +def _try_except_req(func): + """Decorator for requests to handle known exceptions""" + @functools.wraps(func) + def decorator(*args, **kwargs): + try: + return func(*args, **kwargs) + except HTTPError as error: + if error.getcode() == 403: + raise TelegramError('Unauthorized') + if error.getcode() == 502: + raise TelegramError('Bad Gateway') + + try: + message = _parse(error.read()) + except ValueError: + message = 'Unknown HTTPError' + + raise TelegramError(message) + except (SSLError, socket.timeout) as error: + if "operation timed out" in str(error): + raise TelegramError("Timed out") + + raise TelegramError(str(error)) + + return decorator + + +@_try_except_req def get(url): """Request an URL. Args: @@ -71,6 +100,7 @@ def get(url): return _parse(result) +@_try_except_req def post(url, data, network_delay=2.): @@ -95,39 +125,22 @@ def post(url, else: timeout = None - try: - if InputFile.is_inputfile(data): - data = InputFile(data) - request = Request(url, - data=data.to_form(), - headers=data.headers) - else: - data = json.dumps(data) - request = Request(url, - data=data.encode(), - headers={'Content-Type': 'application/json'}) + if InputFile.is_inputfile(data): + data = InputFile(data) + request = Request(url, + data=data.to_form(), + headers=data.headers) + else: + data = json.dumps(data) + request = Request(url, + data=data.encode(), + headers={'Content-Type': 'application/json'}) - result = urlopen(request, timeout=timeout).read() - except HTTPError as error: - if error.getcode() == 403: - raise TelegramError('Unauthorized') - if error.getcode() == 502: - raise TelegramError('Bad Gateway') - - try: - message = _parse(error.read()) - except ValueError: - message = 'Unknown HTTPError' - - raise TelegramError(message) - except (SSLError, socket.timeout) as error: - if "operation timed out" in str(error): - raise TelegramError("Timed out") - - raise TelegramError(str(error)) + result = urlopen(request, timeout=timeout).read() return _parse(result) +@_try_except_req def download(url, filename): """Download a file by its URL. From aeca3ca174292ef3c477352ba6e7eb906855e1b7 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 01:10:15 +0200 Subject: [PATCH 04/10] basic token validation refs #134 --- telegram/bot.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/telegram/bot.py b/telegram/bot.py index eee2c41c9..fe6023b1f 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -52,7 +52,7 @@ class Bot(TelegramObject): def __init__(self, token, base_url=None): - self.token = token + self.token = self._valid_token(token) if base_url is None: self.base_url = 'https://api.telegram.org/bot%s' % self.token @@ -744,3 +744,11 @@ class Bot(TelegramObject): def __reduce__(self): return (self.__class__, (self.token, self.base_url.replace(self.token, ''))) + + @staticmethod + def _valid_token(token): + """a very basic validation on token""" + left, sep, _right = token.partition(':') + if (sep is None) or (not left.isdigit()) or (len(left) < 3): + raise TelegramError('Invalid token') + return token From 7734c1d6a60951378028f027deceb8d67f6b18a6 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 19:32:36 +0200 Subject: [PATCH 05/10] fix unitests to work with new token validator --- telegram/updater.py | 17 +++++++-- tests/test_bot.py | 14 ++++++++ tests/test_updater.py | 83 ++++++++++++++++++++----------------------- 3 files changed, 67 insertions(+), 47 deletions(-) diff --git a/telegram/updater.py b/telegram/updater.py index 0014e7764..932b8f377 100644 --- a/telegram/updater.py +++ b/telegram/updater.py @@ -64,15 +64,26 @@ class Updater: Attributes: Args: - token (str): The bots token given by the @BotFather + token (Optional[str]): The bot's token given by the @BotFather base_url (Optional[str]): workers (Optional[int]): Amount of threads in the thread pool for functions decorated with @run_async + bot (Optional[Bot]): + + Raises: + ValueError: If both `token` and `bot` are passed or none of them. """ - def __init__(self, token, base_url=None, workers=4): + def __init__(self, token=None, base_url=None, workers=4, bot=None): + if (token is None) and (bot is None): + raise ValueError('`token` or `bot` must be passed') + if (token is not None) and (bot is not None): + raise ValueError('`token` and `bot` are mutually exclusive') - self.bot = Bot(token, base_url) + if bot is not None: + self.bot = bot + else: + self.bot = Bot(token, base_url) self.update_queue = Queue() self.dispatcher = Dispatcher(self.bot, self.update_queue, workers=workers) diff --git a/tests/test_bot.py b/tests/test_bot.py index 6ffc0ee56..8c6d9949b 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -137,5 +137,19 @@ class BotTest(BaseTest, unittest.TestCase): self.assertTrue(self.is_json(upf.to_json())) self.assertEqual(upf.photos[0][0].file_size, 12421) + def _test_invalid_token(self, token): + print('Testing invalid token: {0}'.format(token)) + self.assertRaisesRegexp(telegram.TelegramError, 'Invalid token', telegram.Bot, token) + + def testInvalidToken1(self): + self._test_invalid_token('123') + + def testInvalidToken2(self): + self._test_invalid_token('12a:') + + def testInvalidToken3(self): + self._test_invalid_token('12:') + + if __name__ == '__main__': unittest.main() diff --git a/tests/test_updater.py b/tests/test_updater.py index 6adc7bd8b..e427511ee 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -38,7 +38,7 @@ except ImportError: sys.path.append('.') -from telegram import Update, Message, TelegramError, User, Chat, Updater +from telegram import Update, Message, TelegramError, User, Chat, Updater, Bot from telegram.dispatcher import run_async from tests.base import BaseTest from threading import Lock, Thread @@ -61,14 +61,18 @@ class UpdaterTest(BaseTest, unittest.TestCase): """ def setUp(self): - self.updater = Updater('', workers=2) - + self.updater = None self.received_message = None self.message_count = 0 self.lock = Lock() + def _setup_updater(self, *args, **kwargs): + bot = MockBot(*args, **kwargs) + self.updater = Updater(workers=2, bot=bot) + def tearDown(self): - self.updater.stop() + if self.updater is not None: + self.updater.stop() def reset(self): self.message_count = 0 @@ -119,8 +123,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_addRemoveTelegramMessageHandler(self): print('Testing add/removeTelegramMessageHandler') - bot = MockBot('Test') - self.updater.bot = bot + self._setup_updater('Test') d = self.updater.dispatcher d.addTelegramMessageHandler( self.telegramHandlerTest) @@ -132,13 +135,13 @@ class UpdaterTest(BaseTest, unittest.TestCase): d.removeTelegramMessageHandler(self.telegramHandlerTest) self.reset() - bot.send_messages = 1 + self.updater.bot.send_messages = 1 sleep(.1) self.assertTrue(None is self.received_message) def test_addTelegramMessageHandlerMultipleMessages(self): print('Testing addTelegramMessageHandler and send 100 messages...') - self.updater.bot = MockBot('Multiple', 100) + self._setup_updater('Multiple', 100) self.updater.dispatcher.addTelegramMessageHandler( self.telegramHandlerTest) self.updater.start_polling(0.0) @@ -148,8 +151,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_addRemoveTelegramRegexHandler(self): print('Testing add/removeStringRegexHandler') - bot = MockBot('Test2') - self.updater.bot = bot + self._setup_updater('Test2') d = self.updater.dispatcher regobj = re.compile('Te.*') self.updater.dispatcher.addTelegramRegexHandler(regobj, @@ -162,14 +164,13 @@ class UpdaterTest(BaseTest, unittest.TestCase): d.removeTelegramRegexHandler(regobj, self.telegramHandlerTest) self.reset() - bot.send_messages = 1 + self.updater.bot.send_messages = 1 sleep(.1) self.assertTrue(None is self.received_message) def test_addRemoveTelegramCommandHandler(self): print('Testing add/removeTelegramCommandHandler') - bot = MockBot('/test') - self.updater.bot = bot + self._setup_updater('/test') d = self.updater.dispatcher self.updater.dispatcher.addTelegramCommandHandler( 'test', self.telegramHandlerTest) @@ -181,14 +182,13 @@ class UpdaterTest(BaseTest, unittest.TestCase): d.removeTelegramCommandHandler('test', self.telegramHandlerTest) self.reset() - bot.send_messages = 1 + self.updater.bot.send_messages = 1 sleep(.1) self.assertTrue(None is self.received_message) def test_addRemoveUnknownTelegramCommandHandler(self): print('Testing add/removeUnknownTelegramCommandHandler') - bot = MockBot('/test2') - self.updater.bot = bot + self._setup_updater('/test2') d = self.updater.dispatcher self.updater.dispatcher.addUnknownTelegramCommandHandler( self.telegramHandlerTest) @@ -200,14 +200,13 @@ class UpdaterTest(BaseTest, unittest.TestCase): d.removeUnknownTelegramCommandHandler(self.telegramHandlerTest) self.reset() - bot.send_messages = 1 + self.updater.bot.send_messages = 1 sleep(.1) self.assertTrue(None is self.received_message) def test_addRemoveStringRegexHandler(self): print('Testing add/removeStringRegexHandler') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addStringRegexHandler('Te.*', self.stringHandlerTest) queue = self.updater.start_polling(0.01) @@ -225,8 +224,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_addRemoveStringCommandHandler(self): print('Testing add/removeStringCommandHandler') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addStringCommandHandler( 'test3', self.stringHandlerTest) @@ -246,8 +244,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_addRemoveUnknownStringCommandHandler(self): print('Testing add/removeUnknownStringCommandHandler') - bot = MockBot('/test') - self.updater.bot = bot + self._setup_updater('/test') d = self.updater.dispatcher d.addUnknownStringCommandHandler( self.stringHandlerTest) @@ -260,14 +257,13 @@ class UpdaterTest(BaseTest, unittest.TestCase): d.removeUnknownStringCommandHandler(self.stringHandlerTest) self.reset() - bot.send_messages = 1 + self.updater.bot.send_messages = 1 sleep(.1) self.assertTrue(None is self.received_message) def test_addRemoveErrorHandler(self): print('Testing add/removeErrorHandler') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addErrorHandler(self.errorHandlerTest) queue = self.updater.start_polling(0.01) @@ -286,8 +282,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_errorInHandler(self): print('Testing error in Handler') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addStringRegexHandler('.*', self.errorRaisingHandlerTest) @@ -300,8 +295,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_errorOnGetUpdates(self): print('Testing error on getUpdates') - bot = MockBot('', raise_error=True) - self.updater.bot = bot + self._setup_updater('', raise_error=True) d = self.updater.dispatcher d.addErrorHandler(self.errorHandlerTest) self.updater.start_polling(0.01) @@ -310,8 +304,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_addRemoveTypeHandler(self): print('Testing add/removeTypeHandler') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addTypeHandler(dict, self.stringHandlerTest) queue = self.updater.start_polling(0.01) @@ -330,8 +323,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_runAsync(self): print('Testing @run_async') - bot = MockBot('Test5', messages=2) - self.updater.bot = bot + self._setup_updater('Test5', messages=2) d = self.updater.dispatcher d.addTelegramMessageHandler( self.asyncHandlerTest) @@ -342,7 +334,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_additionalArgs(self): print('Testing additional arguments for handlers') - self.updater.bot = MockBot('', messages=0) + self._setup_updater('', messages=0) self.updater.dispatcher.addStringCommandHandler( 'test5', self.additionalArgsTest) @@ -354,8 +346,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_regexGroupHandler(self): print('Testing optional groups and groupdict parameters') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addStringRegexHandler('^(This).*?(?Pregex group).*', self.regexGroupHandlerTest) @@ -368,8 +359,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_runAsyncWithAdditionalArgs(self): print('Testing @run_async with additional parameters') - bot = MockBot('Test6', messages=2) - self.updater.bot = bot + self._setup_updater('Test6', messages=2) d = self.updater.dispatcher d.addTelegramMessageHandler( self.asyncAdditionalHandlerTest) @@ -380,8 +370,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_webhook(self): print('Testing Webhook') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addTelegramMessageHandler( self.telegramHandlerTest) @@ -442,8 +431,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_webhook_no_ssl(self): print('Testing Webhook without SSL') - bot = MockBot('', messages=0) - self.updater.bot = bot + self._setup_updater('', messages=0) d = self.updater.dispatcher d.addTelegramMessageHandler( self.telegramHandlerTest) @@ -485,7 +473,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_idle(self): print('Testing idle') - self.updater.bot = MockBot('Test6', messages=0) + self._setup_updater('Test6', messages=0) self.updater.start_polling(poll_interval=0.01) Thread(target=self.signalsender).start() self.updater.idle() @@ -494,6 +482,13 @@ class UpdaterTest(BaseTest, unittest.TestCase): self.updater.running = False + def test_mutualExclusiveTokenBot(self): + bot = Bot('123:zyxw') + self.assertRaises(ValueError, Updater, token='123:abcd', bot=bot) + + def test_noTokenOrBot(self): + self.assertRaises(ValueError, Updater) + class MockBot: def __init__(self, text, messages=1, raise_error=False): From 17dae686545ae7ece3a75f46ccc7a808927029eb Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 19:34:05 +0200 Subject: [PATCH 06/10] gitignore: files generated by unitests --- .gitignore | 7 +++++++ telegram/bot.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6f24ee0a7..6bf9c4b33 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,10 @@ target/ # Sublime Text 2 *.sublime* + +# unitests files +telegram.mp3 +telegram.mp4 +telegram.ogg +telegram.png +telegram.webp diff --git a/telegram/bot.py b/telegram/bot.py index fe6023b1f..e520cb5b4 100644 --- a/telegram/bot.py +++ b/telegram/bot.py @@ -749,6 +749,6 @@ class Bot(TelegramObject): def _valid_token(token): """a very basic validation on token""" left, sep, _right = token.partition(':') - if (sep is None) or (not left.isdigit()) or (len(left) < 3): + if (not sep) or (not left.isdigit()) or (len(left) < 3): raise TelegramError('Invalid token') return token From bc2679f2ae5607a2286e3966ad5d5ae0a414fcd2 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 01:11:02 +0200 Subject: [PATCH 07/10] utils.request: provide HTTP error code with unknown errors --- telegram/utils/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram/utils/request.py b/telegram/utils/request.py index 2182d9d7d..a81c04af8 100644 --- a/telegram/utils/request.py +++ b/telegram/utils/request.py @@ -73,7 +73,7 @@ def _try_except_req(func): try: message = _parse(error.read()) except ValueError: - message = 'Unknown HTTPError' + message = 'Unknown HTTPError {0}'.format(error.getcode()) raise TelegramError(message) except (SSLError, socket.timeout) as error: From 054c976ad6e93df8e466a5b3d3dd2b27c83c6f10 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Sat, 26 Dec 2015 14:15:24 +0200 Subject: [PATCH 08/10] add tsnoam to AUTHORS --- AUTHORS.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index b7d583161..cc898d1fc 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -19,6 +19,7 @@ The following wonderful people contributed directly or indirectly to this projec - `macrojames `_ - `naveenvhegde `_ - `njittam `_ +- `Noam Meltzer `_ - `Rahiel Kasim `_ - `sooyhwang `_ - `wjt `_ From 1c8bb217901ab3feda34f5bf52b1634e2e7e402d Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Thu, 31 Dec 2015 21:33:37 +0200 Subject: [PATCH 09/10] fix python 2.6 unitests which with the backport package unittest2 --- .travis.yml | 1 + tests/test_bot.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e5a204d01..0b683c68a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ python: install: - pip install pylint flake8 coveralls - pip install -r requirements.txt + - 'if [[ $TRAVIS_PYTHON_VERSION == 2.6 ]]; then pip install unittest2; fi' script: - nosetests --with-coverage --cover-package telegram/ - flake8 telegram diff --git a/tests/test_bot.py b/tests/test_bot.py index 8c6d9949b..47c2c9cc1 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -20,9 +20,14 @@ """This module contains a object that represents Tests for Telegram Bot""" import os -import unittest from datetime import datetime import sys + +if sys.version_info[0:2] == (2, 6): + import unittest2 as unittest +else: + import unittest + sys.path.append('.') import telegram From 5d168bd47969344b8ebbede3b52569047abf4826 Mon Sep 17 00:00:00 2001 From: Noam Meltzer Date: Thu, 31 Dec 2015 22:23:23 +0200 Subject: [PATCH 10/10] improve unitest coverage --- tests/test_bot.py | 14 ++++++++++++++ tests/test_updater.py | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/test_bot.py b/tests/test_bot.py index 47c2c9cc1..3bb18213b 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -155,6 +155,20 @@ class BotTest(BaseTest, unittest.TestCase): def testInvalidToken3(self): self._test_invalid_token('12:') + def testUnauthToken(self): + print('Testing unauthorized token') + with self.assertRaisesRegexp(telegram.TelegramError, 'Unauthorized'): + bot = telegram.Bot('1234:abcd1234') + bot.getMe() + + def testInvalidSrvResp(self): + print('Testing invalid server response') + with self.assertRaisesRegexp(telegram.TelegramError, 'Invalid server response'): + # bypass the valid token check + bot_cls = type('bot_cls', (telegram.Bot, ), {'_valid_token': lambda self, token: token}) + bot = bot_cls('12') + bot.getMe() + if __name__ == '__main__': unittest.main() diff --git a/tests/test_updater.py b/tests/test_updater.py index e427511ee..f73d1fa8d 100644 --- a/tests/test_updater.py +++ b/tests/test_updater.py @@ -22,7 +22,6 @@ This module contains a object that represents Tests for Updater, Dispatcher, WebhookServer and WebhookHandler """ import logging -import unittest import sys import re import os @@ -31,6 +30,11 @@ from random import randrange from time import sleep from datetime import datetime +if sys.version_info[0:2] == (2, 6): + import unittest2 as unittest +else: + import unittest + try: from urllib2 import urlopen, Request except ImportError: @@ -481,6 +485,9 @@ class UpdaterTest(BaseTest, unittest.TestCase): sleep(1) self.updater.running = False + def test_createBot(self): + updater = Updater('123:abcd') + self.assertIsNotNone(updater.bot) def test_mutualExclusiveTokenBot(self): bot = Bot('123:zyxw') @@ -489,6 +496,7 @@ class UpdaterTest(BaseTest, unittest.TestCase): def test_noTokenOrBot(self): self.assertRaises(ValueError, Updater) + class MockBot: def __init__(self, text, messages=1, raise_error=False):