Skip to content

Commit e987130

Browse files
Handle exceptions in event dispatcher (#30)
1 parent 2db23ae commit e987130

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

optimizely/event_dispatcher.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import json
2+
import logging
23
import requests
34

5+
from requests import exceptions as request_exception
6+
47
from .helpers import enums
58

69
REQUEST_TIMEOUT = 10
@@ -15,7 +18,11 @@ def dispatch_event(event):
1518
Args:
1619
event: Object holding information about the request to be dispatched to the Optimizely backend.
1720
"""
18-
if event.http_verb == enums.HTTPVerbs.GET:
19-
requests.get(event.url, params=event.params, timeout=REQUEST_TIMEOUT)
20-
elif event.http_verb == enums.HTTPVerbs.POST:
21-
requests.post(event.url, data=json.dumps(event.params), headers=event.headers, timeout=REQUEST_TIMEOUT)
21+
22+
try:
23+
if event.http_verb == enums.HTTPVerbs.GET:
24+
requests.get(event.url, params=event.params, timeout=REQUEST_TIMEOUT)
25+
elif event.http_verb == enums.HTTPVerbs.POST:
26+
requests.post(event.url, data=json.dumps(event.params), headers=event.headers, timeout=REQUEST_TIMEOUT)
27+
except request_exception.RequestException as error:
28+
logging.error('Dispatch event failed. Error: %s' % str(error))

tests/test_event_dispatcher.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import mock
22
import json
33
import unittest
4+
from requests import exceptions as request_exception
45

56
from optimizely import event_builder
67
from optimizely import event_dispatcher
@@ -43,3 +44,25 @@ def test_dispatch_event__post_request(self):
4344
mock_request_post.assert_called_once_with(url, data=json.dumps(params),
4445
headers={'Content-Type': 'application/json'},
4546
timeout=event_dispatcher.REQUEST_TIMEOUT)
47+
48+
def test_dispatch_event__handle_request_exception(self):
49+
""" Test that dispatch event handles exceptions and logs error. """
50+
51+
url = 'https://www.optimizely.com'
52+
params = {
53+
'accountId': '111001',
54+
'eventName': 'test_event',
55+
'eventEntityId': '111028',
56+
'visitorId': 'oeutest_user'
57+
}
58+
event = event_builder.Event(url, params, http_verb='POST', headers={'Content-Type': 'application/json'})
59+
60+
with mock.patch('requests.post',
61+
side_effect=request_exception.RequestException('Failed Request')) as mock_request_post,\
62+
mock.patch('logging.error') as mock_log_error:
63+
event_dispatcher.EventDispatcher.dispatch_event(event)
64+
65+
mock_request_post.assert_called_once_with(url, data=json.dumps(params),
66+
headers={'Content-Type': 'application/json'},
67+
timeout=event_dispatcher.REQUEST_TIMEOUT)
68+
mock_log_error.assert_called_once_with('Dispatch event failed. Error: Failed Request')

0 commit comments

Comments
 (0)