X Tutup
Skip to content

Commit 7d39e1b

Browse files
committed
updater: more unitests for webookhandler
1 parent d415a60 commit 7d39e1b

File tree

1 file changed

+82
-39
lines changed

1 file changed

+82
-39
lines changed

tests/test_updater.py

Lines changed: 82 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,20 @@
3030
from random import randrange
3131
from time import sleep
3232
from datetime import datetime
33+
from future.builtins import bytes
3334

3435
if sys.version_info[0:2] == (2, 6):
3536
import unittest2 as unittest
3637
else:
3738
import unittest
3839

3940
try:
40-
from urllib2 import urlopen, Request
41+
# python2
42+
from urllib2 import urlopen, Request, HTTPError
4143
except ImportError:
44+
# python3
4245
from urllib.request import Request, urlopen
46+
from urllib.error import HTTPError
4347

4448
sys.path.append('.')
4549

@@ -399,9 +403,9 @@ def test_webhook(self):
399403
d.addTelegramMessageHandler(
400404
self.telegramHandlerTest)
401405

402-
# Select random port for travis
403-
port = randrange(1024, 49152)
404-
self.updater.start_webhook('127.0.0.1', port,
406+
ip = '127.0.0.1'
407+
port = randrange(1024, 49152) # Select random port for travis
408+
self.updater.start_webhook(ip, port,
405409
url_path='TOKEN',
406410
cert='./tests/test_updater.py',
407411
key='./tests/test_updater.py')
@@ -417,34 +421,19 @@ def test_webhook(self):
417421
update = Update(1)
418422
update.message = message
419423

420-
try:
421-
payload = bytes(update.to_json(), encoding='utf-8')
422-
except TypeError:
423-
payload = bytes(update.to_json())
424-
425-
header = {
426-
'content-type': 'application/json',
427-
'content-length': str(len(payload))
428-
}
429-
430-
r = Request('http://127.0.0.1:%d/TOKEN' % port,
431-
data=payload,
432-
headers=header)
433-
434-
urlopen(r)
424+
self._send_webhook_msg(ip, port, update.to_json(), 'TOKEN')
435425

436426
sleep(1)
437427
self.assertEqual(self.received_message, 'Webhook Test')
438428

439429
print("Test other webhook server functionalities...")
440-
request = Request('http://localhost:%d/webookhandler.py' % port)
441-
response = urlopen(request)
430+
response = self._send_webhook_msg(ip, port, None, 'webookhandler.py')
442431
self.assertEqual(b'', response.read())
443432
self.assertEqual(200, response.code)
444433

445-
request.get_method = lambda: 'HEAD'
434+
response = self._send_webhook_msg(ip, port, None, 'webookhandler.py',
435+
get_method=lambda: 'HEAD')
446436

447-
response = urlopen(request)
448437
self.assertEqual(b'', response.read())
449438
self.assertEqual(200, response.code)
450439

@@ -460,9 +449,9 @@ def test_webhook_no_ssl(self):
460449
d.addTelegramMessageHandler(
461450
self.telegramHandlerTest)
462451

463-
# Select random port for travis
464-
port = randrange(1024, 49152)
465-
self.updater.start_webhook('127.0.0.1', port)
452+
ip = '127.0.0.1'
453+
port = randrange(1024, 49152) # Select random port for travis
454+
self.updater.start_webhook(ip, port)
466455
sleep(0.5)
467456

468457
# Now, we send an update to the server via urlopen
@@ -473,23 +462,77 @@ def test_webhook_no_ssl(self):
473462
update = Update(1)
474463
update.message = message
475464

476-
try:
477-
payload = bytes(update.to_json(), encoding='utf-8')
478-
except TypeError:
479-
payload = bytes(update.to_json())
465+
self._send_webhook_msg(ip, port, update.to_json())
466+
sleep(1)
467+
self.assertEqual(self.received_message, 'Webhook Test 2')
468+
469+
def test_webhook_invalid_posts(self):
470+
self._setup_updater('', messages=0)
471+
472+
ip = '127.0.0.1'
473+
port = randrange(1024, 49152) # select random port for travis
474+
thr = Thread(target=self.updater._start_webhook,
475+
args=(ip, port, '', None, None))
476+
thr.start()
480477

481-
header = {
482-
'content-type': 'application/json',
483-
'content-length': str(len(payload))
478+
sleep(0.5)
479+
480+
try:
481+
with self.assertRaises(HTTPError) as ctx:
482+
self._send_webhook_msg(ip, port,
483+
'<root><bla>data</bla></root>',
484+
content_type='application/xml')
485+
self.assertEqual(ctx.exception.code, 403)
486+
487+
with self.assertRaises(HTTPError) as ctx:
488+
self._send_webhook_msg(ip, port, 'dummy-payload',
489+
content_len=-2)
490+
self.assertEqual(ctx.exception.code, 403)
491+
492+
# TODO: prevent urllib or the underlying from adding content-length
493+
# with self.assertRaises(HTTPError) as ctx:
494+
# self._send_webhook_msg(ip, port, 'dummy-payload',
495+
# content_len=None)
496+
# self.assertEqual(ctx.exception.code, 411)
497+
498+
with self.assertRaises(HTTPError) as ctx:
499+
self._send_webhook_msg(ip, port, 'dummy-payload',
500+
content_len='not-a-number')
501+
self.assertEqual(ctx.exception.code, 403)
502+
503+
finally:
504+
self.updater._stop_httpd()
505+
thr.join()
506+
507+
def _send_webhook_msg(self, ip, port, payload_str, url_path='',
508+
content_len=-1, content_type='application/json',
509+
get_method=None):
510+
headers = {
511+
'content-type': content_type,
484512
}
485513

486-
r = Request('http://127.0.0.1:%d/' % port,
487-
data=payload,
488-
headers=header)
514+
if not payload_str:
515+
content_len = None
516+
payload = None
517+
else:
518+
payload = bytes(payload_str, encoding='utf-8')
519+
520+
if content_len == -1:
521+
content_len = len(payload)
489522

490-
urlopen(r)
491-
sleep(1)
492-
self.assertEqual(self.received_message, 'Webhook Test 2')
523+
if content_len is not None:
524+
headers['content-length'] = str(content_len)
525+
526+
url = 'http://{ip}:{port}/{path}'.format(ip=ip, port=port,
527+
path=url_path)
528+
529+
req = Request(url, data=payload, headers=headers)
530+
531+
532+
if get_method is not None:
533+
req.get_method = get_method
534+
535+
return urlopen(req)
493536

494537
def signalsender(self):
495538
sleep(0.5)

0 commit comments

Comments
 (0)
X Tutup