Skip to content

Commit 5d06df4

Browse files
committed
Pass successfully sent events through to on_success callback (closes #228)
1 parent daf681c commit 5d06df4

File tree

3 files changed

+51
-45
lines changed

3 files changed

+51
-45
lines changed

snowplow_tracker/emitters.py

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,15 @@ def http_post(self, data):
191191
"""
192192
logger.info("Sending POST request to %s..." % self.endpoint)
193193
logger.debug("Payload: %s" % data)
194-
r = requests.post(self.endpoint, data=data, headers={'Content-Type': 'application/json; charset=utf-8'})
195-
getattr(logger, "info" if self.is_good_status_code(r.status_code) else "warning")("POST request finished with status code: " + str(r.status_code))
196-
return r
194+
post_succeeded = False
195+
try:
196+
r = requests.post(self.endpoint, data=data, headers={'Content-Type': 'application/json; charset=utf-8'})
197+
post_succeeded= Emitter.is_good_status_code(r.status_code)
198+
getattr(logger, "info" if post_succeeded else "warning")("POST request finished with status code: " + str(r.status_code))
199+
except requests.RequestException as e:
200+
logger.warning(e)
201+
202+
return post_succeeded
197203

198204
@contract
199205
def http_get(self, payload):
@@ -203,9 +209,15 @@ def http_get(self, payload):
203209
"""
204210
logger.info("Sending GET request to %s..." % self.endpoint)
205211
logger.debug("Payload: %s" % payload)
206-
r = requests.get(self.endpoint, params=payload)
207-
getattr(logger, "info" if self.is_good_status_code(r.status_code) else "warning")("GET request finished with status code: " + str(r.status_code))
208-
return r
212+
get_succeeded = False
213+
try:
214+
r = requests.get(self.endpoint, params=payload)
215+
get_succeeded = Emitter.is_good_status_code(r.status_code)
216+
getattr(logger, "info" if get_succeeded else "warning")("GET request finished with status code: " + str(r.status_code))
217+
except requests.RequestException as e:
218+
logger.warning(e)
219+
220+
return get_succeeded
209221

210222
def sync_flush(self):
211223
"""
@@ -233,41 +245,33 @@ def send_events(self, evts):
233245
:type evts: list(dict(string:*))
234246
"""
235247
if len(evts) > 0:
236-
logger.info("Attempting to send %s requests" % len(evts))
248+
logger.info("Attempting to send %s events" % len(evts))
249+
237250
Emitter.attach_sent_timestamp(evts)
251+
success_events = []
252+
failure_events = []
253+
238254
if self.method == 'post':
239255
data = SelfDescribingJson(PAYLOAD_DATA_SCHEMA, evts).to_string()
240-
post_succeeded = False
241-
try:
242-
status_code = self.http_post(data).status_code
243-
post_succeeded = self.is_good_status_code(status_code)
244-
except requests.RequestException as e:
245-
logger.warning(e)
246-
if post_succeeded:
247-
if self.on_success is not None:
248-
self.on_success(len(evts))
249-
elif self.on_failure is not None:
250-
self.on_failure(0, evts)
256+
request_succeeded = self.http_post(data)
257+
if request_succeeded:
258+
success_events += evts
259+
else:
260+
failure_events += evts
251261

252262
elif self.method == 'get':
253-
success_count = 0
254-
unsent_requests = []
255263
for evt in evts:
256-
get_succeeded = False
257-
try:
258-
status_code = self.http_get(evt).status_code
259-
get_succeeded = self.is_good_status_code(status_code)
260-
except requests.RequestException as e:
261-
logger.warning(e)
262-
if get_succeeded:
263-
success_count += 1
264+
request_succeeded = self.http_get(evt)
265+
if request_succeeded:
266+
success_events += [evt]
264267
else:
265-
unsent_requests.append(evt)
266-
if len(unsent_requests) == 0:
267-
if self.on_success is not None:
268-
self.on_success(success_count)
269-
elif self.on_failure is not None:
270-
self.on_failure(success_count, unsent_requests)
268+
failure_events += [evt]
269+
270+
if self.on_success is not None and len(success_events) > 0:
271+
self.on_success(success_events)
272+
if self.on_failure is not None and len(failure_events) > 0:
273+
self.on_failure(len(success_events), failure_events)
274+
271275
else:
272276
logger.info("Skipping flush since buffer is empty")
273277

snowplow_tracker/test/integration/test_integration.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,13 @@ def test_integration_success_callback(self):
289289
t = tracker.Tracker([callback_emitter], default_subject)
290290
with HTTMock(pass_response_content):
291291
t.track_page_view("http://www.example.com")
292-
self.assertEqual(callback_success_queue[0], 1)
292+
expected = {
293+
"e": "pv",
294+
"url": "http://www.example.com",
295+
}
296+
self.assertEqual(len(callback_success_queue), 1)
297+
for k in expected.keys():
298+
self.assertEqual(callback_success_queue[0][0][k], expected[k])
293299
self.assertEqual(callback_failure_queue, [])
294300

295301
def test_integration_failure_callback(self):

snowplow_tracker/test/unit/test_emitters.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,11 @@ def mocked_flush(*args):
3939
def mocked_send_events(*args):
4040
pass
4141

42-
class MockRequest():
43-
def __init__(self, code):
44-
self.status_code = code
45-
4642
def mocked_http_success(*args):
47-
return MockRequest(200)
43+
return True
4844

4945
def mocked_http_failure(*args):
50-
return MockRequest(404)
46+
return False
5147

5248

5349
class TestEmitters(unittest.TestCase):
@@ -229,7 +225,7 @@ def test_send_events_get_success(self, mok_http_get):
229225

230226
evBuffer = [{"a":"aa"}, {"b": "bb"}, {"c": "cc"}]
231227
e.send_events(evBuffer)
232-
mok_success.assert_called_once_with(3)
228+
mok_success.assert_called_once_with(evBuffer)
233229
mok_failure.assert_not_called()
234230

235231
@mock.patch('snowplow_tracker.Emitter.http_get')
@@ -255,7 +251,7 @@ def test_send_events_post_success(self, mok_http_post):
255251

256252
evBuffer = [{"a":"aa"}, {"b": "bb"}, {"c": "cc"}]
257253
e.send_events(evBuffer)
258-
mok_success.assert_called_once_with(3)
254+
mok_success.assert_called_once_with(evBuffer)
259255
mok_failure.assert_not_called()
260256

261257
@mock.patch('snowplow_tracker.Emitter.http_post')
@@ -318,7 +314,7 @@ def test_async_send_events_get_success(self, mok_http_get):
318314

319315
evBuffer = [{"a":"aa"}, {"b": "bb"}, {"c": "cc"}]
320316
ae.send_events(evBuffer)
321-
mok_success.assert_called_once_with(3)
317+
mok_success.assert_called_once_with(evBuffer)
322318
mok_failure.assert_not_called()
323319

324320
@mock.patch('snowplow_tracker.Emitter.http_get')
@@ -344,7 +340,7 @@ def test_async_send_events_post_success(self, mok_http_post):
344340

345341
evBuffer = [{"a":"aa"}, {"b": "bb"}, {"c": "cc"}]
346342
ae.send_events(evBuffer)
347-
mok_success.assert_called_once_with(3)
343+
mok_success.assert_called_once_with(evBuffer)
348344
mok_failure.assert_not_called()
349345

350346
@mock.patch('snowplow_tracker.Emitter.http_post')

0 commit comments

Comments
 (0)