Handle string datetime with datetime parser.

This commit is contained in:
Awais Jibran
2018-12-11 18:05:18 +05:00
committed by Calen Pennington
parent b05eac0b67
commit ddd69db7cf
2 changed files with 31 additions and 20 deletions

View File

@@ -1,9 +1,9 @@
"""Handle events that were forwarded from the Segment webhook integration"""
import datetime
import json
import logging
from dateutil import parser
from django.conf import settings
from django.contrib.auth.models import User
from django.http import HttpResponse
@@ -266,4 +266,4 @@ def _get_segmentio_event_name(event_properties):
def parse_iso8601_timestamp(timestamp):
"""Parse a particular type of ISO8601 formatted timestamp"""
return datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%fZ")
return parser.parse(timestamp)

View File

@@ -1,8 +1,7 @@
"""Ensure we can parse events sent to us from the Segment webhook integration"""
from datetime import datetime
import json
from dateutil import parser
from ddt import ddt, data, unpack
from mock import sentinel
@@ -36,6 +35,11 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
"""
shard = 3
def setUp(self):
super(SegmentIOTrackingTestCase, self).setUp()
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
def test_get_request(self):
request = self.request_factory.get(SEGMENTIO_TEST_ENDPOINT)
response = segmentio.segmentio_event(request)
@@ -88,7 +92,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
data=self.create_segmentio_event_json(data={'foo': 'bar'}, course_id=course_id),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
middleware.process_request(request)
# The middleware normally emits an event, make sure it doesn't in this case.
@@ -109,7 +112,7 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
'event': {'foo': 'bar'},
'agent': str(sentinel.user_agent),
'page': None,
'time': datetime.strptime("2014-08-27T16:33:39.215Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
'time': parser.parse("2014-08-27T16:33:39.215Z"),
'host': 'testserver',
'context': {
'application': {
@@ -129,7 +132,7 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
'version': '1.0.1',
},
},
'received_at': datetime.strptime("2014-08-27T16:33:39.100Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
'received_at': parser.parse("2014-08-27T16:33:39.100Z"),
},
}
finally:
@@ -142,7 +145,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
data=self.create_segmentio_event_json(course_id='invalid'),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
segmentio.track_segmentio_event(request)
self.assert_events_emitted()
@@ -154,7 +156,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
data=json.dumps(sample_event_raw),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
segmentio.track_segmentio_event(request)
@@ -166,7 +167,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
data=json.dumps(sample_event_raw),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
segmentio.track_segmentio_event(request)
@@ -177,7 +177,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
data=json.dumps(sample_event_raw),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
segmentio.track_segmentio_event(request)
@@ -188,7 +187,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
data=json.dumps(sample_event_raw),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
segmentio.track_segmentio_event(request)
@@ -203,17 +201,32 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
return event
def test_string_user_id(self):
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
self.post_segmentio_event(user_id=str(SEGMENTIO_TEST_USER_ID))
self.assert_events_emitted()
@data(
'2018-12-11T07:27:28.015900357Z',
'2014-08-27T16:33:39.100Z',
'2014-08-27T16:33:39.215Z'
)
def test_timestamp_success(self, timestamp):
sample_event_raw = self.create_segmentio_event()
sample_event_raw['receivedAt'] = timestamp
sample_event_raw['timestamp'] = timestamp
request = self.create_request(
data=json.dumps(sample_event_raw),
content_type='application/json'
)
response = segmentio.segmentio_event(request)
self.assertEquals(response.status_code, 200)
self.assert_events_emitted()
def test_hiding_failure(self):
sample_event_raw = self.create_event_without_fields('timestamp')
request = self.create_request(
data=json.dumps(sample_event_raw),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
response = segmentio.segmentio_event(request)
self.assertEquals(response.status_code, 200)
@@ -259,7 +272,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
}),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
middleware.process_request(request)
try:
@@ -277,7 +289,7 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
'name': name,
'agent': str(sentinel.user_agent),
'page': 'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity',
'time': datetime.strptime("2014-08-27T16:33:39.215Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
'time': parser.parse("2014-08-27T16:33:39.215Z"),
'host': 'testserver',
'context': {
'user_id': SEGMENTIO_TEST_USER_ID,
@@ -298,7 +310,7 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
'version': '29',
'component': 'videoplayer'
},
'received_at': datetime.strptime("2014-08-27T16:33:39.100Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
'received_at': parser.parse("2014-08-27T16:33:39.100Z"),
},
'event': {
'currentTime': 132.134456,
@@ -393,7 +405,6 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
),
content_type='application/json'
)
User.objects.create(pk=SEGMENTIO_TEST_USER_ID, username=str(sentinel.username))
middleware.process_request(request)
try:
@@ -411,7 +422,7 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
'name': expected_name,
'agent': str(sentinel.user_agent),
'page': 'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity',
'time': datetime.strptime("2014-08-27T16:33:39.215Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
'time': parser.parse("2014-08-27T16:33:39.215Z"),
'host': 'testserver',
'context': {
'user_id': SEGMENTIO_TEST_USER_ID,
@@ -432,7 +443,7 @@ class SegmentIOTrackingTestCase(SegmentIOTrackingTestCaseBase):
'version': version,
'component': 'videoplayer'
},
'received_at': datetime.strptime("2014-08-27T16:33:39.100Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
'received_at': parser.parse("2014-08-27T16:33:39.100Z"),
},
'event': {
"code": "mobile",